【问题标题】:C - swapping two 2D arrays by switching pointersC - 通过切换指针交换两个二维数组
【发布时间】:2015-11-29 13:33:10
【问题描述】:

我想交换两个包含二维数组的变量。我相信这可以通过交换他们的指针来简单地完成。我试过这段代码,但它不起作用,我不知道为什么,也许我没有正确理解指针。

#include <stdio.h>

void swap(int ***a, int ***b) {
    int ** temp = *a;
    *a = *b;
    *b = temp;
}

int main(void) {
    int a[10][10];
    int b[10][10];

    a[1][5] = 4;
    b[1][5] = 2;

    printf("%d, %d\n", a[1][5], b[1][5]);

    swap(&b, &a);

    printf("%d, %d\n", a[1][5], b[1][5]);
    return 0;
}

这个输出

4, 2
4, 2

我希望它能输出

4, 2
2, 4

那么,我做错了什么?

【问题讨论】:

  • 我的眼睛里有星星。。如果你需要一个函数来交换两个指针,你只需要在参数上加一颗星,不管指针的目标是什么。

标签: c arrays pointers multidimensional-array


【解决方案1】:

main 函数中的ab 不是指针而是数组。 如果要使用指针,请使用指针。

#include <stdio.h>

#define N 10

void swap(int (**a)[N][N], int (**b)[N][N]) {
    int (*temp)[N][N] = *a;
    *a = *b;
    *b = temp;
}

int main(void) {
    int a[N][N];
    int b[N][N];
    int (*pa)[N][N] = &a;
    int (*pb)[N][N] = &b;

    (*pa)[1][5] = 4;
    (*pb)[1][5] = 2;

    printf("%d, %d\n", (*pa)[1][5], (*pb)[1][5]);

    swap(&pb, &pa);

    printf("%d, %d\n", (*pa)[1][5], (*pb)[1][5]);
    return 0;
}

【讨论】:

    【解决方案2】:

    这行不通,因为您要交换的实际上是 swap() 函数中的变量指向的内容,而不是它们指向的内容。就像a 指向5bswap() 函数中指向6,那么它将使a 指向6b 指向5 ,而不改变内存的内容。这意味着在main() 函数中,它们将驻留在同一个地方,并且将被相同的variable ab 指向(不同于swap() 中的变量)

    要交换,您需要在 swap() 函数中交换该内存的内容,以便它反映在 main() 函数中。

    回想一下,在使用指针进行交换时,发送地址并通过取消引用(*p*q)实际交换内容。

    【讨论】:

      猜你喜欢
      • 2018-04-17
      • 1970-01-01
      • 2021-11-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多