第一组
1、int *a[10]
这是个指针数组,数组a中有10个整型的指针变量。因为它是个数组,则它占40个字节
2、int (*a)[10]
数组指针变量,它是个指针变量。占4个字节,存地址编号。它指向一个数组,它加1的话,指向下一个数组。
3、int **p
这是个指针的指针,保存指针变量的地址,经常用来保存指针的地址。
常见用法1
int **p;
int *q;
p = &q;
常见用法2
int **p;
int *q[10];
分析:q为指针数组的名字,是指针数组的首地址,是q[0]的地址,q[0]是个int *类型的指针。
所以q[0]指针变量的地址是int **类型的。p=&q[0];等价于p=q;
示例代码:
#include <stdio.h>
void fun(char **p) {
for(int i = 0; i < 3; i++) {
printf("%s\n",p[i]); // *(p+i)
}
}
int main() {
char *q[3] = {"hello", "world", "China"};
fun(q);
return 0;
}
第二组
1、int *f(void)
注意:*f没有用括弧括起来
它是个函数的声明,声明的这个函数返回值为int *类型的。
2、int (*f)(void)
注意:*f用括弧括起来了,*修饰f,说明f是个指针变量。
f是个函数指针变量,存放函数的地址,它指向的函数必须有一个int类型的返回值,没有参数。