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

标签 c arrays

我在 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/

相关文章:

python - 在 C 中调用从 Python 接收函数指针的函数

c - 假位法达到最大迭代次数限制

c - 在 Ubuntu 中从 Eclipse 运行 C 代码时如何设置 CPU 亲和性?

java - 没有集合库的哈希表

java - fragment 数组上的 NullPointerException

c - 我怎样才能与 C 预处理器连接两次并扩展一个宏,如 "arg ## _ ## MACRO"?

c - C中的递归函数取3的另一个数的幂

javascript - Laravel 5 通过 laravel :5 query 检查表中是否存在两条记录

java - Java中的深拷贝数组

ruby - 哈希到数组转换