数组a总共12个元素,
for循环为p[0] = &a[0];
p[1] = &a[3];
p[2] = &a[6];
p[3] = &a[9];
这相当于把a分成了一个四行三列的二维数组,第一行的行地址为&a[0],元素有1,2,3。第二行的行地址为&a[3],元素有4,5,6...以此类推,p[3][2]就相当于问第四行第三列的元素是什么,显然是12.
基础知识没掌握好,做的时候还想着a的长度不是3吗,这6个元素肯定越界了啊!
其实数组a就相当于a[3]={ {5,&a[1]},{7,&a[2]},{9,NULL} };
*p=&a,相当于*p=&a[0],所以一开始指针p指向数组第一个元素。
a中一共三个节点,第一个节点是a[0],它的值为5,指针为&a[1],指向数组中的第二个元素a[1],即{7,&a[2]},它指向第三个节点a[2],值为9,指针空,所以a[2]在最后。
这样就知道第二个节点的值是7了。
A.p->next指向a[1],所以p->next->n就是a[1]的值,7.
B. ->的优先级大于++,所以相当于++(p->n),这个输出等于6.
C. 这个输出是5,p此时指向数组的第一个元素。
D. p->n为5,(p->n)++的值就是6.
正确答案是A
【正确答案】第一个空:**q
第二个空:q = &language[k]; 或者 q = language+k;
首先看到题要清楚,language是指针数组,里面的5个元素都是指针变量,他们的值是字符型数据的地址,他们分别指向{"BASIC", "FORTRAN", "PROLOG", "JAVA", "C++"}这五个字符串。
从倒数第二句printf("%s",*q);可以知道q一定也是一个指针变量,指向某个变量。
不难看出printf("%s\n", language[k]);这一句可以达到相同的效果,这就相当于*q==language[k],即*q中存储的是一个地址,即*q指向一个指针变量,那*q就是一个指针了。
一个指向指针的指针肯定就是二级指针了!所以应该这么定义:char **q;
不懂的话也可以结合一级指针再仔细想想,比如说,
int *i; int num; i=#
此时i中存储的是num的地址,i是一个指针,那么定义的时候i前面肯定有一个*。二级指针同理。
ps.我已经尽力解释的清楚一点了,要是哪里有错误请各位大佬轻喷^_^