C语言里面的指针确实有些难理解,我感觉用文字很难说清楚,直接用代码解释更清楚明白!
编译环境:win7 64位,Dev-C++(MinGW 32位C编译器,使用C89 C90的标准)
//函数指针
int (*a)(int);
//函数指针数组
int (*b[10])(int);
//函数指针,返回int指针
int *(*c)(int);
void main(){
int i;
int * a1[10];
int *(*a2)[10] = &a1;
//a2的理解其实和a6一样,只不过最终的元素类型不一样,为了操作方便,还是主要测试a6
int **b1[10];
int ***b2 = b1;//b1 b2的区别是++等
int a3[10];
int *a4 = a3;//a3 a4的区别就是指针操作,比如++的结果可能不一样
int **a5 = &a4;
int (*a6)[10] = &a3;//a5 a6的区别 也是指针操作不一样
//难理解的是s6,分析s6很简单,但是怎么操作呢,请看后面的打印
char *s1[10] = {
"abc",
"def"
};
char **s2 = {
"abc",
"def"
};//这样定义编译不会报错,但是怎么操作s2呢?
for (i = 0; i < 10; ++i)
{
a3[i] = i;
//a6肯定是一个数组,既然是数组,一定可以用数组的操作方式([])操作
//a6[i] = a3 + 1; 编译不过
}
printf("%d\n", *(a6[0]));//
printf("%d\n", **a6);//
printf("%d\n", a3[5]);
printf("%d\n", *(a6[5]));// 输出的随机数,错误
printf("%d\n", (*a6)[5]);// 输出的是5,正确
//从打印结果可以看到,a6其实就是a3的一个指针(a3本身也是一个指针),不信看下面的测试
(*a6)[6] = 888;
printf("%d\n", a3[6]);//输出888
//我不知道还有没有a6的其他独有操作方法,如果没有我觉得就完全没必要写a6这种代码
printf("*(a3 + 6) ---- %d\n", *(a3 + 6));// 输出888,正常,a3+1最终值 = a3 + sizeof(int)/机器位数
printf("*((*a6) + 6) ---- %d\n", *((*a6) + 6));//意料之中,输出888
printf("*(a6 + 6) ---- %d\n", *(a6 + 6);// 随机数
printf("**(a6 + 6) ---- %d\n", **(a6 + 6));// 0 不懂意义
printf("%s\n", s1[0]);
printf("%s\n", *s2);//这里会运行错误
printf("%s\n", s2[0]);//这里会运行错误
}