指向整数变量的字符指针

时间:2019-03-17 14:16:43

标签: c pointers casting

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

有人可以帮助我吗?我得到的输出不同,我也不知道为什么。谁能解释我在这里发生了什么以及为什么??

1 个答案:

答案 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设置为一个非常大的值。