#include<stdio.h>
void fun(int **a,int **b)
{
int **k;
k=a;
a=b;
b=k;
}
int main()
{
int a=3,b=6,*x=&a,*y=&b;
fun(&x,&y);
printf("%d %d",a,b);
return 0;
}
我交换了地址,为什么它仍然输出3 6。 那么交换两个地址的正确方法是什么?
答案 0 :(得分:1)
p = ...
从未在函数调用中持续存在。像C语言中的所有其他内容一样,如果您想更改调用者的数据,请取消引用所给的指针。 k
应该是int *
,分配应该是int *k = *a; *a = *b; *b = k;
。而已。另请注意,这对原始a
和b
的更改没有任何变化。此时您所有的交换都是指针值。
此代码交换两个整数
#include<stdio.h>
void fun(int *a,int *b)
{
int k = *a;
*a = *b;
*b = k;
}
int main()
{
int a=3,b=6;
printf("%d %d\n",a,b);
fun(&a,&b);
printf("%d %d\n",a,b);
return 0;
}
输出
3 6
6 3
因此,此代码交换两个指针。它们指向的整数(a和b)保持不变。
#include<stdio.h>
void fun(int **a,int **b)
{
int *k = *a;
*a = *b;
*b = k;
}
int main()
{
int a=3,b=6,*x=&a,*y=&b;
printf("%d %d\n",a,b);
printf("%d %d\n",*x,*y); // note using x and y with deref
fun(&x,&y);
printf("%d %d\n",a,b);
printf("%d %d\n",*x,*y); // note using x and y with deref
return 0;
}
输出
3 6
3 6
3 6
6 3
答案 1 :(得分:1)
让我们从第一个表达式中弄清楚。
int a=3,b=6,*x=&a,*y=&b;
现在将其分解。
int a = 3, b = 6
这里a
和b
是两个存储位置。假设a
是10000000
,而b
是10010000
。因此,在我们写入a = 3 , b = 6
之后,值3
会在10000000
的存储位置6
和10010000
中占据位置。现在,
*x=&a,*y=&b;
意味着,x
是一个整数指针,其整数变量a
的地址为10000000
,而y
的地址为b
的地址是10010000
。请注意,x
和y
也是变量,可以将地址存储为任何整数变量的值。 x
和y
在内存中有位置,可以说11000000
和11011111
。现在,
fun(&x,&y);
您正在将x
和y
的地址传递给函数fun
。看起来像fun(11000000, 11010000)
。
请注意,您没有传递a
和b
的地址!在函数fun
中,这些地址位于a
(为清楚起见,pa
)和b
(为清楚起见,pb
)中,
void fun(int **a,int **b)
{
int **k;
k = a;
a = b;
b = k;
}
在这里,a
(pa
),b
(pb
)和k
是指针的指针。它们可以保存整数指针的地址。a
(pa
)和b
(pb
)分别保存x
和{{1} } 分别 。现在,当您交换y
(a
)和pa
(b
)时,实际上是交换了pb
({{1 }}和a
(pa
)。因此,函数b
完成后,它的执行pb
(fun
)指向a
,pa
(y
)指向{{1 }}。在主要功能上,实际上什么也没有发生。当您执行以下操作时,
b
它交换pb
和x
中的地址,它们现在指向void fun(int **a, int **b)
{
int *k;
k=*a;
*a = *b;
*b = k;
}
和x
(在主函数中)。
现在最终版本来了!如果您要执行以下操作,它实际上会让您感到开心,
y
希望您能理解。编码愉快!
答案 2 :(得分:0)
尝试将其替换为fun()的* a和* b指向的值
void fun(int **a, int **b)
{
int k;
k = **a;
**a = **b;
**b = k;
}
答案 3 :(得分:0)
代替此:
int **k;
k=a;
a=b;
b=k;
您应该尝试过:
int *k;
k=*a;
*a=*b;
*b=k;
是的,您应该打印*x
和*y
,因为这些是您交换的变量,而不是a
和b
。