C: переключать указатели на целые числа - PullRequest
0 голосов
/ 19 мая 2011

Я хочу написать метод, который использует два указателя на целые и изменяет значения, на которые они указывают. Что-то вроде:

int main() {
    int a = 3;
    int b = 1;
    change(&a, &b);
    return 0;
}

void change(int *a, int *b) {
    int t = a;
    *a = *b;
    *b = *t;
}

У меня проблема с пониманием того, как сохранить копию a и указать на нее из b позже.

Ответы [ 4 ]

2 голосов
/ 19 мая 2011

Код для change должен быть:

void change(int *a, int *b) {
    int t = *a;
    *a = *b;
    *b = t;
}

Обратите внимание, что для доступа к значению всегда необходимо использовать *X, поэтому сначала t содержит значение, на которое указывает a, и т. Д.

2 голосов
/ 19 мая 2011

Вы делаете это так:

int temp = *a; // remember actual value "a" points to
*a = *b; // copy value "b" points to onto value "a" points to (will overwrite that value, but we have a copy in "temp")
*b = temp; // now copy value "a" originally pointed to onto value "b" points to
1 голос
/ 19 мая 2011

* Разыменование указателя, это все равно, что возвращать указанную переменную.Таким образом, сохранение значения в разыменованном указателе приведет к тому, что это значение будет сохранено в памяти, на которую он указывает.Так что просто разыменуйте оба указателя и работайте исключительно с числами, нет необходимости менять сами указатели.

void change(int *a, int *b) {
    int t = *a;
    *a = *b;
    *b = t;
}

Действительно, потому что вы использовали вызов по значению для аргументов функции, заменяющейАдреса памяти в указателях внутри «change» вообще не будут влиять на переменные внутри main.

0 голосов
/ 19 мая 2011

В

void change(int *a, int *b) {
    int t = a;
    *a = *b;
    *b = *t;
}

Вы не заметили, что тип a равен int *, а тип t - int, поэтому вы не можете просто назначить a до t.

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