首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >为什么我们不能使用双指针来表示二维数组呢?

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

Stack Overflow用户
提问于 2010-12-17 21:37:20
回答 3查看 14.1K关注 0票数 33

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

代码语言:javascript
复制
arr[2][5] = {"hello","hai"};
**ptr = arr;

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

EN

回答 3

Stack Overflow用户

发布于 2011-09-05 19:55:00

我要试着画出

代码语言:javascript
复制
int array[10][6];

代码语言:javascript
复制
int **array2 = malloc(10 * sizeof *array2);
for (int i = 0; i < 10; ++i)
    array2[i] = malloc(6 * sizeof **array2);

在记忆中看起来很像,它们是如何不同的(它们不能相互转换)

array看起来像这样:

代码语言:javascript
复制
 _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
| | | | | | | | | | | | | ..............| | | (10*6 elements of type int)
 - - - - - - - - - - - - - - - - - - - - - -
< first row >< second row> ...

array2看起来像这样:

代码语言:javascript
复制
 _ _ _ _ _ _ _ _ _ _ 
| | | | | | | | | | | (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 ** (想象一下会发生什么。array的单元格的int值被解释为指针并取消对->的引用!分割错误!)。但是,您可以将array视为int [6]的一维数组;这是一个类型为int [6]的元素一维数组。把它写下来,你会说

代码语言:javascript
复制
int (*p)[6] = array;
票数 72
EN

Stack Overflow用户

发布于 2010-12-17 21:39:31

拥有指针到指针意味着每一行(或者列,如果你喜欢这样想的话)可以有不同于其他行/列的长度。

也可以通过指向起始元素的指针和指定每行/每列元素数量的整数来表示二维数组:

代码语言:javascript
复制
void matrix_set(double *first, size_t row_size, size_t x, size_t y, double value)
{
  first[y * row_size + x] = value;
}
票数 8
EN

Stack Overflow用户

发布于 2010-12-17 21:57:02

让我们从讨论法律代码开始。您编写的代码(假设每个声明前面有一个字符)无法编译,原因如下:初始化器太多( arr有6个char,大小为5),当然,char** p没有与char arr2兼容的类型。纠正这些问题,我们得到:

代码语言:javascript
复制
char arr[2][6] = { "hello", "hai" };
char (*p)[6] = arr;

没有任何双指针。如果你想访问上面的单个字符,你需要指定它们来自的元素:

代码语言:javascript
复制
char* pc = *arr;

如果您想要访问arr中第一个元素中的字符,将会起作用。

C++没有二维数组。上面的第一个定义定义了字符的array2或array6。隐式数组到指针的转换导致指向字符的array6的指针。当然,在那之后,就没有数组到指针的转换了,因为你不再有数组了。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4470950

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档