C语言之函数调用指针参数*p、*&p的使用区别

以下程序,对比说明了函数调用指针时,参数为*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就是同一个变量,不管这个是普通的变量还是指针变量,原理是一致的。

  • 4
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

芣苢的成长之路

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值