C++传址调用问题

来源:百度知道 编辑:UC知道 时间:2024/06/20 10:03:05
#include<iostream.h>
void main()
{
int a=3,b=5;
void swap(int *,int *);
swap(&a,&b);
cout<<"a="<<a<<" , b="<<b<<endl;
}
void swap(int *n1,int *n2)
{
int temp=*n1;
*n1=*n2;
*n2=temp;
}

上面的调用函数为什么不能改成下面的形式?
void swap(int *n1,int *n2)
{
int *temp;
temp=n1;
n1=n2;
n2=temp;
}
这样写不是交换了地址了吗?但输出结果还是a=3,b=5

想改变ab的值??
要用到引用。。。
void swap(int &a,int &b)函数
这样才可以。。
你下面的函数里面temp本来就是一个指针。
n1也是指针。你就相当于把他们的地址交换了遍
但是a的地址是n2,b的地址是n1.关ab个吊事呀

上面的swap函数里面的是用指针来引用那个内存空间。即把n1指向的空间的内容(a),和n2指向的内容(b)交换了。所有达到了要求

你自己画图。内存模型图。一下子就了解了

swap(int* n1,int* n2) //这里定义了n1,和n2

说明n1,n2动态(系统默认)局部变量,如果swap完成调用n1,n2自动消亡。

n1接收是a的地址,n2接收b的地址。

通过
void swap(int *n1,int *n2)
{
int *temp;
temp=n1;
n1=n2;
n2=temp;
}
这时n1中放的是b的地址,n2存放的是a的地址。并未改变主程序中a的存方地址&a,也并未改变&a地址中所存放的变量值,第一种方式是改变了&a地址中存方的变量的值,同理&b的地址未改变,变量值也未改变。

你所做的只是将&a地址和&b地址,通过函数调用方式,传给局部变量n1,n2,并交换了n1,n2中存放的地址,随着调用结束,并未对主程序中的a,b变量的值以及地址做任何改动,
所以……

你的函数其实质是 指针变量的传值调用,而非指针所指变量的传址调用,

认识事物要从多方面去理解,

指针已是个变量而已,从这种角度再去看你的函数就能理解了。

因为n1,n2只在swap()内部存在,swap()给n1,n2另外分配空间和地址,函数结束就消失了,这个一般C++的教程上对传值和传指针都有这种说明,

例:
a的地址在=&001
b的地址在=&002
n1的地址在=&003
n2的地址在=&004
n1,