【问题标题】:Swapping 2d array (pointer to pointer) in C在C中交换二维数组(指向指针的指针)
【发布时间】:2014-11-29 16:12:40
【问题描述】:

我有两个二维数组(指向无符号指针的指针),我想交换它们。 首先,我开始为一维指针数组编写代码。这完美地工作:

#include <stdio.h>
#include <stdlib.h>

void swap(unsigned **a, unsigned **b) {
  unsigned * tmp = *a;
  *a = *b;
  *b = tmp;
}

int main() {
  size_t x;
  unsigned *a = (unsigned*) malloc(10*sizeof(unsigned));
  unsigned *b = (unsigned*) malloc(10*sizeof(unsigned));

  for(x=0;x<10;x++) a[x] = 1;
  for(x=0;x<10;x++) b[x] = 0;

  printf("%u %u\n",a[5],b[5]);
  swap(&a, &b);
  printf("%u %u\n",a[5],b[5]);
  return 0;
}

我想我可以为二维数组做类似的事情。这是我的尝试:

#include <stdio.h>
#include <stdlib.h>

void swap(unsigned ***a, unsigned ***b) {
  unsigned ** tmp = **a;
  **a = **b;
  **b = tmp;
}

int main() {
  size_t x,y;
  unsigned **a = (unsigned**) malloc(10*sizeof(unsigned*));
  unsigned **b = (unsigned**) malloc(10*sizeof(unsigned*));
  for(x=0;x<10;x++)
  {
    a[x] = malloc(10*sizeof(unsigned));
    b[x] = malloc(10*sizeof(unsigned));
  }

  for(x=0;x<10;x++) for(y=0;y<10;y++) a[x][y] = 1;
  for(x=0;x<10;x++) for(y=0;y<10;y++) b[x][y] = 0;

  printf("%u %u\n",a[5][5],b[5][5]);
  swap(&a, &b);
  printf("%u %u\n",a[5][5],b[5][5]);
  return 0;
}

我收到了两个编译器警告:

$ gcc -g -Wall test.c
test.c: In function ‘swap’:
test.c:5:21: warning: initialization from incompatible pointer type [enabled by default]
test.c:7:7: warning: assignment from incompatible pointer type [enabled by default]

我试图理解这些警告,但我仍然不理解它们。我不知道我的代码有什么问题。

【问题讨论】:

  • 更改为unsigned ** tmp = *a; *a = *b; *b = tmp;

标签: c arrays pointers swap


【解决方案1】:

您的swap 函数中的引用过多:

void swap(unsigned ***a, unsigned ***b) {
  unsigned ** tmp = *a;
  *a = *b;
  *b = tmp;
}

你想访问指针的内容,所以你只需要解引用一次(和你原来的函数一样)。

【讨论】:

    【解决方案2】:

    您所要做的就是交换指针,*a 指的是a[][] 的位置。 所以正如@didirec 所说,有太多的取消引用!!

    【讨论】:

      最近更新 更多