关于地址传递问题 c语言高手请进

来源:百度知道 编辑:UC知道 时间:2024/06/17 05:09:56
为什么
void swap (int *a,int *b)
{int t;
t=*a;*a=*b;*b=t;}
main()
{
int i=3,j=5,*p=&i,*q=&j;
swap(p,q);printf("%d %d\n",*p,*q);}


void swap (int *a,int *b)
{int *t;
t=a;a=b;b=t;}
main()
{
int i=3,j=5,*p=&i,*q=&j;
swap(p,q);printf("%d %d\n",*p,*q);}
的结果不一样呢

void swap (int *a,int *b)
{int t;
t=*a;*a=*b;*b=t;} //这个是交换的a和b所指的地址存储的内容
void swap (int *a,int *b)
{int *t;
t=a;a=b;b=t;} //这个是交换的a和b的地址,虽然a和b的地址被交换了,但是它们所指的地址没变

void swap (int *a,int *b)
{int *t;
t=a;a=b;b=t;}

这里a,b都是局部变量,交换a,b的值,不会改变实参的值

void swap (int *a,int *b)
{int t;
t=*a;*a=*b;*b=t;}

这里交换的是a,b指向地址的值,也就是实参的值被修改

非常典型的指针做参数的问题
调用函数void swap(int *a,int *b)时,传递给它两个值 , 如swap(p,q)以后,a和b分别为p和q的一个"拷贝",p!=a,q!=b,对a和b进行操作并不会影响到p和q,但是对*p=*a,*q=*b,即对*a和*b进行操作的时候,实际上就是对*p(即i)和*q(即j)进行操作了
只要记住两点, 指针做参数时,形参并不等于实参,但是形参所指向的地址单元中的内容等于实参指向的地址单元中的内容即,p!=a,q!=b,但是*p=*a,*q=*b
这样说明白吧?

注意星号,附值不对哇,你整么这看不出来呀~不过我是菜鸟啦!

第一个改变的是ab指向的地址的内容,也就是pq,第二个改变的是ab的内容,所以不一样。呵呵。加强对指针的理解:指针和指针指向的内容。看看《C和指针》之类的书就好了。