【问题标题】:How does an int variable casted to char* print a string?转换为 char* 的 int 变量如何打印字符串?
【发布时间】:2021-11-21 22:18:45
【问题描述】:

我很难理解这行代码是如何工作的。

#include <stdio.h>
#define NUM 6513249

int main()
{
        int a = NUM;
        char * pt = (char *) &a;
        printf("a is: %d\n", a);

        //Line I don't understand (I think)
        printf("string is: %s\n", pt)

        return 0;
}

预期和实际输出:

a 是:6513249
字符串是:abc

说清楚,这个程序应该打印这个字符串,我只是不太明白它是怎么做的。

我目前的理解是,当你将整数类型的变量的地址转换为char指针类型的指针时,指针只指向int变量所在的第一个内存地址。

我不明白的是如何将指针(据我了解将传递 a 的第一个内存地址)转换为字符串“abc”。我对铸造和打印指针的理解是否存在缺陷?

【问题讨论】:

  • 此代码具有依赖于实现的行为。这取决于该数字的二进制表示恰好与字符串 abc 相同的事实。
  • @Barmar 是的,我很困惑的是在最后一个打印语句中它是如何被转换和打印的。是否获取二进制值然后将其转换为字符串?
  • @Barmar nvm,你的回答已经澄清了,谢谢!

标签: c pointers casting


【解决方案1】:

数字6513249 具有十六进制值00636261。在 little-endian 架构中,字节首先存储在最不重要的位置,因此在内存中存储为

61 62 63 00

61a的ASCII码,62b的ASCII码,63c的ASCII码。所以这与字符串"abc" 的内存内容相同(00 是空终止符)。因此,如果我们将a 的地址视为字符串的开头(通过将&amp;a 转换为char*)并打印它,我们得到abc

这是完全不可移植的。

【讨论】:

  • 啊,我明白了,这就解释了。那么这是否意味着当声明一个 int 时,它是根据其十六进制值存储的?
  • 它以二进制形式存储。十六进制只是一种描绘恰好使字节易于查看的值的方式。每 2 个十六进制数字为 1 个字节。
  • 这更有意义,感谢您的回答和澄清!
猜你喜欢
  • 1970-01-01
  • 2012-10-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多