#include"iostream" //A程序
using namespace std;
int * f(int *p)
{
p=NULL;
return p;
}
main()
{
int q=5;
int *s;
s=&q;
cout<<s<<endl;
cout<<&q<<endl;
s=f(&q);
cout<<s<<endl;
cout<<&q<<endl;
}
从结果可以看出 虽然s=&q, 但之后s的改变并未对&q造成影响,2个指针指向同一地址,将其中一个改变(地址改变),另一个也不会变(是地址不会变)
#include"iostream" // B程序
using namespace std;
void f(int *p)
{
*p=4;
cout<<*p<<endl;
}
main()
{
int q=5;
int *s;
s=&q;
f(&q);
cout<<q<<endl;
cout<<*s<<endl;
}
结果为:
4
4
4
对比上一个A程序,2个指针指向同一地址,但若函数中进行的操作是改变指针所指向的值,函数结束后2个指针所指向的值都改变,这和指针传值swap(a,b)可以实现交换原理一致,指针的传值交换,无法交换
void swap(int *a,int *b)
{
int *temp;
temp=a;
a=b;
b=temp;
}
若swap函数是对a和b所指向的值进行交换,不是单纯的交换指针,可以实现交换
void swap(int *a,int *b)
{
int temp;
temp=*a;
*a=*b;
*b=temp;
}
#include"iostream" //C程序
using namespace std;
void f(int *p)
{
p=NULL;
cout<<p<<endl;
}
main()
{
int q=5;
cout<<&q<<endl;
f(&q);
cout<<&q<<endl;
}
这里相当于传值,形参的改变不会对实参造成影响,从1程序可以解释:就算2个指针指向同一地址,将其中一个改变,另一个也不会变
f(&q)中进行的操作可以认为是:将&q复制了一份拷贝(与&q地址一样),将这份拷贝进行了处理,函数结束后,只是对拷贝进行了处理,&q没有并没有变,这和利用传值交换2个值是一样的
#include"iostream" //D程序
using namespace std;
void f(int *p)
{
*p=4;
cout<<*p<<endl;
}
main()
{
int q=5;
f(&q);
cout<<q<<endl;
}
结果为:
4
4
可以看出 如果函数中指针所指向的值发生改变,函数结束后值就发生了改变