Передать по ссылке, используя C - PullRequest
2 голосов
/ 26 декабря 2011

Я понимаю, что когда вы передаете по ссылке через функцию в C, параметры функции принимают адрес указателя, который будет изменен.Я не уверен, почему этот пример передачи по ссылке не работает.Кто-нибудь может указать мне правильное направление ....

Это должно вывести своп, но когда я компилирую, своп не происходит, почему этот проход по ссылке не работает?

#include <stdio.h>

void swapnum(int *i, int *j) {
    int temp = i;
    i = j;
    j = temp;
}   

int main(void) {
   int a = 10;
   int b = 20;

   swapnum(&a, &b);
   printf("A is %d and B is %d\n", a, b);
   getchar();
   getchar();

 return 0;
}

Ответы [ 7 ]

6 голосов
/ 26 декабря 2011

Вы забыли разыменовать свои указатели внутри функции. Таким образом, вы в конечном итоге переназначаете значения локального указателя, а не изменяете фактическое значение, на которое указывает указатель, и это не имеет никакого эффекта.

Итак, используйте оператор разыменования *:

int temp = *i;
*i = *j;
*j = temp;
4 голосов
/ 26 декабря 2011

Мне интересно, почему вы не получили никакого предупреждения / ошибки компилятора. Вам нужно разыменовать вашу ссылку в функции:

void swapnum(int *i, int *j) {
    int temp = *i;
    *i = *j;
    *j = temp;
} 

Причина в том, что i и j внутри swapnum() являются адресами исходных переменных при вызове функции. Поэтому, когда вы используете только i или j, вы получаете адрес переменной, а не ее содержимое. Вот идея того, что происходит:

int a = 10;
int b = 20;

        -----------------
0x1000  |  10           |             <-- a
        -----------------
        -----------------
0x1004  |  20           |             <-- b
        -----------------

swapnum(&a, &b);

Тогда внутри swapnum(int *i, int *j):

        -----------------
0x2000  |  0x1000       |             <-- i (*i == 10)
        -----------------
        -----------------
0x2004  |  0x1004       |             <-- j (*j == 20)
        -----------------
3 голосов
/ 26 декабря 2011

В функции swapnum вы присваиваете только переменные i и j, которые являются локальными для этой функции.Это не будет иметь никакого эффекта вне этой функции.Вы должны попробовать:

void swapnum(int *i, int *j) {
    int temp = *i;
    *i = *j;
    *j = temp;
}
2 голосов
/ 26 декабря 2011

Это (надеюсь) сбой, потому что в этой функции:

void swapnum(int *i, int *j) {
    int temp = i;
    i = j;
    j = temp;
}

i и j являются указателями, а temp является int. Вы не можете назначить указатель на int. Если вы хотите поменять местами значения в i и j, сделайте следующее:

void swapnum(int *i, int *j) {
    int temp = *i;
    *i = *j;
    *j = temp;
}
1 голос
/ 26 декабря 2011

В swapnum вы меняете указатели (которые также являются значениями типа int).Попробуйте вместо этого:

void swapnum(int *i, int *j) {
    int temp = *i;
    *i = *j;
    *j = temp;
}
1 голос
/ 26 декабря 2011

Вы хотите:

void swapnum(int *i, int *j) {
    int temp = *i;
    *i = *j;
    *j = temp;
0 голосов
/ 11 января 2012

Ваша реализация swapnum () немного неправильная.Функция принимает 2 (int *) параметра.То есть i и j являются целочисленными указателями, хранящими ссылки a и b.когда вы делаете int temp = i;вы фактически присваиваете указатель на целочисленную переменную (что неверно), а затем вместо замены значений фрагмент кода обыгрывает адреса.Это то, что вам нужно

void swapnum(int *i, int *j) {
    int temp = *i;
    *i = *j;
    *j = temp;
}
...