c语言学习笔记二
一维数组的定义方法
arr[N] = {};
arr[] = {1, 1, 1, 1, 1};
arr[10] = {0};
二维数组的定义方法
arr[][10] = {0};
arr[][3] = {1, 2, 3, 4, 5, 6, 7, 8, 9};
arr[10][3] = {};
指针数组 *p[9]
数组指针 (*p)[n]
指针函数 char * sum(void *)
函数指针 char (*aum)(int )
函数指针数组 char (*sum [10]) (int)
指针函数数组指针 char * (*a)[10] (int)
二维数组指针的移动 arr[3][4] *p = arr 指向二维数组第一个元素的地址
arr 是一个地址常量 arr++ 报错
指针函数与函数指针的区别?
指针函数是一个返回值为指针类型的函数,本质是一个函数,指针函数一定有返回值,而且必须用一个同类型的指针来接收返回值,返回值是一个地址。
-
如果我要是用一个其他类型的指针来接受返回值,会怎么样?
如果是类型不同的话,会出现精度的缺失,如果函数返回值指针是int 类型的,但是接收的是char * 类型的,则最大的数不能超过char类型的最大值。
在gcc编译工具中,char a = 255的printf值是-1;
而且类型需要兼容,比如char类型的不能接受char **类型的返回值。 -
指针函数应用时的可能错误
我们说函数运行结束后会销毁所有的局部数据,这个观点并没错,但是,这里所谓的销毁并不是将局部数据所占用的内存全部抹掉,而是程序放弃对它的使用权限,弃之不理,后面的代码可以随意使用这块内存。如果使用及时也能够得到正确的数据,如果有其它函数被调用就会覆盖这块内存,得到的数据就失去了意义。
函数指针是指向一个函数的指针,本质是指针。
一个函数总是占用一段连续的内存区域,函数名在表达式中有时也会被转换为该函数所在内存区域的首地址,这和数组名非常类似。我们可以把函数的这个首地址(或称入口地址)赋予一个指针变量,使指针变量指向函数所在的内存区域,然后通过指针变量就可以找到并调用该函数。这种指针就是函数指针。
//定义函数指针
int (*pmax)(int, int) = max; //也可以写作int (*pmax)(int a, int b)
函数指针的定义形式为:
returnType (*pointerName)(param list);
returnType 为函数返回值类型,pointerName 为指针名称,param list 为函数参数列表。参数列表中可以同时给出参数的类型和名称,也可以只给出参数的类型,省略参数的名称,这一点和函数原型非常类似。
注意( )的优先级高于*,第一个括号不能省略,如果写作returnType *pointerName(param list);就成了函数原型,它表明函数的返回值类型为returnType *。
查看程序各个段的大小,使用size命令
size <程序名>