#include<stdio.h>
int main()
{
    int a;
    char *x;
    x = (char *) &a;
    a = 512;
    x[0] = 1;
    x[1] = 2;
    printf("%d\n",a);
    return 0;
}

我无法掌握输出是513还是什至依赖于机器的事实?我可以感觉到类型转换在发挥重要作用,但是幕后发生了什么,有人可以帮助我想象一下这个问题吗?

最佳答案

除了先前的答案,让我为您分解一下:

#include<stdio.h>
int main()
{
    int a;            //declares an integer called a
    char *x;          //declares a pointer to a character called x
    x = (char *) &a;  //points x to the first byte of a
    a = 512;          //writes 512 to the int variable
    x[0] = 1;         //writes 1 to the first byte
    x[1] = 2;         //writes 2 to the second byte
    printf("%d\n",a); //prints the integer
    return 0;
}

请注意,我写了第一个字节和第二个字节。根据平台的字节顺序和整数的大小,您可能不会获得相同的结果。

让我们看一下 32位 4字节大小的整数的内存:

小端系统
first byte | second byte | third byte | forth byte
0x00           0x02        0x00         0x00

现在将1分配给第一个字节,将2分配给第二个字节使我们有了:
first byte | second byte | third byte | forth byte
0x01           0x02        0x00         0x00

注意,第一个字节已更改为0x01,而第二个字节已更改为0x02
内存中的新数字等效于 little endian 系统上的513

大端系统

让我们看看如果您在大端字节平台上尝试此操作会发生什么:
first byte | second byte | third byte | forth byte
0x00           0x00        0x02         0x00

这次将1分配给第一个字节,将2分配给第二个字节使我们有了:
first byte | second byte | third byte | forth byte
0x01           0x02        0x02         0x00

相当于16,908,800作为整数。

关于c - 带类型转换的C指针,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/43664832/

10-08 23:18