c - 指向 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
谁能帮我这个 ??我得到不同的输出,我不知道为什么。谁能解释一下这里发生了什么以及为什么?
解决方案
让我们分解一下。
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
为一些非常大的值。
推荐阅读
- html - 创建下标的下标
- java - 为什么Java类文件版本从45开始?
- javascript - 如何检查数据是否已完成加载以使用异步管道 Angular 8
- javascript - 自第二次请求以来,AJAX 成功无法正确呈现
- ms-access - 如何正确创建 SQL 查询
- c++ - 这是词法分析器的代码,谁能详细解释一下这段代码?
- python - 如何修复 TypeError: +: 'int' 和 'str' 不支持的操作数类型
- .net - 可以使用不是长期运行的任务的长期任务吗?
- c# - 使用协程设置进行 PlayMode 测试
- python - 根据另一个数据框中的行条件,在一个数据框中查找值