为什么*(a + b)在C而不是[b]中工作?

Noa*_*oah 1 c arrays

我已经在C99标准中读到了扩展数组的方法,但是我无法理解为什么这会起作用.如果我有

a[5]
Run Code Online (Sandbox Code Playgroud)

和a是一个整数,然后不会访问第二个元素而不是第五个(假设整数是四个字节)?不应该扩展到

*(a+5*sizeof(a))
Run Code Online (Sandbox Code Playgroud)

因为每个字节都有自己的地址?

Joh*_*ode 9

指针算术基于指向类型的大小; 如果你有一个指向p类型的指针T,那么p+1为你提供该类型的下一个实例的地址.所以,给出如下内容:

char *pc   = 0x1000;
int  *ic   = 0x1000;
double *dc = 0x1000;
Run Code Online (Sandbox Code Playgroud)

pc + 1给出下一个char对象的地址(将在其中0x1001),ic + 1给出下一个int对象的地址(将为0x10044个字节int),并dc + 1给出下一个double对象的地址(将为0x10088-字节double).

这就是为什么a[i]定义*(a + i)-您访问的是i"个元素的数组,而不是i"个字节数组.

  • @ user1128279:因为它很有用.因为它使数组索引工作相同,无论我是使用`char`数组还是`struct humongous`数组.`a [i]`给了我与`b [i]`完全相同的行为(给我每个数组的第i个元素),对'a`和`b'类型的重新定义 (3认同)