为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

C
富国沪深 2019-06-26 17:20:18
为什么不能用双指针来表示二维数组呢?为什么不能用双指针来表示二维数组呢?arr[2][5] = {"hello","hai"};**ptr = arr;在这里,为什么双指针(*PTR)不能在这个示例中工作?
查看完整描述

3 回答

?
白衣非少年

TA贡献1155条经验 获得超0个赞

我要试着画出

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,这个公式也有效(读到帖子的末尾,然后是注释)。

也就是说,静态2d数组实际上是一行放在一起的一维数组。该指数由公式计算。row * number_of_columns_in_one_row + column.

然而,一个动态的2d数组只是一个一维指针数组。然后动态分配每个指针指向另一个一维数组。事实上,那个指针可以是任何东西。可能是NULL,或者指向单个变量,或者指向另一个数组。每个指针都是单独设置的,因此它们可以有不同的性质。

如果需要传递array在某个地方,你不能把它投到int **(想象一下会发生什么。这个int的单元格值array被解释为指针和取消引用->Bam!分割错误!)然而,你可以想到array的一维数组int [6]这是一个元素的一维数组,具有int [6]..写下来,你说

int (*p)[6] = array;


查看完整回答
反对 回复 2019-06-26
?
开心每一天1111

TA贡献1836条经验 获得超13个赞

拥有指针对指针意味着每一行(或列,如果您喜欢这样想)可以有一个不同的长度与其他行/列。

还可以仅通过指向Start元素的指针和一个整数来表示2D数组,该整数指定每行/列的元素数:

void matrix_set(double *first, size_t row_size, size_t x, size_t y, double value){
  first[y * row_size + x] = value;}


查看完整回答
反对 回复 2019-06-26
  • 3 回答
  • 0 关注
  • 832 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信