为什么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的中间,我不能想到一个机会,这是需要的。

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