使用C传递参考

时间:2011-12-26 04:50:44

标签: c pointers pass-by-reference swap

据我所知,当你通过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 个答案:

答案 0 :(得分:6)

你忘了在功能中取消引用你的指针。因此,您最终会重新分配本地指针值,而不是更改指向的实际值,并且它没有任何效果。

因此,请使用*取消引用运算符:

int temp = *i;
*i = *j;
*j = temp;

答案 1 :(得分:4)

我想知道为什么你没有得到任何编译器警告/错误。您需要在函数中取消引用您的引用:

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

原因是ij内的swapnum()是调用函数时原始变量的地址。因此,当您仅使用ij时,您将获得变量的地址,而不是内容。以下是对正在发生的事情的看法:

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)
        -----------------

答案 2 :(得分:3)

swapnum函数中,您只分配了此函数的局部变量ij。这不会对此功能产生任何影响。你应该试试:

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

答案 3 :(得分:2)

它(希望)崩溃,因为在这个函数中:

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

ij是指针,temp是int。您不能指定指向int的指针。如果您想交换ij中的值,请执行以下操作:

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

答案 4 :(得分:1)

你想:

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

答案 5 :(得分:1)

swapnum中,您正在交换指针(也是int值)。试试这个:

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

答案 6 :(得分:0)

您的swapnum()实现有点不合适。该函数采用2(int *)参数。也就是说,i和j是存储a和b的引用的整数指针。当你做int temp = i;你实际上是指定一个指向整数变量的指针(这是不正确的),然后代码片段不是交换值,而是使用地址。这就是你需要的

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