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个字节。如果你因为某种原因