c - 二维数组指针和 *arr[] 有什么区别?

标签 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

*在输出图像中:上面的整数是第一个二维数组,下面的整数是第二个数组指针。

有人可以向我解释一下为什么会发生这种行为吗?

最佳答案

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

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

关于c - 二维数组指针和 *arr[] 有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55716825/

相关文章:

c++ - 调试链表指针代码: segmentation fault

c++ - 整数指针数组的大小

c - 平方反比定律方程

c - 将单词分配给长度时遇到问题

将十六进制字符数组转换为字节数组Arduino

c - strtok() 不处理第二个标记

c - 为什么在尝试将指向数组的指针作为函数的参数时出现访问冲突错误?

c - 增加指向 char 的指针的左值?

c# - 使 C#.NET 中的 IntPtr 指向字符串值

c - 从文件中获取不带标点符号的字符串以进行拼写检查并输出原始标点符号。