1. c语言中不常见的符号的优先级:
(1). 符号.的优先级高于符号*,所以*p.f应该写作(*p).f。
(2). 符号[]的优先级高于符号*,所以int *p[]和int (*p)[]是两种不同的数组,前者是int *类型的数组而后者是int型数组(该数组是二维数组)。
int a = 1;
int *b = &a;
int c[2][2] = {{2,3},{4,5}};
int *p[2] = {&a,b};
int (*op)[2];
op = c;
printf( "数组p里面保存的元素是指针地址:%d %d\n", p[0], p[1] );
printf( "数组p里面的指针元素所指向的内容:%d %d\n",*p[0], *p[1] );
printf( "数组op实际上是一个n行2列的二维数组的指针:%d %d\n", op[0], op[1] );
(3). 符号()的优先级高于符号*,所以int *f()是一个名为f且返回指针是int *类型变量的函数,int (*f)()是一个函数的指针。
(4). 符号==和!=的优先级高于赋值语句。
2. c里面一些生僻的声明:
(1). int (* f())()一个返回类型为函数指针的函数。
(2). int (* f())[m]返回一个n行m列数组的指针,即int (*)[]类型变量。
(3). int (* f[])()是一个数组,一个保存返回值为int类型且参数为空的函数的函数指针的数组。
3. 函数指针:
(1). 函数指针的作用:
作为参数传递给其他函数
作为函数的返回值
保存在数组之中
指向另外一个函数
调用底层函数
(2). 函数指针应该和它所指向的函数是兼容的,函数指针声明的具体格式为“指向函数返回值类型 (*f)(指向函数的参数)”。
(3). 指针赋值方式:
显式转换:f = &func;(func是函数,f为函数指针)
隐式转换:f = func;
(4). 指针函数的调用:
显示调用:*f();
隐式调用:f();