为什么C允许我们将2D数组视为1D?

为什么C允许我们将2D数组视为1D?,c,pointers,C,Pointers,在这里,我可以只使用一个循环访问2D数组的元素。所以,我似乎不需要将这个数组测试为2D #include <stdio.h> #include <process.h> main() { int array[][3] = {11, 22, 33, 44, 55, 66, 77, 88, 99}; int * pArr = &array; int i=0; printf("Addr\tValue\n"); for(i=0

在这里,我可以只使用一个循环访问2D数组的元素。所以,我似乎不需要将这个数组测试为2D

#include <stdio.h>
#include <process.h>

main()
{
    int array[][3] = {11, 22, 33, 44, 55, 66, 77, 88, 99};

    int * pArr = &array;
    int i=0;

    printf("Addr\tValue\n");
    for(i=0 ; i<9 ; i++)
    {
        printf("%d\t%d\n", &pArr[i], pArr[i]);
    }

    system("PAUSE");
}
为什么C允许我们这样做


这取决于你的意思。以下是一种可能的解释:

int x[5][10];  // 2D array
int (*p)[5][10] = &x;  // Pointer to 2D array

(*p)[3][2] = 1;  // Dereferencing pointer
还有一个:

int x[5*10];  // 1D array
int *p = x;   // Pointer to first element of array

p[3*10+2] = 1;  // Dereferencing pointer
int **p;    // Pointer to pointer
p = malloc(sizeof(*p) * 5);  // Create array of pointers
for (int i = 0; i < 5; i++)
{
    p[i] = malloc(sizeof(p[i]) * 10);  // Create array of ints
}

p[3][2] = 1;  // Dereferencing pointer

...

// Clearup
for (int i = 0; i < 5; i++)
{
    free(p[i]);
}
free(p);
还有一个:

int x[5*10];  // 1D array
int *p = x;   // Pointer to first element of array

p[3*10+2] = 1;  // Dereferencing pointer
int **p;    // Pointer to pointer
p = malloc(sizeof(*p) * 5);  // Create array of pointers
for (int i = 0; i < 5; i++)
{
    p[i] = malloc(sizeof(p[i]) * 10);  // Create array of ints
}

p[3][2] = 1;  // Dereferencing pointer

...

// Clearup
for (int i = 0; i < 5; i++)
{
    free(p[i]);
}
free(p);
int**p;//指针到指针
p=malloc(sizeof(*p)*5);//创建指针数组
对于(int i=0;i<5;i++)
{
p[i]=malloc(sizeof(p[i])*10);//创建整数数组
}
p[3][2]=1;//解引用指针
...
//清理
对于(int i=0;i<5;i++)
{
自由(p[i]);
}
自由基(p);

你不能;指针只会告诉你去哪里看,而不是目标是什么

以二维阵列为例:

1 2 3 4
5 6 7 8
9 0 1 2
这将在内存中表示为

1 2 3 4 5 6 7 8 9 0 1 2
只有当您知道这是一个
int[3][4]
数组时,才能再次获取该数组。C不存储它是
int[2][6]
还是
int[3][4]

如果您知道数组的维度,就很容易了,因为您可以简单地分配它

int **pointer;
指针保存
int*
元素集合的第一个元素的地址

第一个元素是
int*
指针

该元素可能指向实际的
int

因此,指针指向指针集合的第一个元素,其中第一个元素指向int。如果将1添加到
指针
,则会得到下一个可能指向int的指针


这就是“2D”在C指针算术中的含义。

如果打开编译器警告,您会发现您的代码无效。我已经在VC++2008Express上编写了此代码。我没有发现任何错误,甚至没有从调试库中找到任何消息。@Saqib:就像我说的,打开编译器警告。(类似于Project->Properties->C/C++->General->Warning Level。)我已经将警告级别设置为4级。什么也没发生。现在怎么办?运行时没有信息,但这并不意味着你不能做特定大小的事情。看我的答案。另外,你不能写
intarry[3][4]=指针。不是真的。可以有一个真正的2D数组(例如
intx[3][4]
),它与指针对指针完全不同。