【发布时间】:2022-01-17 16:51:55
【问题描述】:
#include <stdio.h>
int fun(int a)
{
char *arr[] = {"0000", "0001","0010","0011","0100",
"0101","0110","0111","1000","1001","
1010","1011","1100","1101","1110","1111"};
unsigned char* p = (unsigned char*) &a ;
p+=3;
int i;
for(i = 0; i < sizeof a; i++) {
int d = (*p)>>4;
printf("%s", arr[d]);
d = (*p) & 0xf;
printf("%s ", arr[d]);
p--;
}
}
当使用参数 9 调用时,下面的函数将打印多少个 1? (假设 int 的 sizeof 为 4 个字节)
我的想法:一个整数将像这样存储在内存中|00000000|00000000|00000000|00001001|假设地址是这样的 100-101-102-103;现在 p 包含 a 的地址,所以它将包含 100 对吗?现在我们将它类型转换为 char 指针,现在它将增加 1 而不是数据类型的大小。 p+=3 在这条语句之后 p 将包含 103 对吗?现在 for 循环开始 d=(*p) >> 4 现在 *p 不是将包含 00001001 吗?如果我们右移 4 次 d 将包含 0 并打印 arr[0] 现在是 '0000' d = (*p) & 0xf 现在如果我们按位执行 00001001 并且 11111111 d 应该包含 9 右和 a[9 ] 应该被打印,但 arr[0] 正在再次打印。
请帮我想象一下 谢谢
编辑:输出为 00000000 00000000 00000000 00001001
【问题讨论】:
-
我建议您学习如何使用 调试器 在监控变量及其值的同时逐语句执行代码。或者只是简单地打印出循环内所有变量的所有值,每次更改。
-
OT:
p+=3;应该是p += sizeof a - 1;,将其与for语句进行比较。 -
我还建议您阅读有关endianness 的内容,这可能是您感到困惑的根本原因。
a中的位和字节并没有像你想象的那样存储。 -
@thebusybee
p += (sizeof a) - 1; -
@SamBob 已更正,谢谢!