指针与数组

比方说:inta[5]={1,2,3,4,5};int*ptr=(int*)&a;printf("%d",*ptr);int*pt=(int*)(&a+1);printf... 比方说:
int a[5] = {1,2,3,4,5};
int *ptr = (int *) &a ;
printf("%d",*ptr);
int *pt = (int *) (&a + 1);
printf("%d",*(pt - 1));
这个输出地是什么?怎么解释?
我在vc6.0下编译 int *ptr = (int *)&a;是没有错的,最后输出的是1;后面部分是正确的应该是哪个意思;
展开
 我来答
冰蓝焰色C9
2010-12-05 · 超过20用户采纳过TA的回答
知道答主
回答量:99
采纳率:0%
帮助的人:46.3万
展开全部
语句没错误,第一个输出是1,第二个输出是5.
第一个应该不用解释
第二个:因为pt指向的是&a+1,这里就是要搞清楚a+1和&a+1的区别了。首先a本身就是一个地址,而且是数组的第一个元素的地址,a+1就是指针向右移动一个数据单元,也就是指向了第二个元素的地址了。
但是现在是&a+1,对于数组而言,&a仍然还是第一个元素的地址,但是后面的+1就不一样了,这个+1仍然是向右移动一个数据单元,但是这个数据单元是以行为单位。现在这个数组一行有五个元素,那么+1之后指针就会跳过这五个元素,指向a[5]右边的那个数据单元。当然这个数据单元已经在数组之外了,但是从逻辑上说可以相当于a[6],也就是说现在pt指向a[6],然后要输出的是*(pt-1),所以输出5.
为什么在这里只是+1却要将指针移动这么多呢?对数组名取&,导致这个指针移动的时候以行为单位移动。
sun_siliang
2010-12-05 · TA获得超过2.6万个赞
知道大有可为答主
回答量:9913
采纳率:100%
帮助的人:4457万
展开全部
int a[5] = {1,2,3,4,5};
int *ptr = (int *) &a ;//错误!改为:int (*ptr)[5] = &a;
printf("%d",*ptr); //建议改为:printf("%d",ptr[0][1]); 将输出2

int a[5] = {1,2,3,4,5};
int *pt = (int *) (&a + 1);//pt指向下行地址,位置在元素5后面
printf("%d",*(pt - 1));//pt-1指向元素5,这儿输出5

补充:
int *ptr = (int *) &a ;//编译可以通过,但写成这样不是更好int *ptr = a ;
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

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

类别

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

说明

0/200

提交
取消

辅 助

模 式