[英]Output from printing the contents of an int array by using a char*
你知道为什么下面程序的output是
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;
}
它将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;
}
此代码的目的很可能是显示您使用的是大端还是小端。 从您的 output 我们可以知道您正在使用小端。 如果它是大端,它会输出00010002
。
您可以通过将 printf 更改为printf("%d ", p[i]);
来澄清一下。 .
代码所做的是逐字节遍历int
数组。 C 中的一条特殊规则允许我们通过使用指向字符类型的指针然后访问各个字节来检查几乎任何类型的原始数据。
然而, char
是一个非常糟糕的选择,因为Is char signed or unsigned by default? . 请改用unsigned char
或uint8_t
。
至于为什么值为1
的int
的原始字节表示出现为1 0 0 0
,这是因为您的系统恰好是 32 位int
little endian 系统。 什么是 CPU 字节顺序?
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");
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.