gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 16:50:04 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] 的一维数组s;这是一个一维元素数组,类型为 int [6] 。为了写下来,你说

int (*p)[6] = array;

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

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