Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/url/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C将二维阵列指向另一个二维阵列_C_Arrays_Pointers - Fatal编程技术网

C将二维阵列指向另一个二维阵列

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开始的字节

我正在努力使我的新板成为cleanBoard的精确副本。由于性能是一个问题,我想看看是否可以绕过创建一个循环,一次复制一个元素,转而更改指针地址或其他内容。这可能吗?

使用
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
指向9
int
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];