使用char* 打印int数组内容的输出

iq3niunx  于 2022-12-02  发布在  其他
关注(0)|答案(2)|浏览(289)

你知道为什么下面程序的输出是

1000
2000

如果你能帮助我,我非常感激!这是节目单。

int main()
{
    int t[] = { 1, 2 };
    char* p = (char*)t;
    int i;
    for (i = 0; i < sizeof(t); i++)
    {
        printf("%d", *(p + i));

        if (i % sizeof(t[0]) == sizeof(t[0]) - 1) printf("\n");
    }
    return 0;
}
kqlmhetl

kqlmhetl1#

它将t的值中的每个字节的值打印为数值。最后的if语句看起来很混乱,但只是检查它是否在最后一个元素,然后在退出前添加一个换行符。下面是以更可读的形式重写的代码。

int main() {
    int t[] = { 1, 2 };

    // Get a pointer to he first byte in t
    char* p = (char*)t;

    // Go through each byte in t
    for (int i = 0; i < sizeof(t); i++) {
        // Print the numerical value of each byte
        printf("%d", p[i]);
    }

    // Add a line break when finished.
    printf("\n");

    return 0;
}

这段代码的目标很可能是显示你是否使用big or little endian。从你的输出中我们可以看出你使用的是little endian。如果是big endian,它会输出00010002

1dkrff03

1dkrff032#

您可以通过将printf更改为printf("%d ", p[i]);来使其更加清晰。
代码的作用是逐字节迭代int数组。C语言中的一个特殊规则允许我们检查几乎任何类型的原始数据,通过使用指向字符类型的指针,然后访问单个字节。
但是,由于Is char signed or unsigned by default?的原因,char不是一个很好的选择。请改用unsigned charuint8_t
至于为什么值为1int的原始字节表示形式为1 0 0 0,这是因为您的系统恰好是一个32位int小字节序系统。What is CPU endianness?
if (i % sizeof(t[0]) == sizeof(t[0]) - 1) printf("\n");部分只是打印4个字节后的新行。
程序的完整重写可能如下所示:

#include <stdio.h>

int main (void)
{
  int t[] = { 1, 2 };
  const size_t t_items = sizeof(t)/sizeof(*t); // 8/4 = 2 items
  unsigned char* p = (unsigned char*)t; // bug fix to make the code portable

  for (size_t i = 0; i<t_items; i++) // iterate across array items
  {
    for(size_t j=0; j<sizeof(int); j++) // iterate across the bytes of each int
    {
      printf("%d ", *p);
      p++;
    }
    printf("\n");
  }
}

相关问题