繁体   English   中英

C将2d数组指向另一个2d数组

[英]C pointing 2d array at another 2d array

int newBoard[9][9];
int dirtyBoard[9][9];

/*add stuff to every element of dirtyBoard*/
...

newBoard = &dirtyBoard;

我试图使newBoard成为cleanBoard的精确副本。 由于性能是一个问题,所以我想看看是否可以绕开创建一个循环来一次复制每个元素1的循环,而无需更改指针地址或其他内容。 这可能吗?

使用memcpy

memcpy(newBoard, dirtyBoard, sizeof(newBoard);

这会将sizeof(newBoard)个字节(从dirtyBoard开始sizeof(newBoard)复制到newBoard newBoard的大小必须等于或大于dirtyBoard大小,以免引起缓冲区溢出

使用memcpy。

memcpy( newBoard , dirtyBoard , sizeof( newBoard )) ;

不要忘记两个数组的大小必须相同,或者至少要复制到的数组必须更大。

assert( sizeof( newBoard ) == sizeof( dirtyBoard ) ) ;

如果只想指向dirtyBoard,请使用指针。

int (*p)[9] = dirtyBoard ; 

现在,p的行为几乎和dirtyBoard一样。

使用memcpy

memcpy(newBoard,dirtyBoard, sizeof(newBoard));

数组不指向。 您不能“重新指向”一个整数数组,而只能“重新指向”一个整数。

变量的名称仅与分配给该变量的存储空间相关; 您不能在内存中四处移动变量,也不能将变量名改用于其他变量。

但是,指针指向。 您可以制作一个指向数组(或数组的子集)的指针,然后将其更改为指向另一个数组。

在您的情况下,语法为:

int (*newBoard)[9] = &dirtyBoard[0];

这使newBoard指向9 int的一维数组。 因此,您可以使用语法newBoard[i][j]访问单元格。

由于newBoard和dirtyBoard都是静态声明的数组,因此不能仅将newBoard指向dirtyBoard的地址。

如果您希望两者都是静态数组,则需要在每个元素中复制数据:

for(i=0;i<9;i++)
   for(j=0;j<9;j++)
      newBoard[i][j] = dirtyBoard[i][j];

编辑:正如其他人所提到的那样, memcpy()是有效的方法。

您可以将newBoard定义为指向int的指针数组,如下所示:

int (*newBoard)[9];

那么您可以执行以下操作:

newBoard = dirtyBoard;

但是,这里的区别是newBoard和dirtyBoard指向相同的内存。 如果声明两个不同的静态数组,则最终将得到两个离散的数据副本。

希望能有所帮助。

正如您可能发现的那样,您不能执行以下操作:

newBoard = &dirtyBoard;

但是,上面的语法将像这样工作:

int newBoard[9][9];
int* dirtyBoard;
int i, j;
for(i = 0; i < 9; ++i)
   for(j = 0; j < 9; ++i)
       newBoard[i][j] = i*j;

dirtyBoard = newBoard;

但是,那么您不进行复制,实际上是在创建别名。 如果更新指针中的值,则还将更新基础数组,反之亦然。

如果要通过指针编辑数组,可以执行以下操作:

#define cols 9
#define rows 9

...
int n;

int newBoard[rows][cols];
int* dirtyBoard;
int i, j;

int row = 3;
int col = 5;

dirtyBoard[row * cols + col] = 3;  /* to flip from 1 dimensional ptr -> [][] form */

使用C ++,您无需使用define即可使用:

const int rows = 9;  // and use as array dimensions.

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM