读书人

C/C++练习 - 数组 , 指针取址

发布时间: 2012-12-23 11:28:15 作者: rapoo

C/C++习题 - 数组 , 指针,取址

题目:
#include <stdio.h>
void main(){
?int a[5]={1,2,3,4,5};
?int *ptr=(int *)(&a+1);
?printf("%d,%d",*(a+1),*(ptr-1));
?return;
}

?

解答:
首先要理解几个概念:
a??????? :? 一维数组名,可以标示数组的首地址.? [ 可以理解为指针常量,不是指针变量 ]
&a[0]? :? 第一元素的首地址。
&a????? :? 对一位数组取址, 系统会认为吧这个数组整体当一个元素而得到的指针,指针的的首地址没有变。
??????????? 但是当做 +1 地址运算的时候,是直接一这个数组为元素向后移动指针的。
??????????? 所以 (&a+1)操作的话,实际相当于 &a[0] + 5 == &a[5] .

所以,题目中 *(a+1) 等于 a[1] ,即2 。? *(ptr) 等于 *(a+5), *(ptr-1) 等于 *(a+4) ,即a[4], 值为5.

?

补充观察:
#include <stdio.h>
void main(){
?int a[5]={1,2,3,4,5};
?printf("%d,",a);
?printf("%d,",a+1);
?printf("%d,",&a);
?printf("%d,",&a+1);
?return;
}
输出: 1245024,1245028, 1245024,1245044.
因为在Win32系统里面,sizeof(int)=4 , 占4个字节 . 5个元素占20个字节。

?

?

读书人网 >C++

热点推荐