使用指针的3d数组

时间:2014-07-30 16:02:20

标签: c pointers multidimensional-array

我是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;
}

在第一段代码中,我得到了 [...不完整...]

2 个答案:

答案 0 :(得分:4)

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等。< / p>

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

充满星星的东西是一种混淆的写作方式d[1][1][1]X[Y]的定义为*(X+Y)

(a= sizeof( int )))

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

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

答案 1 :(得分:1)

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