C 代码迭代器按 sizeof(int) 而不是按字节递增

标签 c strong-typing type-safety

有人能准确解释一下下面的 C 代码的作用吗?特别是第一行和迭代行?

int * p = &my_numbers[0];

int i;
int j = 0;

for (i = 0; i < 6; i++)
{
  j += *(p + (i));
}

编译器 (GCC) 是否知道当我递增迭代器时,我的意思是 sizeof(int)/4 字节而不是 1 字节?每个编译器都一样吗?最初我使用的是:

  j += *(p + (i * sizeof(int)));

但这给出了错误的答案:

  j += *(p + (i));

确实给出了正确答案。

如果我只想增加一个字节,我必须写什么? (不知道为什么我想这样做,我想也许该语言的强类型性质允许我使用 char 来告诉编译器?)。

最佳答案

是的。在指针算术中,指针将根据所指向类型的大小进行调整。

如果您想要单字节指针算术,则必须使用 char* 和强制转换。但如果您真正处理的是 int,则可能会遇到对齐问题。

关于C 代码迭代器按 sizeof(int) 而不是按字节递增,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15231370/

相关文章:

c - Linux内核模块内存检查器

typescript - angular2 CLI 项目中缺少一些 RxJS 运算符?该怎么办?

.net - ListBox.DisplayMember = [String] 我可以以某种方式解决它而不是 .NET 中的字符串吗?

java - 为什么 "TypeToken Collections"被认为是类型安全的? (有效的 Java #29)

Haskell GADTs - 为黎曼几何制作类型安全的张量类型

lambda - 为什么 lambda 表达式可以返回本地枚举类类型?

c - 如何在没有嵌套循环的情况下实现三项式展开。

c# - 从 C# 程序访问 DLL 中的方法

在for循环中创建线程: all threads passed same "i" value

c++ - QMetaEnum 和强类型枚举