以下程序,对比说明了函数调用指针时,参数为*p、*&p的区别
样式上的区别在于函数调用指针的时候参数写的是 *p 还是*&p。
示例代码如下:
#include<iostream>
#include<stdio.h>
using namespace std;
void change2(int *x){
cout<<"change2: x->"<<x<<endl;//x就是p形参,x的值就是a的地址
cout<<"change2: &x->"<<&x<<endl;//&x就是x的地址
cout<<"change2:*&x->"<<*&x<<endl;//*&x就是x的地址指向的值,也就是a的地址
++x;
}
void change1(int *&x){
cout<<"change1: x->"<<x<<endl;//x就是p实参,x的值就是a的地址。可以理解为是*(&x),传进来的是p本身
cout<<"change1: &x->"<<&x<<endl;//&x就是x的地址
cout<<"change1:*&x->"<<*&x<<endl;//*&x就是x的地址指向的值,也就是a的地址
++x;
}
int main(){
int a = 10,b = 20;
int *p1 = &a,*p2 = &b;
// cout<<*p<<endl;
cout<<"&a:"<<&a<<",p1:"<<p1<<endl;
change1(p1);
cout<<"p1 after change1:"<<p1<<endl;
cout<<endl<<endl;
// p = a;
cout<<"&b:"<<&b<<",p2:"<<p2<<endl;
change2(p2);
cout<<"p2 after change2:"<<p2<<endl;
// cout<<*p<<endl;
return 0;
}
测试结果如下:
我们可以看到,同样是指针,传入参数形式为为*p、*&p的函数里并进行自加后,结果是不同的。
这说明,如果不写&,传入的指针就是形参,类比于main函数的a、b两个变量传入void swap(int x,int y)函数一样,只是把main函数里的a和b的值赋值给x、y而已,相应的交换的数值是x、y的数值罢了,对于main函数里的a、b是不会交换的;
而写了&的函数,就像main函数的a、b两个变量传入void swap(int &x,int &y)交换main函数a、b两个变量值,以地址的形式传入便是a、b的实际地址,并不是把a、b的值赋给x、y,而是把a这个变量以名为x、b这个变量以名为y的方式在函数里进行交换,交换的依然是a和b,自然会将main函数的a、b两个变量的值进行交换了。
简言之:x的值是a的地址,&x是x的地址,而*&x则是x的地址的值,也就是a的地址(地址的地址)。
如果不传递地址符&,则为指针形参;如果传递了地址符&,则为指针实参。
指针形参指的是仅仅传入指针的值而非指针的地址;指针实参指的是传入的是指针的地址。
好比当你在main函数里声明p = &a,然后函数调用p,当调用方式为*p1,p1为a的地址但是p1的地址已经是新的地址而不是p的地址了,也就是说p1和p不是同一个指针变量只是单纯的p1=p,*p1 = *p而已,但是&p1!=&p;
而同样是在main函数里声明p = &a,调用方式为*&p2的时候,p2为a的地址,而且p2的地址和p的地址是一致的,p2其实就是p本身,p2和p是同一个指针变量,此时才是p2=p,*p2 = *p而已,而且&p2=&p。
只要变量的地址是一致的(即:&a = &b),b和a就是同一个变量,不管这个是普通的变量还是指针变量,原理是一致的。