【问题标题】:C programming pointerC编程指针
【发布时间】: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 已更正,谢谢!

标签: c pointers


【解决方案1】:

我假设您正在使用基于 Intel/AMD 的机器,这意味着整数以小端格式存储。这意味着像 12 34 56 78 这样的十六进制数(添加空格只是为了便于阅读)会像 78 56 34 12 这样存储。

&amp;a 是您的 int 的地址。因此((char *)(&amp;a)) + 3 将指向 int (12) 的最后一个字节。

for 循环中的部分首先获取字节的前半部分,即最高有效位,打印二进制表示,然后继续处理包含最低有效位的后半部分。

    int d = (*p)>>4;      // shifts the 4 higher bits to the lower bits
    printf("%s", arr[d]);

    d = (*p) & 0xf;       // zeroes the 4 higher bits
    printf("%s ", arr[d]);

    p--;                  // positions to the next byte of the int

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-04-02
    • 2017-12-21
    • 1970-01-01
    • 2018-05-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-19
    相关资源
    最近更新 更多