c语言中调用函数来交换两个变量的值,大家都知道要传入指针
#include <stdio.h>
void swap(int *a,int *b)
{
int i= 0;
i = *a;
*a =*b;
*b = i;
}
void main()
{
unsigned int a=1,b =2;
swap(&c,&d);
printf("a is %d,b is %d\n",a,b);
}
但是有一次做一个题,为了显示我对指针的了解,有了传入二级指针的想法
#include <stdio.h>
void swap(int **a,int **b)
{
int *i=NULL;
i = *a;
*a =*b;
*b = i;
}
void main()
{
unsigned int a=1,b =2;
unsigned int *c=&a,*d=&b;
swap(&c,&d);
printf("a is %d,b is %d\n",a,b);
}
我的意思是既然通过一级指针交换两数的值,那么通过二级指针交换两数的地址,打印的时候相当于打印对方的地址上的数值
如:
a 地址 : 0x00 00 00 01 --> 1
b 地址 : 0x00 00 00 02 --> 2
swap(&c,&d);b 地址 : 0x00 00 00 01 --> 1
a 地址 : 0x00 00 00 02 --> 2
但是总感觉怪怪的,于是编译试了一下
输出结果a is 1,b is 2
从结果看没有成功,但是一时又有点混乱
1.我明白当调用到printf时,其中的a,b是一个值拷贝
2.当给printf拷贝a,b的值时,也需要先取到a,b
到底这些一级二级指针在内存中是怎么排部的,又是怎么寻址a,b的呢
通过如下代码观测
void main()
{
unsigned int a=1,b =2;
unsigned int *c=&a,*d=&b;
// swap(&c,&d);
unsigned int **e =&c,**f=&d;
printf("a is %d,b is %d\n",a,b);
printf("&a is %p,&b is %p\n",&a,&b);
printf("c is %p,d is %p\n",c,d);
printf("&c is %p,&d is %p\n",&c,&d);
printf("e is %p,f is %p\n",e,f);
swap(&c,&d);
printf("a is %d,b is %d\n",a,b);
printf("&a is %p,&b is %p\n",&a,&b);
printf("c is %p,d is %p\n",c,d);
printf("&c is %p,&d is %p\n",&c,&d);
printf("e is %p,f is %p\n",e,f);
}
kevin@ubuntu:~/test$ ./test a is 1,b is 2
&a is 0xbfee1668,&b is 0xbfee166c
c is 0xbfee1668,d is 0xbfee166c
&c is 0xbfee1670,&d is 0xbfee1674
e is 0xbfee1670,f is 0xbfee1674
a is 1,b is 2
&a is 0xbfee1668,&b is 0xbfee166c
c is 0xbfee166c,d is 0xbfee1668
&c is 0xbfee1670,&d is 0xbfee1674
e is 0xbfee1670,f is 0xbfee1674
kevin@ubuntu:~/test$
明显可以看出,swap交换的是地址1670和1674上面的值,
而a,b相当于*(0xbfee1668),*(0xbfee166c)
printf("a is %d,b is %d\n",a,b);
等价于
printf("a is %d,b is %d\n",*(0xbfee1668) , *(0xbfee166c));
如果改为
printf("a is %d,b is %d\n",*c,*d);
== printf("a is %d,b is %d\n",*(0xbfee166c),*(0xbfee1668));
那就对了