指针作为参数传递时,仅仅作为一个副本
#include "stdafx.h"
#include <iostream>
using namespace std;
void Test(int *p)
{
cout<<endl;
cout<<"3"<<" p = "<<p<<" *p = "<<*p<<" &p = "<<&p<<endl;
*p=7;
cout<<"4"<<" p = "<<p<<" *p = "<<*p<<" &p = "<<&p<<endl;
int a =9;
p = &a;
cout<<"5"<<" p = "<<p<<" *p = "<<*p<<" &p = "<<&p<<endl;
cout<<endl;
}
int main()
{
int a = 5;
int *p;
p = &a;
cout<<"1"<<" p = "<<p<<" *p = "<<*p<<" &p = "<<&p<<endl;
Test(p);
cout<<"2"<<" p = "<<p<<" *p = "<<*p<<" &p = "<<&p<<endl;
system("pause");
return 0;
}
1 p = 0017FBF0 *p = 5 &p = 0017FBE4
3 p = 0017FBF0 *p = 5 &p = 0017FB0C //作为参数的函数内部p的地址已经改变,但在函数作用范围内始终不变
4 p = 0017FBF0 *p = 7 &p = 0017FB0C
5 p = 0017FAFC *p = 9 &p = 0017FB0C
2 p = 0017FBF0 *p = 7 &p = 0017FBE4 //仍然指向原来的位置
指针和引用作为函数参数传递时的比较
#include "stdafx.h"
#include <iostream>
using namespace std;
void swap1(int *p,int *q){
cout<<"3"<<" p = "<<p<<" *p = "<<*p<<" &p = "<<&p<<endl;
cout<<"3"<<" q = "<<q<<" *q = "<<*q<<" &q = "<<&q<<endl;
int tmp;
tmp=*p;
*p=*q;
*q=tmp;
cout<<"4"<<" p = "<<p<<" *p = "<<*p<<" &p = "<<&p<<endl;
cout<<"4"<<" q = "<<q<<" *q = "<<*q<<" &q = "<<&q<<endl;
}
void swap2(int &a,int &b){
cout<<"c"<<" a = "<<a<<" &a = "<<&a<<endl;
cout<<"c"<<" b = "<<b<<" &b = "<<&b<<endl;
int tmp;
tmp=a;
a=b;
b=tmp;
cout<<"d"<<" a = "<<a<<" &a = "<<&a<<endl;
cout<<"d"<<" b = "<<b<<" &b = "<<&b<<endl;
}
int main()
{
int a = 5,b=7;
int &aa=a,&bb=b;
int *p,*q;
p = &a;q=&b;
cout<<"1"<<" p = "<<p<<" *p = "<<*p<<" &p = "<<&p<<endl;
cout<<"1"<<" q = "<<q<<" *q = "<<*q<<" &q = "<<&q<<endl;
swap1(p,q);
cout<<"2"<<" p = "<<p<<" *p = "<<*p<<" &p = "<<&p<<endl;
cout<<"2"<<" q = "<<q<<" *q = "<<*q<<" &q = "<<&q<<endl;
cout<<endl;
cout<<"a"<<" aa = "<<aa<<" &aa = "<<&aa<<endl;
cout<<"a"<<" bb = "<<bb<<" &bb = "<<&bb<<endl;
cout<<"a"<<" a = "<<a<<" &a = "<<&a<<endl;
cout<<"a"<<" b = "<<b<<" &b = "<<&b<<endl;
swap2(aa ,bb);
cout<<"b"<<" a = "<<a<<" &a = "<<&a<<endl;
cout<<"b"<<" b = "<<b<<" &b = "<<&b<<endl;
system("pause");
return 0;
}
1 p = 0035F808 *p = 5 &p = 0035F7D8
1 q = 0035F7FC *q = 7 &q = 0035F7CC
3 p = 0035F808 *p = 5 &p = 0035F6F0 //指针进入函数体的是一个副本
3 q = 0035F7FC *q = 7 &q = 0035F6F4
4 p = 0035F808 *p = 7 &p = 0035F6F0
4 q = 0035F7FC *q = 5 &q = 0035F6F4
2 p = 0035F808 *p = 7 &p = 0035F7D8 //仍然指向原来的位置
2 q = 0035F7FC *q = 5 &q = 0035F7CC
a aa = 7 &aa = 0035F808 //a,aa=&a的地址都是相同的
a bb = 5 &bb = 0035F7FC
a a = 7 &a = 0035F808
a b = 5 &b = 0035F7FC
c a = 7 &a = 0035F808 //在函数体内地址依然相同
c b = 5 &b = 0035F7FC
d a = 5 &a = 0035F808
d b = 7 &b = 0035F7FC
b a = 5 &a = 0035F808
b b = 7 &b = 0035F7FC