指针的指针
int i;
int *pi;
int **ppi;
printf("%d\n",ppi);
如果ppi
是一个自动变量,它就未被初始化,这条语句打印一个随机值,如果是静态变量,它将被初始化为0
ppi = π
这条语句把ppi初始化为指向变量pi,pi是一个指针变量,因此ppi
是指向pi
的指针
*ppi
访问pi
的地址值
**ppi
访问 pi
的值 也就是 *pi
*ppi = &i;
这条语句 把变量i的地址赋给了*ppi
, 而 *ppi
实际上就是pi
地址
经过上述的赋值后,这三个变量的关系就变为了
i = 1
pi = &i
即i
的地址 *pi = i = 1
*ppi = &pi
即pi的地址
**ppi = *pi = i = 1
高级声明
int f;
整型
int *f;
整型指针
int f, *f;
整型和整型指针
int f();
函数类型 返回值是整型
int *f();
括号运算符的优先级高于间接访问操作符,因此这是一个:函数类型 返回值是整型指针
int (*f)()
这里有两对括号,第2个括号是函数调用操作符,第1个括号只起到聚组的作用。它迫使间接访问操作符在函数调用之前进行,使得f成为一个指针,返回值是int
程序中每个函数都位于内存中的某个位置。所以存在指向那个位置的指针是完全可能的。
int *(*f)()
函数指针,返回值是int型指针
inf *f[]
这里有两个操作符,下标优先级更高,所以f
首先是一个数组,它的元素是指向整形的指针。
inf (*f[])()
这里有两对括号,具有不同的含义。
括号内的表达式*f[]首先进行求值
[] 优先级大于 * 所以 f首先是一个数组,它的元素是指向某种类型的指针。
表达式末尾调用() 是函数调用的操作符,所以f是一个数组,数组元素类型是函数指针
int *(*f[])()
函数数组,返回值是int 型指针