指向数组的指针问题:如果 int (*p)[4] = m;表示的是什么意思? 如果Int *p = &m[0][0];int *p = m[0];

intm[2][4]={{01,02,03,04},{3,2,5,7}};如果int(*p)[4]=m;表示的是什么意思?如果Int*p=&m[0][0];int*p=m... int m[2][4]={
{01,02,03,04},
{3,2,5,7}
};
如果 int (*p)[4] = m;表示的是什么意思?
如果Int *p = &m[0][0];int *p = m[0];是什么意思?
这些表达示有什么区别或是联系。
int m[2][4]; int (*p)[3]=m和int *(p)[4]=m有什么区别,好像测试是没什么区别的
展开
 我来答
郁_诗
2013-02-27 · TA获得超过493个赞
知道小有建树答主
回答量:155
采纳率:100%
帮助的人:207万
展开全部
额,一楼说得有些不对.
m是个二维数组,由两个一维数组m[0]和m[1]组成.

对于int (*p)[4] = m:
int (*p)[4]这声明解析出来就是: p是个指针,指向一个数组,这数组有4个元素,该元素为int.
简洁点说就是p为指向有4个int类型元素的数组, 即p为数组指针.
而数组名即指针,m也可以说是指向有4个int类型元素的数组,即m和p是同类指针,所以可以进行赋值.
再具体点说, m是指向m[0]这个一维数组的,所以"int (*p)[4] = m;"执行后,p也就指向了m[0]了,此时,*p,p[0],m[0],*m这4个是等价的; (*p)[0],p[0][0],(*m)[0],m[0][0]这4个是等价的.

对于int *p = &m[0][0]:
地址即指针,指针即地址,所以"&m[0][0]"是个指向int型的指针.
数组是线性存储的,即m这个二维数组,从其第一个元素到最后一个元素的内存地址,是按sizeof(int)进行逐级递增的,所以执行"int *p = &m[0][0];"后,p指向了m这个二维数组的第一个元素,则有下列等价关系: p[n]=m[n/4][n%4];(0<=n<=7),如p[7]和m[1][3]是等价的.(不要说p[7]这样表达已经越界,是不合法的."[]"是数组运算符,p[7]会被编译器解释为*(p+7),而p+7明显是指向m这个二维数组的第7个元素,并没有指向数组外的内存,所以是合法的)

对于int *p = m[0]:
这个和第二种情况一样,因为m[0]是指针,其指向m[0][0].而"&m[0][0]"也是指针,也指向m[0][0],所以这两个指针完全等价.
追问
还有一个不懂的,int m[2][4];   int (*p)[3]=m和int *(p)[4]=m有什么区别,好像测试是没什么区别的,求解释,谢了
追答
看下面这程序咯:
#include
int main(void){
int m[2][4] = {0, 1, 2, 3, 4, 5, 6, 7};
int (*p)[3] = m;
int (*q)[4] = m;

printf("p[1][0]=%d, q[1][0]=%d\n", p[1][0], q[1][0]);
return 0;
}
运行后输出:
p[1][0]=3, q[1][0]=4

上面这程序中,p是指向有三个int型数组的指针,q是指向有4个int型数组的指针
而p[1][0] = *(*(p+1)+0),q[1][0]=*(*(q+1)+0), 这两者区别在于p+1与q+1的不同 .
p+1,指针是向后移动3个单位,q+1则是4个
打死小胖nice
2013-02-25 · TA获得超过143个赞
知道答主
回答量:101
采纳率:0%
帮助的人:31.4万
展开全部
int (*p)[4]其实类似于int p[][4],int *p就是一个指针,取了m[0][0]的地址,而对于二维数组,m[0]也是一个地址,是二维数组第一列的首地址,其实跟&m[0][0]是一样的地址
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式