为什么int指针'++'增加4而不是1?

Jas*_*son 42 c c++ pointers

指针的值是变量的地址.为什么int pointerint指针增加1后增加4个字节的值.

在我看来,我认为指针(变量的地址)的值仅在指针递增后增加1个字节.

测试代码:

int a = 1, *ptr;
ptr = &a;
printf("0x%X\n", ptr);
ptr++;
printf("0x%X\n", ptr);
Run Code Online (Sandbox Code Playgroud)

预期产量:

0xBF8D63B8
0xBF8D63B9
Run Code Online (Sandbox Code Playgroud)

实际输出:

0xBF8D63B8
0xBF8D63BC
Run Code Online (Sandbox Code Playgroud)

编辑:

另一个问题 - 如何访问4个字节并int逐个占用?

GMa*_*ckG 97

增加a时T*,它会移动sizeof(T)字节.这是因为移动任何其他值是没有意义的:例如,如果我指的int是4个字节的大小,那么增加小于4的值会让我失望吗?int与其他一些数据部分混合:荒谬.


在内存中考虑这个:

    [?      ]
[...|0 1 2 3|0 1 2 3|...]
[...|int    |int    |...]
Run Code Online (Sandbox Code Playgroud)

当我增加指针时哪个更有意义?这个:

            [?      ]
[...|0 1 2 3|0 1 2 3|...]
[...|int    |int    |...]
Run Code Online (Sandbox Code Playgroud)

或这个:

      [?      ]
[...|0 1 2 3|0 1 2 3|...]
[...|int    |int    |...]
Run Code Online (Sandbox Code Playgroud)

最后一个实际上并没有指出任何一种int.(从技术上讲,使用该指针是UB.)

如果你真的想移动一个字节,增加一个char*:of的大小char总是一个:

int i = 0;
int* p = &i;

char* c = (char*)p;
char x = c[1]; // one byte into an int
Run Code Online (Sandbox Code Playgroud)

†这样做的一个必然结果是你不能增加void*,因为它void是一个不完整的类型.


Ken*_*kot 8

指针增量基于指向的类型的大小.如果int是4个字节,则将int*递增1将使其值增加4.

如果short为2个字节,则将short*递增1将使其值增加2.

这是C指针算术的标准行为.


MBy*_*ByD 6

指针按其指向的类型的大小增加,如果指针指向 char,则pointer++指针加 1,如果指向 1234 字节的结构体,pointer++则指针加 1234。

当你第一次遇到它时,这可能会让人困惑,但实际上它很有意义,这不是一个特殊的处理器功能,而是编译器在编译期间计算它,所以当你编写pointer+1编译器时将其编译为pointer + sizeof(*pointer)