使用C通过引用传递
我知道,当您通过引用传递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 =
#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标准之前就有单独的类型),但如果大小兼容,编译器将执行赋值。大多数人也会对此发出警告。非常感谢你的详细解释,这有助于形象化正在发生的事情。