如何按地址交换两个数字?

时间:2019-10-06 08:42:10

标签: c

#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。 那么交换两个地址的正确方法是什么?

4 个答案:

答案 0 :(得分:1)

p = ...从未在函数调用中持续存在。像C语言中的所有其他内容一样,如果您想更改调用者的数据,请取消引用所给的指针。 k应该是int *,分配应该是int *k = *a; *a = *b; *b = k;。而已。另请注意,这对原始ab的更改没有任何变化。此时您所有的交换都是指针值。

此代码交换两个整数

#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 

variable initialized

这里ab是两个存储位置。假设a10000000,而b10010000。因此,在我们写入a = 3 , b = 6之后,值3会在10000000的存储位置610010000中占据位置。现在,

*x=&a,*y=&b;

pointers points to variable

意味着,x是一个整数指针,其整数变量a的地址为10000000,而y的地址为b的地址是10010000。请注意,xy也是变量,可以将地址存储为任何整数变量的值。 xy在内存中有位置,可以说1100000011011111。现在,

fun(&x,&y);

function called

您正在将xy的地址传递给函数fun。看起来像fun(11000000, 11010000)。 请注意,您没有传递ab的地址!在函数fun中,这些地址位于a(为清楚起见,pa)和b(为清楚起见,pb)中,

void fun(int **a,int **b)
{
    int **k;
    k = a;
    a = b;
    b = k;
}

pointers swapped

在这里,apa),bpb)和k是指针的指针。它们可以保存整数指针的地址。apa)和bpb)分别保存x和{{1} } 分别 。现在,当您交换ya)和pab)时,实际上是交换了pb({{1 }}和apa)。因此,函数b完成后,它的执行pbfun)指向apay)指向{{1 }}。在主要功能上,实际上什么也没有发生。当您执行以下操作时,

b

它交换pbx中的地址,它们现在指向void fun(int **a, int **b) { int *k; k=*a; *a = *b; *b = k; } x(在主函数中)。 x and y swaps

现在最终版本来了!如果您要执行以下操作,它实际上会让您感到开心,

y

enter image description here

希望您能理解。编码愉快!

答案 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,因为这些是您交换的变量,而不是ab