ely*_*hiv 14 c c++ pointers void-pointers
如果我有以下代码:
int i = 5;
void * ptr = &i;
printf("%p", ptr);
Run Code Online (Sandbox Code Playgroud)
我会得到i或MSB的LSB地址吗?
平台之间的行为会有所不同吗?
C和C++之间有区别吗?
ras*_*hok 19
考虑大小int
是4个字节.Always &i
将为您提供这4个字节的第一个地址.
如果架构是小端,那么较低的地址将具有如下的LSB.
+------+------+------+------+ Address | 1000 | 1001 | 1002 | 1003 | +------+------+------+------+ Value | 5 | 0 | 0 | 0 | +------+------+------+------+
如果架构是大端,那么较低的地址将具有如下的MSB.
+------+------+------+------+ Address | 1000 | 1001 | 1002 | 1003 | +------+------+------+------+ Value | 0 | 0 | 0 | 5 | +------+------+------+------+
所以&i
会给LSB的地址i
,如果小端或它会给MSB的地址i
,如果大端
在混合端模式中,也会动态地为每个任务选择小端或大端.
下面的逻辑将告诉你endianess
int i = 5;
void * ptr = &i;
char * ch = (char *) ptr;
printf("%p", ptr);
if (5 == (*ch))
printf("\nlittle endian\n");
else
printf("\nbig endian\n");
Run Code Online (Sandbox Code Playgroud)
这种行为将是相同的两个c
和c++
我会得到i或MSB的LSB地址吗?
这取决于平台:它将是最低寻址字节,可能是MSB或LSB,具体取决于平台的字节顺序.
虽然这不是直接在标准中写的,但这是第6.3.2.3.7节所暗示的:
当指向对象的指针转换为指向字符类型的指针时,结果指向对象的最低寻址字节.
平台之间的行为会有所不同吗?
是
c和c ++之间有区别吗?
否:它在C和C++中都依赖于平台
这取决于平台的字节顺序; 如果它是一个小端平台,你会得到一个指向LSB的指针,如果它是一个大端平台,它将指向MSB.甚至有一些混合端的平台,在这种情况下,上帝可以怜悯你的灵魂检查你的编译器/ CPU的具体文档.
您仍然可以在运行时快速检查:
uint32_t i=0x01020304;
char le[4]={4, 3, 2, 1};
char be[4]={1, 2, 3, 4};
if(memcmp(&i, le, 4)==0)
puts("Little endian");
else if(memcmp(&i, be, 4)==0)
puts("Big endian");
else
puts("Mixed endian");
Run Code Online (Sandbox Code Playgroud)
顺便说一下,要打印指针,必须使用%p
占位符,而不是%d
.
ptr存储整数对象的起始字节的地址.这是存储最高或最低有效字节的位置取决于您的平台.一些奇怪的平台甚至使用混合字节序,在这种情况下它既不是MSB也不是LSB.
在这方面,C和C++之间没有区别.