[英]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.