int matrix[9][9],*p;
p=matrix[0];
这是可行的,并且给出了matrix
的第一行,但是如何得到matrix
的第一列我试过p=matrix[][0];
?我也不明白为什么下面的代码会出现编译错误?
int matrix[9][9],p[9]; // it looks really ugly, byt why it doesn't work ?
p=matrix[0]; // compiler gives "invalid array assigment"
是因为多维数组是数组的数组--我们应该把matrix[i][j]
解释为第i个嵌套数组的第j个元素吗?
9条答案
按热度按时间zazmityj1#
在C/C++中,多维数组实际上存储为一维数组(在内存中)。您的2D矩阵存储为行优先排序的一维数组。这就是为什么从其中获取列不容易,并且默认情况下不提供。**内存中没有连续数组,您可以获取表示多维数组列的指针。**参见下文:
当你执行
p=matrix[0]
时,你只得到了指向第一个元素matrix[0][0]
的指针,这让你以为你得到了指向第一行的指针,实际上,它是指向整个连续数组的指针,这个数组包含了matrix
,如下所示:如上所述,任何给定列的元素被对应行中的其他元素分隔开。
顺便说一句,如果你愿意,你可以使用指针
p
遍历矩阵的全部81个元素。arknldoa2#
您可以使用如下循环获取第一列
我认为赋值运算没有正常工作,因为你试图给指针赋值,而不是地址。
(对不起,这是c代码)
fykwrbwg3#
指定
matrix[81]
或matrix[9][9]
没有区别matrix[r][c]
仅表示与matrix[9*r+c]
相同还有其他更适合
boost::multi_array
等多维数组的容器http://www.boost.org/doc/libs/1_53_0/libs/multi_array/doc/index.html
空数组就像是分配一个连续的内存块。程序员必须自己处理这个内存块。数组的空名称,例如
matrix
是指向这个分配内存块的第一个元素的指针。那么*(matrix+1)
与matrix[0][1]
或matrix[1]
相同。neskvpey4#
p为int数组,matrix[0]为指针。
cclgggtu5#
matrix
本身是最接近数组列的值,因为(matrix + 1)[0][0]
与matrix[1][0]
相同。bjg7j2ky6#
如果希望矩阵位于连续位置,请将其声明为一维数组,并自行执行行和列计算:
您还可以迭代行的每一列:
o0lyfsai7#
对于静态声明的数组,你可以像访问连续的一维数组一样访问它们,
p = matrix[0]
将给予你第一行的第一列,然后一维数组可以像p[i]
,*(p+i)
,或p[current_raw * raw_size + current_column)
一样访问。如果用
**p
表示2D数组,事情就变得棘手了,因为它将被解释为指向1D数组的指针数组。ebdffaop8#
我不知道这是不是一个有效的解决方案,但通过这样做,我可以得到列,
oogrdqng9#
数组地址和指向多维数组的指针