我可以使用仅交换基址的函数交换两个矩阵,而不必逐个交换元素吗?

时间:2019-05-21 23:46:39

标签: c function pointers reference

摘要

研究指针时只是一个疑问,我可以使用一个函数交换两个矩阵而无需在其中交换元素吗?

我已经使用malloc动态创建了2个矩阵,并在main()中声明了其元素的值。因此,我可以这样交换:

(逐个元素交换)

void swapMatrix(int** a, int** b){
    for(int i = 0; i< row; i++){
        for(int j = 0; j< col; j++){
            int tmp = a[i][j];
            a[i][j] = b[i][j];
            b[i][j] = tmp;
        }
    }
}
...
int main() {
...
print(M1);
swapMatrix(M1, M2);
print(M1);
...

(逐行交换)

void swapMatrix(int** a, int** b){
    int* tmp = *a;
    *a = *b;
    *b = tmp;
    for (int i = 0; i<col; i++){
        int* tmp = *(a+i);
        *(a+i) = *(b+i);
        *(b+i) = tmp;
    }
}
...
int main() {
...
print(M1);
swapMatrix(M1, M2);
print(M1);
...

尝试

但是有没有办法将矩阵指针更改为指针地址?我尝试了以下代码:

我)

void swapMatrix(int** a, int** b){
    int** tmp = a;
    a = b;
    b = tmp;
}
...
int main() {
...
print(M1);
swapMatrix(M1, M2);
print(M1);
...

它已编译,但是当我验证其元素时,它们都没有真正交换

II)

void swapMatrix(int*** a, int*** b){
    int*** tmp = a;
    a = b;
    b = tmp;

...
int main() {
...
print(M1);
swapMatrix(&M1, &M2);
print(M1);
...

同样,它进行了编译,但是当我验证其元素时,没有一个真正被交换。

我应该如何实现该功能,以便仅更改指向指针地址的指针即可交换整个矩阵?可能吗?实际上,我不太了解为什么我的尝试没有奏效。如果您能解释细节,我将不胜感激。

2 个答案:

答案 0 :(得分:0)

不,那不可能。您不能选择变量的地址或对其进行修改。

答案 1 :(得分:0)

如果M1和M2是指向矩阵的指针,则选项1中的swapMatrix将起作用,但指针操作略有不同。您需要交换ab所指向的值(即每个矩阵的地址),但是您只是交换ab(即更改您的本地参数所指向的矩阵指针)。尝试类似的东西:

void swapMatrix(int** a, int** b){
    int* tmp = *a;
    *a = *b;
    *b = tmp;