C语言指针问题
main(){inta[2][3]={{3,2,7},{4,8,6}};int*p,m;p=&a[0][0];m=(*p)*(*(p+2))*(*(p+4));print...
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[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));
这一句解释 展开
6个回答
展开全部
解释上面的都说得清楚了。
这个得给你补补基础:
由于二维数组的逻辑结构是一维空间,存储结构是二维空间,因此可以分别按照存储结构和逻辑结构定义指向二维数组的指针.
二维数组是按行优先的规律转换为一维线性存放在内存中的,因此,可以通过指针访问二维数组中的元素。
如果有: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
这个得给你补补基础:
由于二维数组的逻辑结构是一维空间,存储结构是二维空间,因此可以分别按照存储结构和逻辑结构定义指向二维数组的指针.
二维数组是按行优先的规律转换为一维线性存放在内存中的,因此,可以通过指针访问二维数组中的元素。
如果有: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
展开全部
分成这三块
(*p) 取内容 .................a[0][0]
(*(p+2)) p是数组首元素地址,+2的意义是:移动2个p所指类型元素的长度,及移动到a[0][2]=3
(*(p+4)) 同上, 但已经移动到数组的第二行了,是a[1][1]=8 , 最后三块相乘
二维数组在内存中是按行顺序存储的。。。
(*p) 取内容 .................a[0][0]
(*(p+2)) p是数组首元素地址,+2的意义是:移动2个p所指类型元素的长度,及移动到a[0][2]=3
(*(p+4)) 同上, 但已经移动到数组的第二行了,是a[1][1]=8 , 最后三块相乘
二维数组在内存中是按行顺序存储的。。。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
m=a[0][0]*a[0][2]*a[1][1]
即
m=3*7*8
你看一下教程中数组的指针表达就懂了
即
m=3*7*8
你看一下教程中数组的指针表达就懂了
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
p是指向二维数组中单个元素的指针,所以*p和*(p+2)和*(p+4)分别是取二维数组第一个、第三个和第五个元素的值,即:3,7,8。然后几个数一相乘就得到最后的结果了。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
p指向的值乘以p+2指向的值再乘以p+4指向的值
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询