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

C++ 为什么int指针'++';增加4而不是1?,c++,c,pointers,C++,C,Pointers,指针的值是变量的地址。为什么int指针的值在int指针增加1后增加了4个字节 在我看来,我认为指针的值(变量的地址)在指针增加后只增加1字节 测试代码: int a = 1, *ptr; ptr = &a; printf("%p\n", ptr); ptr++; printf("%p\n", ptr); 预期产出: 0xBF8D63B8 0xBF8D63B9 实际产出: 0xBF8D63B8 0xBF8D63BC 编辑: 另一个问题-如何逐个访问int占用的4个字节?想法是,递增后

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

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

测试代码:

int a = 1, *ptr;
ptr = &a;
printf("%p\n", ptr);
ptr++;
printf("%p\n", ptr);
预期产出:

0xBF8D63B8
0xBF8D63B9
实际产出:

0xBF8D63B8
0xBF8D63BC
编辑


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

想法是,递增后,指针指向内存中的下一个int。由于INT的宽度为4字节,因此会增加4字节。一般来说,指向类型T的指针将按sizeof(T)递增。

其思想是递增后,指针指向内存中的下一个int。由于INT的宽度为4字节,因此会增加4字节。一般来说,指向类型T的指针将按sizeof(T)

递增,正如您所说,
int指针
指向
int
int
通常占用4个字节,因此,当您增加指针时,它会指向内存中的“下一个”
int
——即增加4个字节。它以这种方式作用于任何大小的类型。如果您有一个指向类型
a
的指针,那么将
a*
的值递增
sizeof(a)

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


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

正如您所说,
int指针
指向
int
int
通常占用4个字节,因此,当您增加指针时,它会指向内存中的“下一个”
int
——即增加4个字节。它以这种方式作用于任何大小的类型。如果您有一个指向类型
a
的指针,那么将
a*
的值递增
sizeof(a)

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


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

当您增加
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
。(那么,从技术上讲,使用该指针是非常困难的。)


如果确实要移动一个字节,请增加一个
char*
:char
的大小始终为一:

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

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


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

当您增加
T*
时,它会移动
sizeof(T)
字节。†这是因为移动任何其他值都没有意义:例如,如果我指向一个
int
大小为4字节,增量小于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
。(那么,从技术上讲,使用该指针是非常困难的。)


如果确实要移动一个字节,请增加一个
char*
:char的大小始终为一:

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

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


†由此产生的推论是,您不能增加
void*
,因为
void
是一个不完整的类型。

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


第一次遇到它时可能会感到困惑,但实际上它很有意义,这不是一个特殊的处理器功能,但编译器会在编译过程中计算它,因此当您编写
pointer+1
时,编译器会将其编译为
pointer+sizeof(*pointer)

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


第一次遇到它时可能会感到困惑,但实际上它很有意义,这不是一个特殊的处理器功能,但编译器会在编译过程中计算它,因此当您编写
pointer+1
时,编译器会将其编译为
pointer+sizeof(*pointer)

指针指向内存中某个内容的开头。INT在内存中占4字节(32位),DOUBLE在内存中占8字节(64位)。因此,如果您存储了一个双倍数字,并且希望以非常低的级别指向下一个可用的内存位置,那么指针将增加8个字节。如果出于某种原因,您指向双精度值开头的+4字节,则会损坏它的值。内存是一个非常大的平面域,它本身没有良心,因此由软件来正确划分内存,并“尊重”位于该域中的项目的边界

指针指向内存中某物的开头。INT在内存中占4字节(32位),DOUBLE在内存中占8字节(64位)。因此,如果您存储了一个双倍数字,并且希望以非常低的级别指向下一个可用的内存位置,那么指针将增加8个字节。如果你因为某种原因