C 将指向字符串文字的指针强制转换为int指针的结果是什么?

C 将指向字符串文字的指针强制转换为int指针的结果是什么?,c,pointers,C,Pointers,我现在不熟悉c编程语言和学习指南。我需要一点关于指针铸造的澄清 #include<stdio.h> int main(){ char *c = "hello"; for(int i = 0;i<5;i++) printf("c:%c %d\n",c[i],c[i]); int *ip = (int*)c; printf("after casting"); printf("c:%d\n",*ip); return 0; } OUTPUT: c:h 104 c:e 10

我现在不熟悉c编程语言和学习指南。我需要一点关于指针铸造的澄清

#include<stdio.h>

int main(){

char *c = "hello";
for(int i = 0;i<5;i++)
    printf("c:%c %d\n",c[i],c[i]);
int *ip = (int*)c;
printf("after casting");
printf("c:%d\n",*ip);
return 0;
}
OUTPUT:
c:h 104
c:e 101
c:l 108
c:l 108
c:o 111
after castingc:1819043176
#包括
int main(){
char*c=“你好”;

对于(int i=0;i您的程序执行了不允许的操作-将
char
指针转换为
int
指针。根据平台的不同,某些
char
指针可能没有有效的
int
指针表示形式,因此禁止转换;您看到的是未定义的行为

然而,对正在发生的事情有一个合理的解释。考虑将字符串复制到整数数组:

的程序。
int data[2] = {0};
strcpy((char*)data, "hello");
printf("%s\n", (char*)data);
printf("%d\n", data[0]);
这是允许的,因为
int
指针可以在所有平台上转换为
char
指针(事实上,标准要求所有对象指针都可以转换为
char*


上面这个程序中的结果与您得到的值相匹配,即1819043176。这是一个特定于平台的数字,由重新解释
“hello”的最初四个字节产生
作为整数。

您的程序执行了不允许的操作-将
char
指针转换为
int
指针。根据平台的不同,某些
char
指针可能没有作为
int
指针的有效表示形式,因此禁止转换;您看到的是未定义的行为

然而,对正在发生的事情有一个合理的解释。考虑将字符串复制到整数数组:

的程序。
int data[2] = {0};
strcpy((char*)data, "hello");
printf("%s\n", (char*)data);
printf("%d\n", data[0]);
这是允许的,因为
int
指针可以在所有平台上转换为
char
指针(事实上,标准要求所有对象指针都可以转换为
char*


上面这个程序中的结果与您得到的值相匹配,即1819043176。这是一个特定于平台的数字,由重新解释
“hello”的最初四个字节产生
作为一个整数。

您违反了严格的别名规则,您有未定义的行为。我建议您将强制转换的值打印为十六进制,并在附近保留一个字符(或者将单独的字符打印为十六进制)但是如果你将1819043176转换成十六进制,你会得到
0x6C6568
。令人惊讶的是,这是
'l'
'l'
'e'
,和
'h'
的ASCII码。猜猜这些值来自哪里。@Someprogrammerdude是的,
字符*
可以别名任何其他指针类型e、 但是,与此不同的是,
char*
int*
。您违反了严格的别名规则,您有未定义的行为。我建议您将强制转换的值打印为十六进制,并在附近保留一个字符(或者仅将单独的字符打印为十六进制)但是如果你将1819043176转换成十六进制,你会得到
0x6C6568
。令人惊讶的是,这是
'l'
'l'
'e'
,和
'h'
的ASCII码。猜猜这些值来自哪里。@Someprogrammerdude是的,
字符*
可以别名任何其他指针类型e、 但是,与这里发生的情况不同,
char*
int*