如何将二维数组分配给指针?

7
如何将二维数组分配给**指针?这是我想要完成的内容。
int arrray [2][3];
int **pointer = array;
so pointer[0][1]= 1;

需要帮忙吗? 提前致谢。

2个回答

20

要声明指针,请这样写:

int (*pointer)[3] = array;

但这在C++中是极其糟糕的。如果您解释一下您的一般目的,也许您可以找到一个更好的解决方案(涉及向量或其他东西)。


同意。STL会节省很多麻烦。 - chris
这不是我想要的,这是一维数组。谢谢你的努力。 - user1308378
@AhmedZainElDein:你想要的是无法实现的,这是一种提供与你所需求的源代码兼容的方法。 - David Rodríguez - dribeas
@user1308378:这将会做你所要求的 - 它是一个指向未定义数量的一维数组的指针,pointer[n][i]; 是有效的。 - Clifford
我同意这确实有效。虽然我认为在C++中声称“无限恶劣”可能有些言过其实。有时我们必须支持最初用C编写的遗留代码,并且没有足够的时间完全切换所有内容。如果我声称它是“恶劣的,但有限制的恶劣呢” ;) - Chip Grandits

7
简单的回答是你不能。一个二维数组是一个连续的内存块,它保存每行的数据,而指向指针可以引用指向不同内存位置的包含整数的指针。
另一方面,你可以创建一个单独的数据结构来保存元素的指针,以你想要的方式(即创建指针数组,将这些指针初始化为每行的开头,并使用指向该指针数组的指针作为“指针”),但这并没有什么用处,只会使一切变得更加复杂。
这个问题可能来自于常见的误解,即数组和指针是相同的,但它们实际上并不相同。一个数组可以衰减为指向数组第一个元素的指针(并且经常这样做),但该指针的类型是第一个元素的类型。在一个二维数组中,第一个元素的类型是内部数组,而不是基本元素类型。

好的,非常感谢。我知道数组本身就是一个指针。例如,可以像 *arr 一样处理 arr[2]。*(arr+1)=3那么如何处理二维数组呢?arr[3][2],我能说 **arr=0 等等吗? - user1308378
@AhmedZainElDein:不,你错了,这是一个常见误解。数组不是指向第一个元素的指针,它们是完全不同的类型,即使有从数组到指向第一个元素的指针的隐式转换。一旦你真正理解了它们不是同一件事,就会更容易理解为什么你要求的无法实现。另一种看待它的方式是绘制二维数组的内存布局(大小为N*M个元素的单个块),然后意识到该块内部没有指针,因此您无法创建指向它的指针。 - David Rodríguez - dribeas
谢谢您的启发。我更倾向于您所说的,因为我无法找到一种方法来引用arr[3][2]。但这让我又想问一个问题,在一维数组中,如果是int arr[2],我可以说*arr = 0; *(arr+1) = 3。 - user1308378
给定类型为T且名为array的数组,将作为rvalue-expression使用的表达式array转换(通常称为衰减)为指向第一个元素的指针。也就是说,array被转换为&array[0],其类型为T*。现在,在二维数组T中,对于给定类型U和大小N,即U [N],这意味着在int array[3][3];中,array会衰减为&array[0],其类型为int (*)[3]。结果表达式不再是数组,而是指针,不能进一步衰减。 - David Rodríguez - dribeas
与表达式*array相比较,其中array将会衰减为&array[0],产生*&array[0],它是类型为array of 3 int的指针,因此它本身会衰减为第一个元素的地址:&(*&array[0])[0],这等同于&array[0][0]。这可能令人困惑,但重要的是,当数组用作rvalue-expression时,它将被转换为等效的指针,但只在这种情况下,并且转换后的指针不再是数组,也不能再次转换... - David Rodríguez - dribeas

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接