我在 C99 标准中读到数组是如何扩展的,但我无法理解为什么它会起作用。如果我有
a[5]
并且 a 是一个整数,那么这不是访问第二个元素而不是第五个元素(假设整数的大小为四个字节)吗?它不应该扩展到
*(a+5*sizeof(a))
因为每个字节都有自己的地址?
最佳答案
指针运算基于所指向类型的大小;如果您有一个指向类型T
的指针p
,则p+1
会为您提供该类型的下一个实例的地址。所以,给定如下内容:
char *pc = 0x1000;
int *ic = 0x1000;
double *dc = 0x1000;
pc + 1
给出下一个 char
对象的地址(位于 0x1001
),ic + 1
给出下一个 int
对象的地址(对于四字节的 int
,它将位于 0x1004
),并且 dc + 1
给出下一个 double
对象的地址(对于 8 字节的 double
,它将位于 0x1008
)。
这就是为什么 a[i]
被定义为 *(a + i)
- 你正在访问 i
数组的第 元素,而不是数组的 i
字节。
关于c - 为什么 *(a+b) 在 C 而不是 a[b] 中工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33681408/