为什么C允许我们将2D数组视为1D?
在这里,我可以只使用一个循环访问2D数组的元素。所以,我似乎不需要将这个数组测试为2D为什么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
#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]
),它与指针对指针完全不同。