指针的值是变量的地址.为什么int pointer
int指针增加1后增加4个字节的值.
在我看来,我认为指针(变量的地址)的值仅在指针递增后增加1个字节.
测试代码:
int a = 1, *ptr;
ptr = &a;
printf("0x%X\n", ptr);
ptr++;
printf("0x%X\n", ptr);
Run Code Online (Sandbox Code Playgroud)
预期产量:
0xBF8D63B8
0xBF8D63B9
Run Code Online (Sandbox Code Playgroud)
实际输出:
0xBF8D63B8
0xBF8D63BC
Run Code Online (Sandbox Code Playgroud)
编辑:
另一个问题 - 如何访问4个字节并int
逐个占用?
GMa*_*ckG 97
增加a时T*
,它会移动sizeof(T)
字节.†这是因为移动任何其他值是没有意义的:例如,如果我指的int
是4个字节的大小,那么增加小于4的值会让我失望吗?int
与其他一些数据部分混合:荒谬.
在内存中考虑这个:
[? ]
[...|0 1 2 3|0 1 2 3|...]
[...|int |int |...]
Run Code Online (Sandbox Code Playgroud)
当我增加指针时哪个更有意义?这个:
[? ]
[...|0 1 2 3|0 1 2 3|...]
[...|int |int |...]
Run Code Online (Sandbox Code Playgroud)
或这个:
[? ]
[...|0 1 2 3|0 1 2 3|...]
[...|int |int |...]
Run Code Online (Sandbox Code Playgroud)
最后一个实际上并没有指出任何一种int
.(从技术上讲,使用该指针是UB.)
如果你真的想移动一个字节,增加一个char*
:of的大小char
总是一个:
int i = 0;
int* p = &i;
char* c = (char*)p;
char x = c[1]; // one byte into an int
Run Code Online (Sandbox Code Playgroud)
†这样做的一个必然结果是你不能增加void*
,因为它void
是一个不完整的类型.
指针增量基于指向的类型的大小.如果int是4个字节,则将int*递增1将使其值增加4.
如果short为2个字节,则将short*递增1将使其值增加2.
这是C指针算术的标准行为.
指针按其指向的类型的大小增加,如果指针指向 char,则pointer++
指针加 1,如果指向 1234 字节的结构体,pointer++
则指针加 1234。
当你第一次遇到它时,这可能会让人困惑,但实际上它很有意义,这不是一个特殊的处理器功能,而是编译器在编译期间计算它,所以当你编写pointer+1
编译器时将其编译为pointer + sizeof(*pointer)