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
谁能帮我这个 ??我得到不同的输出,我不知道为什么。任何人都可以解释我这里发生了什么,为什么?
让我们稍微分解一下。
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
设置为某个非常大的值。