c语言打印中的投射指针差异

c语言打印中的投射指针差异,c,pointers,casting,C,Pointers,Casting,以代码为例: int main() { char orange[5]; for (int i = 0; i < 5; i++) orange[i] = 1; printf("orange: %d\n", *((char *)orange)); printf("orange: %d\n", *((int *)orange)); return 0; } intmain(){ 焦橙[5]; 对于(int i=0;i

以代码为例:

int main() {
    char orange[5];
    for (int i = 0; i < 5; i++)
        orange[i] = 1;
    printf("orange: %d\n", *((char *)orange));        
    printf("orange: %d\n", *((int *)orange)); 
    return 0;
}
intmain(){
焦橙[5];
对于(int i=0;i<5;i++)
橙色[i]=1;
printf(“橙色:%d\n”,*((字符*)橙色));
printf(“橙色:%d\n”,*((int*)橙色));
返回0;
}
第一条print语句给我的值是
1
,但第二条print语句给我的值是
16843009
。差异的原因是什么?

在第二个示例中,您将一些相邻的
char
值别名为
int
。根据C标准,这是未定义的;然而,一个常见的结果是,您将得到
int
的值,该值的位模式与那些连接的
char
值的位模式相同

在这种情况下,您看到的值是十进制形式的
0x01010101

它是未定义的行为,因为C99 6.5#7列出了可能存在别名的有效类型组合,并且
char
as
int
不在列表中。(您可以将
int
别名为
char
,但不能反过来)。获取标准文本


由于对齐要求,还存在潜在的未定义行为。例如,一些系统要求只能在4的倍数的地址访问
int

在第二种情况下,您将其强制转换为
int
指针。因此,假设系统上的
int
4
字节,执行
*((int*)橙色)
将访问
4
字节,从
orange[0]
orange[3]


由于您在这些地址中都有
1
orange[0]
orange[3]
的十六进制表示法将是
0x01010101
,即十进制的
16843009

首先您必须知道int是
4字节的数量,char是
1字节的。
当机器读取整数时,它将连续读取4个字节。并读取字符的1字节。
在本例中,首先声明一个orange[5]数组,它是计算机上连续的5个字节。每个字节分配1。所以你会在你的机器上得到这样的东西

0000 0001 0000 0001 0000 0001 0000 0001 0000 0001
变量orange是指向第一个字节的指针。如果您将橙色强制转换为
char*
并取消引用,机器将尝试读取此地址(橙色)上的字符,因此您将获得

0000 0001 
如果您将orange转换为int指针,机器将尝试读取从orange开始的4个字节,因此您将得到这个结果

0000 0001 0000 0001 0000 0001 0000 0001
如果您将这个二进制数转换为十进制数,您将得到
16843009


希望有帮助:)

我猜第二条语句是将整个列表作为一个大整数处理。因此它可能将橙色视为一个长二进制数。嗨@Matt,我不明白为什么它是未定义的行为。如果你能解释一下或者给我一些资源来阅读,那就太好了。好的,我明白了。谢谢@Matt。