C语言的int (*a)[10]等指针问题理解

来源:互联网 发布:淘宝官方客服电话400 编辑:程序博客网 时间:2024/04/30 04:47


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一样,只不过最终的元素类型不一样,为了操作方便,还是主要测试a6int **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));//意料之中,输出888printf("*(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]);//这里会运行错误 }


0 0
原创粉丝点击