交换两个指针以交换数组

5

我有以下代码,我想让board现在具有new_board的值,反之亦然。由于它们都是指针,所以我认为我可以交换它们指向的地址。当我在print2()中打印时,地址已经适当地交换了。然而,当我在print1()中打印时,地址又不知怎么地交换回来了,这对我来说毫无意义。此外,如果我在print2()中打印出board的值,它们也是正确的。

main(){
  char *new_board = (char *)malloc(sizeof(char) * rows * cols );
  char *board = (char *)malloc(sizeof(char) * rows * cols );
  update_board2(board, new_board, rows, cols);
  print1();
}

void update_board2(char *board, char *new_board, int rows, int cols){
  //do a bunch of stuff
  char *temp = board;
  board = new_board;
  new_board = temp;
  print2();
}

4
在C语言中,指针(像其他所有对象一样)是通过值传递的。 update_board2 操作的是传递的参数的副本。此外,new_boardboard 没有声明为指针。您遇到了哪些编译错误和警告? - CB Bailey
抱歉,在我的代码中,它们被我误复制了。 - emschorsch
1
此外,在 C 中不要对 malloc() 的返回值进行强制类型转换,避免使用 sizeof(char),因为它只是一个非常冗长的 1。 - unwind
3个回答

17

如果您想要更改指针本身的值,则函数update_board2必须接受双指针。否则,指针将在函数内部被复制,并且您只能交换这些临时副本而不是调用方传递的真实指针:

void update_board2(char **board, char **new_board){
  char *temp = *board;
  *board = *new_board;
  *new_board = temp;
  print2();
}

谁知道。那真的很令人困惑,很高兴今天学到了一种新的导致错误的源头。我猜值在函数返回后立即切换的事实应该表明它是按值而不是按引用复制的。 - emschorsch

9
您需要进行以下更改:
update_board2(&board, &new_board, rows, cols);

void update_board2(char **board, char **new_board, int rows, int cols){
  //do a bunch of stuff
  char *temp = *board;
  *board = *new_board;
  *new_board = temp;
  print2();
}

在这种情况下,指针将被正确地交换。

你可以移除行和列参数,因为它们在函数中没有被使用。 - Patryk
1
@Patryk 我的理解是它们应该在“//做一堆事情”中使用。 - Alex

3
您的主要代码也需要修复。
例如。
char * new_board = (char *)malloc(sizeof(char) * rows * cols );
char * board = (char *)malloc(sizeof(char) * rows * cols );

malloc返回一个指针,而不是字符。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接