C 将指针投射到长*
今天我观察了一些代码(我不能透露整个代码块),但想法如下:C 将指针投射到长*,c,pointers,C,Pointers,今天我观察了一些代码(我不能透露整个代码块),但想法如下: // arr is a char array *((long *) (arr + <hex offset e.g. 0x10>)) = <hex address e.g. 0xbffcc210>; //arr是一个字符数组 *((长*)(arr+)=; 我想知道为什么地址被转换为(long*)。它是否与endianess有关?将内存位置arr+hex offset视为包含长整数值的代码。它将该位置设置为十六
// arr is a char array
*((long *) (arr + <hex offset e.g. 0x10>)) = <hex address e.g. 0xbffcc210>;
//arr是一个字符数组
*((长*)(arr+)=;
我想知道为什么地址被转换为
(long*)
。它是否与endianess有关?将内存位置arr+hex offset视为包含长整数值的代码。它将该位置设置为十六进制地址。如果需要,可以将给定的内存地址视为包含字符、整数、浮点、结构等
它与endianness无关,尽管内存中字节的顺序确实会根据endianness而改变。在大端机和小端机上,内存的内容会有所不同
例如,如果将0x90ab12cd存储为地址1000的无符号4字节整数,则在big-endian系统内存中的显示如下:
1000: 90
1001: ab
1002: 12
1003: cd
1000: cd
1001: 12
1002: ab
1003: 90
在小endian系统上,它看起来像:
1000: 90
1001: ab
1002: 12
1003: cd
1000: cd
1001: 12
1002: ab
1003: 90
这和持久性有什么关系吗
否,因为更改指针类型不会修改内存位置的endianess。地址被强制转换为long,因为他们想访问
long
类型的值 如果您有一些由arrayarr
表示的原始内存,并且希望写出(sizeof(long)==4
)或第二个(如果sizeof(long)==8
)字,则此代码将完成此操作
但根据endianness和sizeof(long)
的不同,您将得到不同的字节覆盖:
其中,LE和BE是endianness,最后一个数字是
sizeof(long)
内容不会不同,只是它的表示形式不同。注意:由于严格的别名规则,只有当0x1000
是声明为long
的变量,或者是malloc
'd空间的一部分,您在其中写入“十六进制地址”时,这才有效,必须是一个整数