C语言指针问题

main( )
{ int a[2][3]={{3,2,7},{4,8,6}};
int *p,m;
p=&a[0][0];
m=(*p)*(*(p+2))*(*(p+4));
printf(“m=%d”,m);}

m=(*p)*(*(p+2))*(*(p+4));
这一句解释

解释上面的都说得清楚了。
这个得给你补补基础:
由于二维数组的逻辑结构是一维空间,存储结构是二维空间,因此可以分别按照存储结构和逻辑结构定义指向二维数组的指针.
二维数组是按行优先的规律转换为一维线性存放在内存中的,因此,可以通过指针访问二维数组中的元素。
如果有:int a[M][N];
则将二维数组中的元素a[i][j]转换为一维线性地址的一般公式是:
线性地址=a+i×M+j
其中:a为数组的首地址, M和N分别为二维数组行和列的元素个数。
若有:int a[2][3], *p;
p = &a[0][0];

一样的 <BR>int a[3][4];

int * p = a;

然后p+((i)*4+j)
就是指向的是a[i][j] 这个元素
相当于p+X,这个X就是从a[0][0]元素开始加到指定X的位置的元素,先行,再列。
所以:*p = a[0][0];
*(p+2) = a[0][2];
*(p+4) =a[1][1];

所以结果就是m=a[0][0]*a[0][2]*a[1][1]

m=3*7*8
m = 168
温馨提示:答案为网友推荐,仅供参考
第1个回答  2011-01-19
分成这三块
(*p) 取内容 .................a[0][0]
(*(p+2)) p是数组首元素地址,+2的意义是:移动2个p所指类型元素的长度,及移动到a[0][2]=3
(*(p+4)) 同上, 但已经移动到数组的第二行了,是a[1][1]=8 , 最后三块相乘
二维数组在内存中是按行顺序存储的。。。
第2个回答  2011-01-19
m=a[0][0]*a[0][2]*a[1][1]

m=3*7*8
你看一下教程中数组的指针表达就懂了
第3个回答  2011-01-19
看着累,我绝不这么写代码
第4个回答  2011-01-19
p是指向二维数组中单个元素的指针,所以*p和*(p+2)和*(p+4)分别是取二维数组第一个、第三个和第五个元素的值,即:3,7,8。然后几个数一相乘就得到最后的结果了。
第5个回答  2011-01-19
p指向的值乘以p+2指向的值再乘以p+4指向的值
相似回答