Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 将指针投射到长*_C_Pointers - Fatal编程技术网

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
类型的值

如果您有一些由array
arr
表示的原始内存,并且希望写出(
sizeof(long)==4
)或第二个(如果
sizeof(long)==8
)字,则此代码将完成此操作

但根据endianness和
sizeof(long)
的不同,您将得到不同的字节覆盖:


其中,LE和BE是endianness,最后一个数字是
sizeof(long)

内容不会不同,只是它的表示形式不同。注意:由于严格的别名规则,只有当
0x1000
是声明为
long
的变量,或者是
malloc
'd空间的一部分,您在其中写入“十六进制地址”时,这才有效,必须是一个整数