int i=10;
char *ptr = &i;
printf("%d",*ptr); // what will be the output and why
*ptr =11; //now what will be the output and why
有人可以帮助我吗?我得到的输出不同,我也不知道为什么。谁能解释我在这里发生了什么以及为什么??
答案 0 :(得分:3)
让我们分解一下。
int i = 10;
我们现在有一个变量i
,其中有10。此变量长几个字节-出于参数考虑(假设它是最常见的值),我们假设为4。 10个字节适合单个字节,因此最低有效字节为10,其余字节为零。但是,最低有效字节可以是第一个(小尾数)或最后一个(大尾数),它们是由编译器,底层CPU等定义的。
char * ptr = &i;
...是错误,或者至少是警告。让我们对其进行修复:
char * ptr = (char *) &i;
通常,使用错误类型的指针是未定义的行为,这意味着编译器可以发出可对其执行任何操作的代码。但是char
有一个例外-您可以合法地将任何对象指针转换为char *
(或signed char *
或unsigned char *
)。因此,ptr
现在指向i
的第一个字节。
printf("%d", *ptr);
...不正确。 *ptr
的类型为char
,但是%d
用于int
。让我们对其进行修复:
printf("%hhd", *ptr);
现在,请记住ptr
指向i
的第一个字节。还请记住,i
的字节等于10,几个字节等于零,并且10可以是第一个或最后一个。因此,这将打印10或0。哪个打印?这是实现定义的。
*ptr = 11;
如果上一行打印10,则第一个字节是最低有效字节—您只需将其设置为11,使i
等于11。
如果上一行打印为零,则只需将最高有效字节设置为11。这会将i
设置为一个非常大的值。