为什么我们不能使用双指针来表示二维数组呢?
arr[2][5] = {"hello","hai"};
**ptr = arr;
这里为什么双指针(**ptr)在这个例子中不起作用?
发布于 2011-09-05 19:55:00
我要试着画出
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 **
(想象一下会发生什么。array
的单元格的int
值被解释为指针并取消对->的引用!分割错误!)。但是,您可以将array
视为int [6]
的一维数组;这是一个类型为int [6]
的元素一维数组。把它写下来,你会说
int (*p)[6] = array;
发布于 2010-12-17 21:39:31
拥有指针到指针意味着每一行(或者列,如果你喜欢这样想的话)可以有不同于其他行/列的长度。
也可以通过指向起始元素的指针和指定每行/每列元素数量的整数来表示二维数组:
void matrix_set(double *first, size_t row_size, size_t x, size_t y, double value)
{
first[y * row_size + x] = value;
}
发布于 2010-12-17 21:57:02
让我们从讨论法律代码开始。您编写的代码(假设每个声明前面有一个字符)无法编译,原因如下:初始化器太多( arr有6个char,大小为5),当然,char** p没有与char arr2兼容的类型。纠正这些问题,我们得到:
char arr[2][6] = { "hello", "hai" };
char (*p)[6] = arr;
没有任何双指针。如果你想访问上面的单个字符,你需要指定它们来自的元素:
char* pc = *arr;
如果您想要访问arr中第一个元素中的字符,将会起作用。
C++没有二维数组。上面的第一个定义定义了字符的array2或array6。隐式数组到指针的转换导致指向字符的array6的指针。当然,在那之后,就没有数组到指针的转换了,因为你不再有数组了。
https://stackoverflow.com/questions/4470950
复制相似问题