如果有int a[5][6],(*p)[3];p=a;存不存在p[4]呢?p[2],*(p+2),p[1]+1都表示什么呢?

 我来答
百度网友6567883c53
2012-12-25 · TA获得超过4737个赞
知道大有可为答主
回答量:1260
采纳率:0%
帮助的人:1473万
展开全部

楼主你好。

测试代码:

#include <stdio.h>

void main(){

int a[5][6]={1,2,3,4,5,6,7,8,9,10,11,12},(*p)[3];

p=a;

printf("a=%d, *a=%d, **a=%d, p=%d, *p=%d, p[0]=%d\n",a,*a,**a,p,*p,p[0]);

printf("a[0]数组的长度为%d, *p数组的长度为:%d\n",sizeof(a[0])/sizeof(int),sizeof(*p)/sizeof(int));

printf("p[1]=%d, *(p+1)=%d, p+1=%d\n",p[1],*(p+1),p+1);

printf("p[4]=%d, p[2]=%d, *(p+2)=%d, p[1]+1=%d,&a[1][1]=%d\n",p[4],p[2],*(p+2),p[1]+1,&a[1][1]);

printf("p[2]=%d, &a[2][0]=%d\n",p[2],&a[2][0]);

printf("(*p)[10]=%d, *p[1]=%d\n",(*p)[10],*p[1]);

}



运行结果:




首先你要理解:

int (*p)[3]是指p是一个指针,它指向一个含有三个int元素的一维数组。

而int *p[3]是指p是一个数组,其中有三个指向int元素的指针。


还有你要理解p[n]就是*(p+n)。


对于int (*p)[3],p是一个指向数组的指针,因此p相当于二维数组的首地址。

*p或p[0]就是p指向的那个数组的地址,它的类型为int[3],其实是a[0]的地址【注意a[0]其实是有6个元素,但是编译器只是认为*p有三个元素】。

p[2]就要在p[0]的基础上加上sizeof(int)*3*2=4*3*2=24(也就是两个int[3]数组的长度),如图中为1244904,【含义就是p[2]在p[0]的基础上向后偏移2个int[3]数组的长度】,p[4]在p[2]的基础上加24,如图中为1244928。


*(p+2)等效于p[2]。


p[1]的值为1244904-sizeof(int)*3=1244892,p[1]的类型为int*,因此p[1]+1=p[1]+sizeof(int*)=1244892+4=1244896.


事实上洛雨曦1125说的都是错的。。。并不是黑他,而是怕误人子弟。

也更正一下White_MouseYBZ的说法,p=a这句话可以通过编译,因为编译器是只认为p指向了一个有三个元素一维数组,也就是说p是一个指针,因此只要对p赋指针值即可,并没有那么多限制。

White_MouseYBZ
2012-12-25 · TA获得超过4万个赞
知道大有可为答主
回答量:2.1万
采纳率:82%
帮助的人:8173万
展开全部
int a[5][6],(*p)[3];p=a;中p=a一句显然是不能通过编译的。a是二维数组,每行有6个元素,而p只能指向有3个元素的数组。要想用指针操作a,得将(*p)[3]改为(*p)[6]——即p是一个指针,指向一个有6个int元素的数组!当这样改后,当然存在p[4]、p[2]……甚至p[10000]。但要注意p[5](含)以后全是野指针……
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
洛雨曦1125
2012-12-25 · TA获得超过1345个赞
知道小有建树答主
回答量:295
采纳率:100%
帮助的人:117万
展开全部
p=a 表示p指向了二维数组中的行,a里边包括5行,所以存在p[4]这个元素它指行的是第五行
p[2]就等价于是a[2]即第二行的首地址也就是说是a[2][0]的地址
*(p+2) p+2是p[[2]的地址,因此*(p+2)就等价于p[2]
p[1]+1指的是第1行第1列元素的地址即a[1][1]的地址

若不明白再问
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
bengek
2012-12-25 · TA获得超过381个赞
知道小有建树答主
回答量:1228
采纳率:57%
帮助的人:610万
展开全部
指针和数组差不多。。你这个是1维的。等于a的话应该也是只有第一排的。你程序测试下。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(2)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

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

类别

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

说明

0/200

提交
取消

辅 助

模 式