我试图理解这样的数组有什么区别:
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数组,底部整数是第二个数组指针。
有人可以向我解释为什么会出现这种情况?
多维数组是单个存储器块。指向数据的指针数组,不一定是连续的(单个块)。
后者对于管理稀疏数组或每个指向子数组的大小不一定有用。
有人可以向我解释为什么会出现这种情况?
随...
int* foo[2] = {arr1, arr2}; // Let's say the length of arr1 is 3 and arr2 is 1
... foo
被声明为一个数组,其元素的类型为int *
。你没有提出arr1
和arr2
的定义,但是假设它们是int
的数组 - 然后在初始化表达式中它们“衰变”到指向它们的第一个元素的指针,这些元素具有foo
元素的正确类型,所以这就是全部精细。
但指针不是整数。你将pFoo
声明为int *
,但是你用int **
转换为int *
来初始化它:
int* pFoo = (int*)foo;
转换指针的类型对它(实际)指向的数据没有任何作用,并且由于pFoo
最终指向实际上不是int
s的数据,因此通过pFoo
访问这些数据会产生未定义的行为。
也许你在找这个:
int **pFoo2 = foo; // note: no cast needed
现在pFoo2
的类型int **
与foo
自然衰变的类型相同,您可以正确访问元素:
printf("%d", pFoo2[0][0]);
请注意,您仍然通过arr1
间接访问arr2
和pFoo2
。你必须仍然尊重他们的长度,即使这些长度彼此不同,并且从pFoo2
或foo
的类型不明显。