首页 > 解决方案 > 指向 int 变量的 Char 指针

问题描述

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

谁能帮我这个 ??我得到不同的输出,我不知道为什么。谁能解释一下这里发生了什么以及为什么?

标签: cpointerscasting

解决方案


让我们分解一下。

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 的字节和几个等于 0 的字节,而 10 可以是第一个或最后一个。所以这会打印 10 或 0。哪一个?它是实现定义的。

*ptr = 11;

如果前一行打印了 10,那么第一个字节是最不重要的字节——您只需将其设置为 11,即i等于 11。

如果上一行打印为零,则只需将最高有效字节设置为 11。这将设置i为一些非常大的值。


推荐阅读