int指针可以转换为char*?

int指针可以转换为char*?,c,pointers,alignment,C,Pointers,Alignment,下面的程序在英特尔处理器上测试Little/Big endian。实际上,little endian是正确的输出。首先,我将int转换为char*并在未初始化的情况下访问其值,转换为int*。我不理解输出的第二部分。这里int指针被转换为char*。那么为什么int指针的对齐方式没有更改为char* 00000000 00000000 00000011 01111111 = 895 0 0 3 127 int main() { int num

下面的程序在英特尔处理器上测试Little/Big endian。实际上,little endian是正确的输出。首先,我将
int
转换为
char*
并在未初始化的情况下访问其值,转换为
int*
。我不理解输出的第二部分。这里
int
指针被转换为
char*
。那么为什么
int
指针的对齐方式没有更改为
char*

00000000 00000000 00000011 01111111 = 895
0        0         3       127

int main() {
    int num = 895;
    if(*(char *)&num == 127)
    {
        printf("\nLittle-Endian\n");
    }
    else
    {
        printf("Big-Endian\n");
    }

    int *p = (char *)&num ;
    if(*p == 127)
    {
        printf("\nLittle-Endian\n");
    }
    else
    {
        printf("Big-Endian\n");
    }
    printf("%d\n",*p);
}

o/p

Little-Endian
Big-Endian
895
int指针是否可以转换为字符*

00000000 00000000 00000011 01111111 = 895
0        0         3       127

int main() {
    int num = 895;
    if(*(char *)&num == 127)
    {
        printf("\nLittle-Endian\n");
    }
    else
    {
        printf("Big-Endian\n");
    }

    int *p = (char *)&num ;
    if(*p == 127)
    {
        printf("\nLittle-Endian\n");
    }
    else
    {
        printf("Big-Endian\n");
    }
    printf("%d\n",*p);
}

o/p

Little-Endian
Big-Endian
895
是的,使用从
char*
int*
的强制转换结果(因为
char
是1字节对齐的,所以任何数据指针类型都可以安全地强制转换到
char*

  • 使用此比较的程序的前半部分:

    if(*(char *)&num == 127)
    
    看起来不错

  • 课程的后半部分包含以下作业:

    int *p = (char *)&num ;
    
    这不是有效的代码。如果没有显式强制转换,则无法转换指针类型。在这种情况下,您的编译器可能会让您逍遥法外,但严格来说,这是不正确的。这一行应改为:

    int *p = (int *)(char *)#
    
    或者简单地说,这是一个等价的说法:

    int *p = #
    
    从这个例子中,我确信您可以理解为什么您的第二个测试没有按照您希望的方式工作-您仍然在操作整个
    int
    ,而不是您感兴趣的单个字节。如果您制作了
    p
    a
    char*
    ,它将按照您预期的方式工作:

    char *p = (char *)#
    

  • 您认为cast能做什么?更好地格式化您的代码将有助于人们理解正在发生的事情。
    main
    的返回类型应为
    int
    。Casting
    char*
    to
    int*
    不会调用UB。使用该转换的结果可以调用UB.+1。值得一提的是,在第二种情况下,@s.bandara可能是@Goutham打算编写
    char*p=(char*)&num
    。但我不明白为什么他会这么做,因为这在语义上与程序的前半部分是相同的。也许如果他只是想用两种方法来实现这一点,“你不能在没有显式强制转换的情况下转换指针类型。”-为了学究,你指向
    void
    的指针可以安全地隐式转换为任何指针类型。@Ed,是的,但这是个例外,这里不是这样。