读程序并回答问题。# include <stdio.h>void main(){ int m[12],k; int *p[3],sum=0; for(k=0;k<12;k++) { m[k]=2*k; if(k<3) p[k]=m+2*k*k; } for(k=0;k<3;k++) sum+=(*(p+k))[4-k]; printf("%d\n",sum);}① 程序的运行结果是( 38 )。38 (A) 18 (B) 28 (C) 38 (D) 8② int *p[3]定义的是( 39 )。39 (A) 指针数组 (B) 指向函数的指针(C) 指向一维数组的指针 (D) 指向指针的指针关键是p和k之间是怎么建立关系的啊,我没看出来他们之间如何建立连接的啊,麻烦高手详解,谢谢哈
首先m[12]={0,2,4,6,8,10,12,14,16,18,20,22}语句if(k<3) p[k]=m+2*k*k;的计算过程序,当k=0时,p[0]=m也就是指针p[0]指向的是数组m的开始当k=1时,p[1]=m+2;因此p[1]指向m+2的位置,也就是从数字4开始的位置当k=2时,p[2]=m+8;因此p[1]指向m+8开始的位置,也就是&m[8]开始的位置,即数组m中的第9个元素的地址,也就是16再来看for中循环语句中的指针表达式,首先下标运算符p[k]是与*(p+k)等价的,(*(p+k))[4-k];=(p[k])[4-k] =*(p[k]+4-k) //注意这一步,不能把括号折开来算,而应按p[k]与*(p+k)等 价的替换来计算,不然在某些地方会出错。=*(&p[k][0]+4-k) //在计算地址相加时,应把p[k]这样的式子转换为前面带有 &地址运算符的表达式才能直接相加,否则会出错,因为 p[k]就是指的p[k][0]的地址,因此应这样换算=*(&p[k][4-k]) //这里就可以地址直接相加了=p[k][4-k] //这是最后结果。上面的计算如果你的理解能力强,你也可以用文字去描术,什么指针偏移多少个单位,又指向哪里,这样来描术,但本人认为文字描术容易出错,因此采用数学的计算方法,科学,安全,不易错。再来看p[k][4-k]究竟是什么,当k=0时,就是p[0][4-0]因此,因为p[0]是指向的数组m的开始,因此p[0][4]就是指的数组中下标为4的元素,也就是8当k=1时,就是p[1][4-1]=p[1][3],因为p[1]是指向的数组m+2以数字4开始的位置,因此p[1][3]就是指的从4的位置起(4的下标对于指针p[1]来讲为0),向后的下标为3的位置的元素,也就是10当k=2时,就是p[2][4-2]结果就是m+8开始的下标为2的元素的值,就是20因此最后sum的值是8+10+20=38
值 : 0 2 4 6 8 10 12 14 16 18 20 22数组:m[0] m[1] m[2] m[3] m[4] m[5] m[6] m[7] m[8] m[9] m[10] m[11]指针 p[0] p[1] p[2]以上是参考图,先解释一下,首先p[k]=m+2*k*k ,m是数组首地址m+2*k*k 相当于m[2*k*k],一次将地址付给p[3],p[0]指向m[0],一次类推。p[3]为指针数组,也就是说数组每个元素都是一个指针。现在解释 sum+=(*(p+k))[4-k];(p+k)相当于p[k].(*(p+k))[4-k];在p[4]的基础上向后面移动(4-k)步指针。例如 (*(p+0))[4-0];相当于p[0]所指的m[0]向后移动4步到m[4]为8 。依次类推,sum=8+10+20=38希望能帮助你!