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

问题描述 投票:2回答:2

我试图理解这样的数组有什么区别:

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数组,底部整数是第二个数组指针。

有人可以向我解释为什么会出现这种情况?

c pointers
2个回答
2
投票

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

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


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最终指向实际上不是ints的数据,因此通过pFoo访问这些数据会产生未定义的行为。

也许你在找这个:

int **pFoo2 = foo;  // note: no cast needed

现在pFoo2的类型int **foo自然衰变的类型相同,您可以正确访问元素:

printf("%d", pFoo2[0][0]);

请注意,您仍然通过arr1间接访问arr2pFoo2。你必须仍然尊重他们的长度,即使这些长度彼此不同,并且从pFoo2foo的类型不明显。

© www.soinside.com 2019 - 2024. All rights reserved.