Могу ли я поменять местами две матрицы с функцией, просто поменяв ее базовый адрес, не меняя элемент за элементом? - PullRequest
0 голосов
/ 22 мая 2019

Резюме

При изучении указателей возникло лишь сомнение: можно ли поменять две матрицы с помощью функции, не меняя элемент в элементе?

Я создал 2 матрицы динамически, используя malloc, и объявил значения его элементов в 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);
...

Попытки

Но есть ли способ просто изменить указатель матрицы на адрес указателя?Я попытался следующие коды:

I)

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 голосов
/ 22 мая 2019

Если M1 и M2 являются указателями на ваши матрицы, тогда swapMatrix в варианте 1 будет работать, за исключением операций с указателями, которые немного отключены.Вам нужно поменять местами значения, на которые указывают a и b (то есть адрес каждой матрицы), но вы просто меняете значения a и b (т.е. меняете указатель на матрицу вашего локального параметрауказывает на).Попробуйте что-то вроде:

void swapMatrix(int** a, int** b){
    int* tmp = *a;
    *a = *b;
    *b = tmp;
0 голосов
/ 22 мая 2019

Нет, это невозможно.Вы не можете выбрать адреса переменных или изменить их.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...