第一个题目应该这样理解,首先a是一个二维数组,第一维可以认为为指针,指向字符串(或字符数组),Teacher按道理后面应该有个\0,不过这个在初始赋值时应该被覆盖了,而且变成连续的了,其长度若按字符串(strlen)理解确实大于7(为10),按数组理解当然不能超过7了,但是打印的时候是按字符串打印的。 这种初始化算是一种不正确的初始化,应该尽量避免。
所以p+3可以理解为p现在指向第一维的字符串偏移为3的位置处。
第二个题目主要是考虑运算符结合的优先级别的。
(*p)[7],首先是一个指针,他指向数组,这个数组有7个元素。他每次加1相当于加了数组长度7*(sizeof(数组元素类型))。而a此时可以认为数组指针,类型相同,不过a为常量,p为变量。
明显,你现在还没有输出GOOD! ,想输出很简单
printf("%s\n%s\n",a[0],++p);
printf("%s\n",++p);
*p[7],首先是一个数组,他的元素是7个指针。这个可以简单的认为7个连续的指针。
这样应该算是清楚了。。。。
char a[][7]申请的是连续的一块内存,程序是不会检查数组是否越界的,因为teacher无\0而tom有,所以不输出good
char[][7]={"Teacher","Tom","Good"};
这个变量名也没有,就是有变量名,也会报错的
error: initializer-string for array of chars is too long
不知道,你编译过没,答案怎么出来的。
char[][7]={"Teacher","Tom","Good"};
这个只是初始化,按照规定进行存储!我们计算机会在大二开“数据结构”这门课,讲述的就是怎样存储数据!
存储为
T e a c h e r
T o m \0 \0 \0 \0
G o o d \0 \0 \0
char *p=a[0];
p指针指向T,printf(“%s”,p);是字符串输出,直到遇到\0停止。当字符串没有终止符时,向后寻找,直到找到\0为止。
p定义为char *p=a[0]类型,所以p=p+1,就是p指向下一个char内容!
char (*p)[7]是定义指向字符数组的指针,p=p+1,p指向跳过后面7个char类型的数,即p=&a[1][0];
char *p[7]是定义连续的7个指针的一维数组,即p[0]=&a[0][0],p[1]=&a[0][1]。
所以第二题为
TeacherTom
Tom
其实您已经接近答案了。
char a[][7]={"Teacher","Tom","Good"};在内存中的布局是:
'T''e''a''c''h''e''r''T''o''m''\0'(然后三个位置没有用)'G''o''o''d''\0'(然后2个位置没有用)
为什么能初始化,因为编译器不会检查您赋值的边界问题,它只会检查您的语法是否符合语义要求。
所以输出a[0]的话就会输出TeacherTom,因为r后面没有'\0',会继续输出,直到'\0',而Tom的m后面刚好有'\0',所以输出上述答案就是正确的了。
p=p+3,所以p指向Teacher中的'c'所以输出p会输出cherTom。答案是ok的。
char (*p)[7]是指p指向一个有7个元素的数组,而
char *p[7]是指一个数组有7个元素,每个元素都是指向char值的char*指针。