2d数组指针和* arr []有什么区别?

时间:2019-04-16 21:24:58

标签: c pointers

我试图了解像这样的数组之间的区别:

int arr[2][2] = {{0, 1}, {2, 3}};
int* pArr = (int*)arr;
for(int i = 0; i < 4; i++)
{
    printf("%d ", pArr[i]);
}

这:

int* foo[2] = {arr1, arr2}; // Let's say the length of arr1 is 3 and arr2 is 1
int* pFoo = (int*)foo;
for(int i = 0; i < 4; i++)
{
    printf("%d ", pFoo[i]);
}

在我看来,它们几乎相同,但输出却完全不同。 如果得到的结果比我给我的大整数多,我得到的结果是奇怪的,但是如果我添加更多的数组和项也给我更小的整数。 输出示例: Output

*在输出图像中:高整数是第一个2d数组,低整数是第二个数组指针。

有人可以向我解释为什么发生这种情况吗?

2 个答案:

答案 0 :(得分:2)

多维数组是单个内存块。指向不一定是连续数据的指针的数组(单个块)。

后者对于管理稀疏数组或每个指向子数组的大小不一定相同的数组很有用。

答案 1 :(得分:1)

  

有人可以向我解释为什么发生这种情况吗?

有...

int* foo[2] = {arr1, arr2}; // Let's say the length of arr1 is 3 and arr2 is 1

... foo被声明为元素类型为int *的数组。您没有提供arr1arr2的定义,但可以说它们是int的数组-然后在初始化程序表达式中,它们“衰减”到指向第一个元素的指针,具有foo元素的正确类型,就可以了。

但是指针不是 整数。您将pFoo声明为int *,但使用int ** 转换为 int *的方法进行初始化:

int* pFoo = (int*)foo;

转换指针的类型对其(实际上)指向的数据没有任何作用,并且由于pFoo最终指向实际上不是int的数据,因此可以通过{{ 1}}产生不确定的行为。

也许您正在寻找这个:

pFoo

现在int **pFoo2 = foo; // note: no cast needed 的类型pFoo2int **自然衰减的类型相同,您可以正确访问元素:

foo

请注意,您仍在通过printf("%d", pFoo2[0][0]); 间接访问arr1arr2。即使这些长度彼此不同,并且从pFoo2pFoo2的类型中也看不出来,您仍然必须尊重它们的长度。