C语言指针数组问题 求高手详解

读程序并回答问题。
# 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
温馨提示:答案为网友推荐,仅供参考
第1个回答  2010-04-13
值 : 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
希望能帮助你!
相似回答