C将二维阵列指向另一个二维阵列
我正在努力使我的新板成为cleanBoard的精确副本。由于性能是一个问题,我想看看是否可以绕过创建一个循环,一次复制一个元素,转而更改指针地址或其他内容。这可能吗?使用C将二维阵列指向另一个二维阵列,c,arrays,pointers,C,Arrays,Pointers,我正在努力使我的新板成为cleanBoard的精确副本。由于性能是一个问题,我想看看是否可以绕过创建一个循环,一次复制一个元素,转而更改指针地址或其他内容。这可能吗?使用memcpy: int newBoard[9][9]; int dirtyBoard[9][9]; /*add stuff to every element of dirtyBoard*/ ... newBoard = &dirtyBoard; 这将把sizeof(newBoard)从dirtyBoard开始的字节
memcpy
:
int newBoard[9][9];
int dirtyBoard[9][9];
/*add stuff to every element of dirtyBoard*/
...
newBoard = &dirtyBoard;
这将把sizeof(newBoard)
从dirtyBoard
开始的字节复制到newBoard
中newBoard
的大小必须与dirtyBoard相同或大于dirtyBoard,这样才能避免缓冲区溢出。使用memcpy
memcpy(newBoard, dirtyBoard, sizeof(newBoard);
不要忘记两个数组的大小必须相同,或者至少要复制到的数组必须更大
memcpy( newBoard , dirtyBoard , sizeof( newBoard )) ;
如果您只想指向dirtyBoard,请使用指针
assert( sizeof( newBoard ) == sizeof( dirtyBoard ) ) ;
现在p的行为几乎与dirtyBoard完全相同。使用memcpy
int (*p)[9] = dirtyBoard ;
因为newBoard和dirtyBoard都是静态声明的数组,所以不能只将newBoard指向dirtyBoard的地址 如果希望两个都是静态数组,则需要复制每个元素中的数据:
memcpy(newBoard,dirtyBoard, sizeof(newBoard));
然后你可以做:
int (*newBoard)[9];
但是,这里的不同之处在于,newBoard和dirtyBoard指向同一个内存。如果声明两个不同的静态数组,那么最终将得到两个离散的数据副本
希望这能有所帮助。正如您可能发现的那样,您无法做到:
newBoard = dirtyBoard;
但是,上述语法的工作原理如下:
for(i=0;i<9;i++)
for(j=0;j<9;j++)
newBoard[i][j] = dirtyBoard[i][j];
newBoard = &dirtyBoard;
使用C++,你不需要使用定义:你可以使用:
#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 */
数组没有指向性。不能“重新指向”整数数组,正如不能“重新指向”单个整数一样 变量名称仅与分配给该变量的存储关联;不能在内存中移动变量,也不能将变量的名称重新调整为其他变量 然而,指针指出了这一点。可以创建指向数组(或数组子集)的指针,然后将其更改为指向其他数组 在您的情况下,语法是:
const int rows = 9; // and use as array dimensions.
这使得
newBoard
指向9int
s的一维数组。因此,您可以使用语法newBoard[i][j]
来访问单元格。但这不就是添加每个元素的for循环吗?也许效率更高一些,但本质上是一样的?我真的希望重定向变量,所以当调用newBoard时,dirtyBoard才是真正被引用的对象。结果是一样的。对你想要一份。指向同一数组不会产生副本。@self。只是好奇,“几乎完全”意味着他们仍然不同?还有什么?提前感谢。您不能执行int**newBoard=&dirtyBoard
dirtyBoard
是一个数组,不是指针数组。@MattMcNabb是的,一行中有两个严重错误。哇……我的大脑在哪里……对不起,我编辑了我的答案,我想我现在已经找到了。@self上面哪一位没有编译?
const int rows = 9; // and use as array dimensions.
int (*newBoard)[9] = &dirtyBoard[0];