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

Why does int pointer '++' increment by 4 rather than 1?

本文关键字:int 指针 为什么 递增      更新时间:2023-10-16

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

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

测试代码:

int a = 1, *ptr;
ptr = &a;
printf("%pn", ptr);
ptr++;
printf("%pn", ptr);
预期输出:

0xBF8D63B8
0xBF8D63B9

实际输出:

0xBF8D63B8
0xBF8D63BC

编辑:

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

当您增加T*时,它将移动sizeof(T)字节。这是因为移动任何其他值都没有意义:例如,如果我指向一个大小为4字节的int,那么增量小于4会给我留下什么?部分int与一些其他数据混合:无意义。


在内存中考虑:

    [↓      ]
[...|0 1 2 3|0 1 2 3|...]
[...|int    |int    |...]

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

            [↓      ]
[...|0 1 2 3|0 1 2 3|...]
[...|int    |int    |...]

或:

      [↓      ]
[...|0 1 2 3|0 1 2 3|...]
[...|int    |int    |...]

最后一个实际上并没有指向任何类型的int。(因此,从技术上讲,使用该指针是UB。)

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

int i = 0;
int* p = &i;
char* c = (char*)p;
char x = c[1]; // one byte into an int

†这样做的一个推论是,你不能增加void*,因为void是一个不完全类型。

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

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

正如你所说,int pointer指向intint通常占用4字节,因此,当您增加指针时,它指向内存中的"下一个"int -即增加4字节。对于任何大小的类型都是如此。如果你有一个指向A类型的指针,那么增加A*,它将增加sizeof(A)

想想看——如果你只增加1个字节的指针,那么它将指向int的中间,我想不出有什么机会需要这样做。

这种行为在迭代数组时非常舒适,例如

这个想法是,在递增之后,指针指向内存中的下一个int。因为整型是4字节宽,它被加4字节。通常,指向类型T的指针会增加sizeof(T)

指针指向内存中某个内容的开始。INT占用4字节(32位),DOUBLE占用8字节(64位)。因此,如果您存储了一个DOUBLE数字,并且希望在非常低的级别上指向下一个可用的内存位置,则指针将增加8个字节。如果出于某种原因,您指向DOUBLE值开始处的+4字节,您将破坏它的值。内存是一个非常大的平面领域,它没有自己的良心,所以它是由软件来划分它,并"尊重边界"位于该领域的项目。