【发布时间】:2021-12-23 13:37:34
【问题描述】:
假设我们有
int x = 4;
int *ptr = &x;
我希望ptr[0] 会是ptr,ptr[1] 会是ptr + 1,等等。但是,发生了完全不同的事情。我跑了
#include <stdio.h>
int main()
{
int x = 4;
int* ptr;
ptr = &x;
//ptr vs ptr[0]
printf("ptr: %p\n\n", ptr);
printf("ptr[0]: %p\n\n", ptr[0]);
//ptr + 1 vs ptr[1]
printf("ptr + 1: %p\n\n", ptr + 1);
printf("ptr[1]: %p\n\n", ptr[1]);
//ptr + 5 vs ptr[5]
printf("ptr + 5: %p\n\n", ptr + 5);
printf("ptr[5]: %p\n\n", ptr[5]);
}
结果是
ptr: 0115FBF4
ptr[0]: 00000004
ptr + 1: 0115FBF8
ptr[1]: CCCCCCCC
ptr + 5: 0115FC08
ptr[5]: 00000001
【问题讨论】:
-
如果你已经完成了
ptr与&ptr[0]、&ptr[1]、&ptr[5]等,你会看到更符合你预期的东西。 -
@SteveSummit 比你发人深省的评论。我运行它,发现
ptr + 1与&ptr[1]相同。但这给我带来了另一个困惑。ptr[1]只是从地址ptr + 1开始的 4 个连续字节的内容。所以我希望执行&ptr[1]与执行&6之类的操作相同,这会导致错误。