C 如何将(long*)转换为二维long数组

C 如何将(long*)转换为二维long数组,c,arrays,pointers,C,Arrays,Pointers,我在C中有以下代码,其中G是一个全局变量: long *G; int function(long matrix[35][10]){ G=&matrix[0][0]; } 一旦我将矩阵[0][0]的地址存储在G中,我就可以访问矩阵的所有元素,如下所示: G[0]=... G[1]=... . . . G[349]=... 我希望通过使用另一个函数内部的两个方括号,能够访问所有这些元素,就像使用matrix一样。我怎么能做到呢?也就是说,我如何告诉编译器这个二维数组中第二维的偏

我在C中有以下代码,其中
G
是一个全局变量:

long *G;

int function(long matrix[35][10]){
    G=&matrix[0][0];
}
一旦我将
矩阵[0][0]
的地址存储在
G
中,我就可以访问
矩阵的所有元素,如下所示:

G[0]=...
G[1]=...
.
.
.
G[349]=...
我希望通过使用另一个函数内部的两个方括号,能够访问所有这些元素,就像使用
matrix
一样。我怎么能做到呢?也就是说,我如何告诉编译器这个二维数组中第二维的偏移量是10


我确实看到了这个答案:
,但我不确定用户是否问了完全相同的问题。如果我错了,请纠正我

将G作为指针

long **G;
但是你仍然不能通过G[i]直接访问,i从0到349

但有一件简单的事情可以做,那就是将一个数字转换成2个下标

例如:

G[349] is actually G[34][9].
因此,公式是 如果你愿意

G[k]
然后像这样访问它:

G[k/10][k%10];
这是针对这个特殊情况的

一般情况下, 将1个下标转换为2个下标的公式为:

G[k] is equivalent to G[k/NO_OF_COLUMNS][k%NO_OF_COLUMNS];

array
是指向10个
long
s数组的指针。

它是相同的question@Dabo所以,如果我按照这个问题的答案,一个64位的值基本上会被分配给我的全局变量,对吗?只要确保
long*G
只是一个指针,如果您机器上的
sizeof
指针是
8
,那么是的,它将有64位。为了确保
数组只分配了64位,对吗?它前面有一个3,这让我觉得三个long是分配的,这取决于系统,
sizeof(long*)
将分配给
array
。或者因为他想这样使用
G
本身,而只是将
G
声明为
long(*G)[10]并直接向其分配
矩阵
,如
G=matrix。这不起作用。指针和数组不一样。读取G[34]将从数组的数据缓冲区中获取一个元素,并尝试取消对该元素的引用,这显然会导致访问冲突
long (*array)[10] = (long(*)[10])G;