int newBoard[9][9];
int dirtyBoard[9][9];
/*add stuff to every element of dirtyBoard*/
...
newBoard = &dirtyBoard;
我试图让我的newBoard成为cleanBoard的精确副本。由于性能是一个问题,我想看看我是否可以绕过创建一个循环来一次复制每个元素1,以支持更改我的指针地址或其他东西。这可能吗?
答案 0 :(得分:1)
使用memcpy
:
memcpy(newBoard, dirtyBoard, sizeof(newBoard);
这会将从sizeof(newBoard)
开始的dirtyBoard
字节复制到newBoard
。 newBoard
必须与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.