【问题标题】:Casting an int array into a char pointer in c将一个int数组转换为c中的char指针
【发布时间】:2023-01-08 04:11:38
【问题描述】:

我在 C 中运行了这几行代码:

int tab[]={4,6,8,9,20};
char *p;     
p=(char*)tab

问题是如何使用指针 p 打印 20 的值。

所以我使用了一个for循环来查看p发生了什么

    for(int i=0;i<20;i++){
        printf("%d ",p[i]);
    }

我得到了这个输出:

4 0 0 0 6 0 0 0 8 0 0 0 9 0 0 0 20 0 0 0

我想了解那些出现的零背后的逻辑。

【问题讨论】:

  • 当您似乎知道 charint 的大小不同时,您还希望显示什么?你知道数字是如何存储在内存中的吗?
  • int 使用 4 个字节,char 使用 1 个字节。因此,当您使用 p[i] 时,您会看到数字中的每个 4 个字节。
  • 我相信 int 在你的机器上是 4 字节。而且您似乎知道5ints 的总和为20,那为什么您看起来很惊讶?您使用 p 一次打印一个字节,因为 char 根据定义为 1 字节。

标签: arrays c pointers casting char


【解决方案1】:

您几乎可以肯定使用 int 为 4 个字节的体系结构,以及 little-endian 体系结构,其中首先存储“最小”字节。

所以 int4 存储为:

+----+----+----+----+
|  4 |  0 |  0 |  0 |
+----+----+----+----+

int20 存储为:

+----+----+----+----+
| 20 |  0 |  0 |  0 |
+----+----+----+----+

内存中的整个数组如下所示:

+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+
|  4 |  0 |  0 |  0 |  6 |  0 |  0 |  0 |  8 |  0 |  0 |  0 |  9 |  0 |  0 |  0 | 20 |  0 |  0 |  0 |
+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+----+

现在,当您将这 20 个字节作为字符进行迭代(因此一次一个字节)时,结果应该不再令人惊讶了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多