C指向另一个2d阵列的2d阵列

时间:2014-03-03 22:28:10

标签: c arrays pointers

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

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

newBoard = &dirtyBoard;

我试图让我的newBoard成为cleanBoard的精确副本。由于性能是一个问题,我想看看我是否可以绕过创建一个循环来一次复制每个元素1,以支持更改我的指针地址或其他东西。这可能吗?

6 个答案:

答案 0 :(得分:1)

使用memcpy

memcpy(newBoard, dirtyBoard, sizeof(newBoard);

这会将从sizeof(newBoard)开始的dirtyBoard字节复制到newBoardnewBoard必须与dirtyBoard大小相同或大于{{1}}才能导致缓冲区溢出

答案 1 :(得分:1)

使用memcpy。

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

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

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

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

int (*p)[9] = dirtyBoard ; 

现在p的行为几乎与dirtyBoard完全相同。

答案 2 :(得分:1)

使用memcpy

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

答案 3 :(得分:0)

阵列没有指向。你不能“重新指向”一组int,而不是“重新指向”一个int。

变量的名称只与分配给该变量的存储相关联;你不能在内存中移动变量,或者将变量的名称重新用于另一个变量。

然而,指针指出。您可以创建指向数组(或数组的子集)的指针,然后将其更改为指向不同的数组。

在您的情况下,语法将是:

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

这使newBoard指向9 int s的1-D数组。那么您可以使用语法newBoard[i][j]来访问单元格。

答案 4 :(得分:-1)

由于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指向相同的内存。如果声明两个不同的静态数组,最终会得到两个不连续的数据副本。

希望有所帮助。

答案 5 :(得分:-1)

你可能已经发现,你不能这样做:

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 ++,您不需要使用可以使用的定义:

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