为什么 int 指针'++'递增 4 而不是 1?
Why does int pointer '++' increment by 4 rather than 1?
指针的值是变量的地址。为什么在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
指向int
。int
通常占用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字节,您将破坏它的值。内存是一个非常大的平面领域,它没有自己的良心,所以它是由软件来划分它,并"尊重边界"位于该领域的项目。
- 如何将 int 指针转换为浮点指针
- 使用 int 指针的浮点数的位表示形式
- 引用数据的 int 指针
- 为什么我不能像这样直接将 int 分配给 int 指针:int *p = 6;?
- 为什么可以将Char指针变量初始化为字符串,而INT指针变量不能初始化到整数数组
- 将 Int 指针分配给双精度变量
- 如何使用函数参数中的int指针来获取2d数组中最大值的索引并返回指针
- 为什么在int指针的const vetory中脱离了元素
- (C++)通过指针递增,或者:为什么这不起作用?指针->int = 指针->int+1;
- 如何在 C++ 中将浮点指针转换为 int 指针
- 循环中的 int C++指针?
- 当我创建一个int指针并实例化一个数组时,数组在内存中发生了什么
- 将字符阵列转换为INT指针
- 施放INT指针时编译错误
- 如何返回一个 int 指针,指向矢量<int>的开头
- 64位计算机上的int大小和int指针大小
- 如何将 void 指针类型转换为 int 指针,然后在其中存储 int
- 取消对结构的 int 指针地址的引用
- 通过"int *"指针更改"const int"。令人惊讶和有趣
- C/C++ int[] vs int*(指针与数组表示法).有什么区别