0

有人可以解释一下下面的 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 来告诉编译器?)。

4

5 回答 5

1

既然你用过

int * p

编译器知道它需要找到 4 个字节之外的下一个地址。如果

char * p

而是使用,每次只会添加1个字节的距离。

初始代码

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

将指针移过您希望它指向的地址。

于 2013-03-05T18:38:31.107 回答
1

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

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

于 2013-03-05T18:33:16.713 回答
0

Pointer arithmetic takes the size of the pointed-to type into account; given a pointer T *p, the expression *(p + i) computes the address of the i'th element of type T following p and dereferences it.

于 2013-03-05T18:49:28.583 回答
0

因为 p 是指向int类型的指针,所以它的算术最适合int类型。如果指针指向,char那么它将增加1 byte.

于 2013-03-05T18:33:03.107 回答
0

因为 p 是指向 int 类型的指针,所以它的算术最适合 int 类型。如果 >pointer 指向 char 或 void 那么它将增加 1 byte 。

void 指针不能直接递增。你必须将它转换为 char、byte 等来增加它。

于 2013-03-05T18:42:04.783 回答