指针与数组
比方说: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;后面部分是正确的应该是哪个意思; 展开
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;后面部分是正确的应该是哪个意思; 展开
展开全部
语句没错误,第一个输出是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却要将指针移动这么多呢?对数组名取&,导致这个指针移动的时候以行为单位移动。
第一个应该不用解释
第二个:因为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却要将指针移动这么多呢?对数组名取&,导致这个指针移动的时候以行为单位移动。
展开全部
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 ;
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 ;
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询