为什么int指针“++”增加4而不是1?
指针的值是一个variables的地址。 在int指针增加1后,为什么int pointer
值增加了4个字节。
在我看来,我认为指针增量后指针的值(variables地址)只增加1个字节。
testing代码:
int a = 1, *ptr; ptr = &a; printf("0x%X\n", ptr); ptr++; printf("0x%X\n", 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 |...]
最后一个实际上并不指向任何types的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
是一个不完整的types。
指针增量是基于指向的types的大小。 如果一个int是4个字节,那么int *增加1会使它的值增加4。
如果short是2个字节,则将short *加1将使其值增加2。
这是C指针algorithm的标准行为。
如果指针指向char,则pointer++
增加指针types的大小,如果指针指向1234字节的结构, pointer++
会将指针递增1,而pointer++
会将指针递增1234。
这可能会让你第一次遇到混淆,但实际上它有很大的意义,这不是一个特殊的处理器特性,但是编译器在编译期间计算它,所以当你编写pointer+1
,编译器将它编译为pointer + sizeof(*pointer)
这个想法是,在增加之后,指针指向内存中的下一个int。 由于ints是4个字节宽,所以增加了4个字节。 通常,typesT的指针将按sizeof(T)
正如你所说的,一个int pointer
指向一个int
。 一个int
通常占用4个字节,因此,当你增加指针时,它指向内存中的“next” int
,即增加4个字节。 它适用于任何types的尺寸。 如果你有一个指向typesA
的指针,那么递增一个A*
,它将以sizeof(A)
递增。
考虑一下 – 如果你只增加1个字节的指针,它将指向一个int
的中间,我不能想到一个机会,这是需要的。
例如,在迭代数组时,这种行为非常舒服。