【问题标题】:3d array using pointers使用指针的 3d 数组
【发布时间】:2014-08-03 00:00:59
【问题描述】:

我是 C 编程新手。目前正在尝试使用指针学习 3d 数组。下面是我正在尝试调试的程序。谁能解释下面给出的两个程序之间的区别?

代码1:

#include <stdio.h>
int main()
{
    int a;
    int d[2][2][2] = {1, -2, -3, 0, -9, -1, 3, -1};
    printf("%d\n",*(*(*(d +1)+1)+1));
    if(*(*(*(d +1)+1)+1) <(a= sizeof( int )))
        puts(" u got it ");
    else
        puts (" but wrong");
    return 0;
}

代码2:

#include <stdio.h>
int main()
{
    int a;
    int d[2][2][2] = {1, -2, -3, 0, -9, -1, 3, -1};
    if(*(*(*(d +1)+1)+1) <(sizeof( int )))
        puts(" u got it ");
    else
        puts (" but wrong");
    return 0;
}

在第一个代码中,我得到 [...incomplete...]

【问题讨论】:

  • 相关:stackoverflow.com/questions/1683432 肯定是重复的(不过也许有更好的)。寻找整数提升,(size_t)-1SIZE_MAX,它不小于int 的大小。第一个 sn-p 中的赋值将 size_t 转换为 int,因此不会提升 &lt; 的左操作数。
  • 嗯?我在这篇文章中没有看到 size_t,但我看到 sizeof(int) 可能是 4。
  • @david 是 sizeof(int) 是 4。分配给变量 a 后,它有什么区别。代码之间有什么区别?
  • @DavidGrayson:sizeof 运算符的结果是size_t 类型,它是无符号的。
  • -1 &lt; sizeof(int) : results sizeof 由于无符号,-1 通过转换为无符号进行比较。 -1 &lt; (a=sizeof(int)) : results (a=sizeof(int)) 自签名以来(因为 a 的类型是 signed int)。

标签: c pointers multidimensional-array


【解决方案1】:
int d[2][2][2] = {1, -2, -3, 0, -9, -1, 3, -1};

初始化程序没有完全支撑,但在这种情况下,初始化程序应用于内存中数组的下一个元素,因此分配了d[0][0][0] = 1d[0][0][1] = -2d[0][1][0] = -3 等。

printf("%d\n",*(*(*(d +1)+1)+1));

满是星星的东西是d[1][1][1] 的一种混淆写法。 X[Y]的定义是*(X+Y)

(a= sizeof( int )))

赋值表达式的类型是左操作数的类型。所以第一个程序是 (int)-1 &lt; (int)4 。第二个程序执行 (int)-1 &lt; (size_t)4 。 (假设你的整数是 4 个字节大)。

在第一种情况下,这是true。在第二种情况下,它是类型不匹配。在进行比较之前,必须修复类型不匹配。 C 的规则说,在这种情况下,有符号类型转换为无符号类型,给出(size_t)-1 &lt; (size_t)4。由于(size_t)-1 实际上是最大可能的size_t 值,所以这个比较是false

【讨论】:

    【解决方案2】:

    它基本上是一个整数类型比较问题。第一个程序将signed int(-1) 与signed int(a) 进行比较,第二个程序将signed int(-1) 与unsigned int(sizeof()) 进行比较。整数提升发生在第二种情况下,其中signed int(-1) 被转换为unsigned int(-1) -> SIZE_MAX。 有关类型比较的更多详细信息,请查看线程,What are the general rules for comparing different data types in C?

    【讨论】:

    • +1,但我有些担心。第二个程序将(有符号的)intsize_t(这是一个无符号整数类型,但通常不是 unsigned int — 这是我的主要挑剔)进行比较。
    • @JonathanLeffler 正确地指出,在第二种情况下,signed int(-1) 与size_t(-1) 进行了比较。 link 更好地解释了这一点。
    • 支持初始化器可能有助于更好地理解int d[2][2][2] = { { {1, -2} , {-3, 0} }, { {-9, -1} , {3, -1} } };
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-17
    相关资源
    最近更新 更多