标C编程笔记day06 动态分配内存、函数指针、可变长度参数

动态分配内存:头文件 stdlib.h
    malloc:分配内存
    calloc:分配内存,并清零
    realloc:调整已分配的内存块大小
    示例:
        int *p=(int *) malloc(3*sizeof(int));//分配内存,成功返回首地址,失败返回NULL
        free(p);p=NULL;//释放分配的内存,并修改指针的值,避免出现野指针(指向一个地址,但地址已被回收)
const 与指针:
    const int *p; //指针可变,指针对应的数据不可修改
    int * const p; //指针不可变,指针对应的数据可修改
    const int * const p; //指针不可变,指针对应的数据不可修改

指向函数的指针:
    int add(int a,int b){return a+b;}
    int mul(int a,int b){return a*b;}
    int (*a) (int ,int )=NULL; //定义函数类型指针
    int sum;
    a=add;
    sum=a(3,4);//7
    a=mul;
    sum=a(3,4);//12
    typedef int (*pa)(int,int) pa1,pa2; //定义函数类型指针
    pa1=add;
    pa2=mul;
    sum=pa1(3,4);//7
    sum=pa2(3,4);//12

可变长度参数的使用:头文件 stdarg.h
    int max(int count,...)//count为后面参数的个数,不确定多少个
    {
        va_list v;
        va_start(v,count);
        for(int i=0;i<count;i++)
        {
            int argi=va_arg(v,int);//取出各参数的值
        }
        va_end(v);
    }

时间: 2024-09-20 00:17:54

标C编程笔记day06 动态分配内存、函数指针、可变长度参数的相关文章

关于c++的中函数指针作为参数的问题

问题描述 关于c++的中函数指针作为参数的问题 函数实现 void swap(int &a, int &b) { int tmp = a; a = b; b = tmp; } 函数使用: int i=1,j=2: swap(i,j): 如上所示,swap函数传递进来的是两个整形变量的地址,有两个问题 1.那么swap的实现里面,为什么直接交换a,b的值就实现了地址交换?难道这里的a,b代表指针吗? 2.使用swap时为什么没有使用swap(&i,&j)? 初学c++,还望大

非递归二叉树遍历-c语言中函数指针作为参数与函数的嵌套

问题描述 c语言中函数指针作为参数与函数的嵌套 函数指针作为另一函数的参数和函数的嵌套的区别,感觉都是调用,有什么不一样呢?他们都适用在什么情况下!(我是在学非递归遍历二叉树时看到的) Status Visit(TElemType e){ printf("%cn",e); return OK; } Status InOrderTraverse(BiTree T ,Status(*Visit)(TElemType e)){ SqStack S; InitStack(S); Push(S,

指针数组,数组指针,函数指针,main函数实质,二重指针,函数指针作为参数,泛型函数

 1.指针数组    数组里面的每个元素都是指针.    指针数组的案例如下:    易犯错误: 2.数组指针   归根结底还是指针,只是取*的时候能够取出一整个数组出来. 数组指针:(一个指针指向了数组,一般和二维数组搭配使用). 下面的(p+1)表示的是加过20个字符.   3.函数指针: 在gcc编译的时候增加一些调试信息的方式是: gcc demo.c –g –o app   -g表示增加一些调试信息 objdump –dSsx app > file   将app反汇编,然后重定向到

标C编程笔记day05 函数声明、文件读写、联合类型、枚举类型

函数声明:     1.隐式声明:在没有声明的情况下,系统可根据参数类型判断去调用函数(有可能出错)     2.显式声明:声明在被调用之前,如:double add(double,double);  函数声明参数可只写类型,不需要写函数体. 文件操作:     fopen  --打开文件,FILE *pFile=fopen("a.txt","w");         fopen的打开模式:             r:只能读,要求文件存在             

标C编程笔记day01~day03 变量、运算符、指针、函数、输入输出

c/c++语法,运算符:     sizeof()  --参数为变量或类型,计算变量或类型的字节大小     a==b?c:d  --三目运算符,a==b时,返回c,否则返回d     算术运算符:+,-,*,/,%     自加.自减运算:++,--     位运算:         ~ --取反,正数取反为 -(n+1) ,负数取反为 n-1         & --与,两个同为1才为1,否则为0         | --或,两个同为0才为0,否则为1         ^ --异或,两个相同

C++MFC编程笔记day06 MFC向导、MFC绘图类使用

 MFC绘图    MFC绘图类包括绘图设备类和绘图对象类    1 绘图设备类      CDC类-父类是CObject,封装的是一般的绘图设备,例如:显示器,            打印机等.      CWindowDC类-父类是CDC类,封装的是窗口对象,包括客户区和非            客户区.      CClientDC类-父类是CDC类,封装的仍然是窗口,但是只包括客户区.      CPaintDC类-父类是CDC类,封装的是窗口的客户区.但是,它只用           

C++windows内核编程笔记day06 代码创建菜单

创建菜单: HMENU CreateMenu(VOID); 添加菜单项: BOOL AppendMenu(  HMENU hMenu,         // handle to menu   UINT uFlags,         // menu-item options   UINT_PTR uIDNewItem, // identifier, menu, or submenu   LPCTSTR lpNewItem    // menu-item content   );  uFlags:

标C编程笔记day04 预处理、宏定义、条件编译、makefile、结构体使用

预处理:也就是包含需要的头文件,用#include<标准头文件>或#include "自定义的头文件" 宏定义,如:#define PI 3.1415926 查看用宏定义的值替换宏名称,如:gcc -E test.c 带参数的宏:MAX(x,y) (x)>(y)?((x):(y))   //使用方法与函数一样 宏运算:     #define PRINT(n) printf(#n"=%d",n)   //#n 就是把传入的变量值作为字符串放在那里

详解C语言编程中的函数指针以及函数回调_C 语言

函数指针: 就是存储函数地址的指针,就是指向函数的指针,就是指针存储的值是函数地址,我们可以通过指针可以调用函数. 我们先来定义一个简单的函数: //定义这样一个函数 void easyFunc() { printf("I'm a easy Function\n"); } //声明一个函数 void easyFunc(); //调用函数 easyFunc(); //定义这样一个函数 void easyFunc() { printf("I'm a easy Function\n