【发布时间】:2021-07-25 07:57:42
【问题描述】:
为什么我可以用二维数组从 int** 转换为 int*,但不能用指针数组?
例如为什么我这样做:
int arr2d[3][3] = { { 1, 2, 3}, { 4, 5, 6}, { 7, 8, 9} };
int* arr = (int*)arr2d;
int i = 0;
for (i = 0; i < 9; i++)
{
printf("%d ", arr[i]);
}
它可以工作并打印:1 2 3 4 5 6 7 8 9
但是当我这样做时:
int arr1[] = { 11, 12 };
int arr2[] = { 13, 14, 15, 16 };
int arr3[] = { 17, 18, 19 };
int* pArr[3] = { arr1, arr2, arr3 };
int* pArr1d = (int*)pArr;
for (i = 0; i < 9; i++)
{
printf("%d ", pArr1d[i]);
}
它不起作用并打印:4192000 4191976 4191956 -858993460 -858993460 17 18 19 -858993460
【问题讨论】:
-
答案是“未定义的行为”
-
答案是“因为你确实有一个从地址 &arr2d. &arr2d[0] 和 &arr2d[0][0]) 开始的整数序列,它们都是相同。但您强调没有从地址 &pArr 或 &parr[0] 开始,它们又是相同的”:在那里,您有一系列 地址 .整数序列从 pArr 的元素中 包含 的地址开始:在 pArr[0] 中包含的地址处有 个整数序列。
-
@4386427 虽然正确,但换句话说只是“因为它是错误的”,OP 之前一定已经清楚了。他们的问题是为什么。 (啊,我看到你正在尝试一个答案,这很好。)
-
@Peter-ReinstateMonica 为什么...!出于几个原因...阅读我的答案
-
您可以在 C 中转换某些东西并不意味着它是一件好事。
标签: c pointers memory multidimensional-array