指向int变量的char指针

问题描述 投票:-1回答:1
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

谁能帮我这个 ??我得到不同的输出,我不知道为什么。任何人都可以解释我这里发生了什么,为什么?

c pointers casting
1个回答
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);

...是不正确的。 *ptrchar类型,但%d用于int。我们来解决它:

printf("%hhd", *ptr);

现在,请记住,ptr指向i的第一个字节。还记得i有一个等于10的字节和几个等于零的字节,10可以是第一个或最后一个。所以这打印10或0.哪一个?它是实现定义的。

*ptr = 11;

如果前一行打印10,那么第一个字节是最不重要的 - 你只需设置为11,使i等于11。

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

© www.soinside.com 2019 - 2024. All rights reserved.