下面代码的输出()
int main() { int a[5] = {1, 2, 3, 4, 5}; int *ptr = (int*)(&a + 1); printf("%d, %d", *(a + 1), *(ptr - 1)); return 0; }
A. 1, 1 B. 1, 3
C. 3, 3 D. 2, 5
在C语言中,数组名`a` 和取地址后的`&a` 含义是不同的: -
数组名`a`的本质:`a` 本质上是数组首元素的地址,它的类型是 `int*` 。所以当执行 `a + 1` 时,根据指针运算规则,它会向后移动一个 `int` 类型的大小,指向数组的下一个元素。例如`a` 指向 `a[0]`,`a + 1` 指向 `a[1]`。
`&a`的本质:`&a`表示的是整个数组的地址,它的类型是 `int (*)[5]` ,这是一种数组指针类型 。指针进行算术运算时,移动的字节数是根据指针所指向的数据类型大小来计算的。对于`&a` ,其指向的数据类型是包含5个`int` 元素的数组,所以`&a + 1` 会跳过整个包含5个`int` 元素的数组,也就是移动 `5 * sizeof(int)` 个字节。
`(int*)(&a + 1)` 则是把跳过整个数组后的地址,强制转换为普通的 `int*` 类型指针,然后赋值给 `ptr` 。这样`ptr` 就指向了数组`a` 末尾之后的内存位置,再通过 `ptr - 1` 就能访问到数组`a` 的最后一个元素 。
数组名a是和&a[0]是一样的,都代表指向第一个数组元素的指针,类型为int 。所以对a + 1,就是对int 的指针进行偏移。 而&a是代表指向数组的指针,类型为int ()[5] 。那么对&a+1,偏移肯定就按数组指针的偏移大小5来算。
w123d123d123 回复 aaasss: 为什么类型是int()【5】啊
WXUN 回复 aaasss: &a + 1 将这个指针向后移动一个整数数组的大小,这即移动了5个整数的大小。
D
题目解析:
a 为...
用户登录可进行刷题及查看答案
a 为 int 型数组首地址,数组长度为 5,a + 1 表示 a[1] 的地址。
&a 可以理解为表示一个列数为 5 的 int 型二维数组的首地址,那么 &a + 1 表示列为 5 的 int 型二维数组第 1 行首地址,
然后转为 int 型指针赋值给 ptr,可以理解为 ptr 为 a[5] 的地址(可以这么理解,实际不存在 a[5]),
ptr - 1 即为 a[4] 的地址。因此正确答案为 D。
登录后提交答案