Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用C通过引用传递_C_Pointers_Pass By Reference_Swap - Fatal编程技术网

使用C通过引用传递

使用C通过引用传递,c,pointers,pass-by-reference,swap,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 =

我知道,当您通过引用传递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;
}
#包括
无效交换(int*i,int*j){
int-temp=i;
i=j;
j=温度;
}   
内部主(空){
INTA=10;
int b=20;
swapnum(a&b);
printf(“A是%d,B是%d\n”,A,B);
getchar();
getchar();
返回0;
}

您忘了在函数中取消对指针的引用。因此,您最终会重新指定本地指针值,而不是更改所指向的实际值,并且没有任何效果

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

int temp = *i;
*i = *j;
*j = temp;
你想要:

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

swapnum
中,交换指针(也是int值)。请尝试以下方法:

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

swapnum
函数中,您仅分配此函数的本地变量
i
j
。除此功能外,这不会产生任何影响。你应该试试:

void swapnum(int *i, int *j) {
    int temp = *i;
    *i = *j;
    *j = temp;
}
它(希望)崩溃,因为在这个函数中:

void swapnum(int *i, int *j) {
    int temp = i;
    i = j;
    j = temp;
}
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;
}

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

void swapnum(int *i, int *j) {
    int temp = i;
    i = j;
    j = temp;
}
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()的实现有点不正确。该函数接受2个(int*)参数。也就是说,i和j是存储a和b的引用的整数指针。当你做int-temp=i;实际上,您将指针指定给整型变量(这是不正确的),然后代码段不交换值,而是使用地址进行处理。这就是你需要的

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

如果您使用的是相当现代的编译器,您应该得到一个关于
inttemp=i。注意这些…他们可以,但你在正确的轨道上。感谢大家的快速响应时间!每个人都很乐于助人,读了大家写的东西后,我确实理解了问题所在。我的编译器确实警告过我,尽管我认为我可以将指针的地址存储到int数据类型中。我想这是不正确的。我们在C中称之为指针,但在许多其他语言中称之为引用。所以在swapnum()函数的第4行。。。i=j,让我正确理解,这是一行有效的代码,对吗?如果我是正确的,它会把j的地址存储到I中。所以在我的脑海里,我指向j。这是正确的思考方式吗?如果是这样的话,为什么这只是本地的,并且没有变化反映在main中???@Fred-注意,如果启用了编译器警告,那么它们会选择这个,因为您将
int*i
(指针)分配给
int temp
(不是指针)。始终以启用警告为目标进行编译,这样可以避免无休止的问题(gcc上的
-Wall-Werror
)。指针并不完全是
int
s(早在89标准之前就有单独的类型),但如果大小兼容,编译器将执行赋值。大多数人也会对此发出警告。非常感谢你的详细解释,这有助于形象化正在发生的事情。