gpt4 book ai didi

c - 为什么我们不能用双指针来表示二维数组呢?

转载 作者:太空狗 更新时间:2023-10-29 16:27:16 24 4
gpt4 key购买 nike

为什么不能用双指针来表示二维数组?

arr[2][5] = {"hello","hai"};
**ptr = arr;

这里为什么双指针(**ptr)在这个例子中不起作用?

最佳答案

我要试着画画

int array[10][6];

int **array2 = malloc(10 * sizeof *array2);
for (int i = 0; i < 10; ++i)
array2[i] = malloc(6 * sizeof **array2);

在内存中看起来像以及它们有何不同(并且它们不能相互转换)

array 看起来像:

 _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
| | | | | | | | | | | | | ..............| | | (10*6 elements of type int)
- - - - - - - - - - - - - - - - - - - - - -
< first row >< second row> ...

array2 看起来像:

 _ _ _ _ _ _ _ _ _ _ 
| | | | | | | | | | | (10 elements of type int *)
- - - - - - - - - -
| | .... | _ _ _ _ _ _
| | \-->| | | | | | | (6 elements of type int)
| | - - - - - -
| |
| | _ _ _ _ _ _
| \ -->| | | | | | | (6 elements of type int)
| - - - - - -
|
|
| _ _ _ _ _ _
\ -->| | | | | | | (6 elements of type int)
- - - - - -

当你说 array[x][y] 时,它会翻译成 *((int *)array+x*6+y)

而当您说 array2[x][y] 时,它会转换为 *(*(array2+x)+y)(请注意对于 array,这个公式也有效(读到文章末尾,然后是评论)。

也就是说,静态二维数组实际上是一个一维数组,行放在一行中。索引由公式 row * number_of_columns_in_one_row + column 计算。

然而,动态二维数组只是指针的一维数组。然后每个指针被动态分配以指向另一个一维数组。实际上,该指针可以是任何东西。可以是 NULL,或指向单个变量,或指向另一个数组。而且这些指针中的每一个都是单独设置的,因此它们可以具有不同的性质。

如果你需要在某处传递array的指针,你不能将它转换为int **(想象一下会发生什么。int array 单元格的值被解释为指针并取消引用 -> Bam!段错误!)。但是,您可以将 array 视为 int [6] 的一维数组;这是一维元素数组,类型为 int [6]。把它写下来,你说

int (*p)[6] = array;

关于c - 为什么我们不能用双指针来表示二维数组呢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4470950/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com