指针变量作为函数参数

版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/m0_37857539/article/details/83145410

函数的参数不仅可以是整型、实型、字符型等数据,还可以是指针类型的数据。下面分析指针变量作为函数参数的优势。
例子:编写函数实现对两个变量的值进行传递。
函数1:

void Swap1(int a,int b)
{
	int tmp=a;
	a=b;
	b=tmp;
}

int main()
{
	int a=10;
	int b=20;
	Swap(a,b);
	printf("%d,%d\n",a,b);
	return 0;
}

在这里插入图片描述
说明:该函数采用值传递方式,如上图,在main函数中的实参变量a,b和Swap1中的形参变量a,b分别占用不同的存储单元,该Swap1中改变了形参变量的值但并不会影响实参变量的值,所以该函数不能实现对两个变量值的交换。
函数2:

void Swap2(int *p1,int *p2)
{
	int *tmp=p1; 
	p1=p2;
	p2=tmp;
}

int main()
{
	int a=10;
	int b=20;
	Swap2(&a,&b);
	printf("%d,%d\n",a,b);
	return 0;
}

在这里插入图片描述

在这里插入图片描述
说明:函数Swap2的两个形参p1、p2是指针变量,主函数调用时将a和b的地址分别赋给int *变量p1、p2,但在函数中p1、p2未被解引用,所以只是完成了p1、p2值的交换,并不能通过该函数实现对两个变量的交换。
函数3:

void Swap3(int *p1,int *p2)
{
	int *tmp;
	*tmp=*p1;      //此语句有问题
	*p1=*p2;
	*p2=*tmp;
}

说明:*p就是a,是整形变量,而 * tmp是指针变量tmp所指向的变量。但我们并没有给tmp赋值,tmp中没有确定的值,因此tmp所指向的单元也是不可预见的。所以,对 * tmp赋值就是向一个未知的存储单元赋值,而这个未知的存储单元可能存储着一个有用的数据,这样就有可能破坏系统的正常工作状态。我们把这样没有访问权限的指针(地址)的指针称为野指针或悬挂指针。
函数4:

void Swap4(int *p1,int *p2)
{
	int tmp;
	tmp=*p1;
	*p1=*p2;
	*p2=tmp;
}

在这里插入图片描述
说明:该函数在Swap3的基础上,将 * p1的值赋给与 * p1相同的数据类型,即用整型变量tmp作为临时辅助变量实现了* p1和* p2的交换。
在这里插入图片描述

展开阅读全文

结构体指针作为函数参数!!!

12-16

需要用到的一个接口函数,第4个参数是结构体,请问怎么传参???rnrnrn下面是接口函数定义:rnrn#define MAX_TIMESEGMENT 4rnrn[code=C/C++]rnint __stdcall SetXXXXX(rn int _iLogonID //登陆的返回值rn int iChannelNum //通道号rn int iWeekday //星期,星期日到星期六为0~6rn PNVS _strScheduleParam[MAX_TIMESEGMENT] //时间模板,支持最大4个时间段rn );rn[/code]rnrn下面是那个结构体的定义:rnrn[code=C/C++]rn typedef structrn unsigned short iStartHour; //开始时0-23rn unsigned short iStartMin; //开始分0-59rn unsigned short iStopHour; //结束时0-23rn unsigned short iStopMin; //结束分0-59rn unsigned short iRecordMode; //使能rn )NVS, *PNVS;rn[/code]rnrn那么我要调用这个函数接口,第四个参数应该怎么传参???rnrnSetXXXXX(1, 5, 1, [color=#FF0000]???[/color]);[color=#008000]//第四个参数怎么传???[/color]rnrnrn下面是我自己写的传法,但每次都调用失败。rn[code=C/C++]rnPNVS ps[4];rnfor (int i = 0; i != 4; ++i)rnrn ps[i] = new NVS;rnrn//假如我初始化ps[1]rnps[1]->iStartHour = 11;rnps[1]->iStartMin = 33;rnps[1]->iStopHour = 18;rnps[1]->iStopMin = 55; rnps[1]->iRecordMode = 1;rnrnSetXXXXX(1, 5, 1, ps); //这样写???rnrnSetXXXXX(1, 5, 1, &ps[1]);//还是这样写???rnrn目前只有这两种写法可以执行正确,但这个接口函数的返回值是错误的,也就是说设置失败了,请问是不是还有别的传参方法。rnrn[/code]rnrnrn 论坛

临时对象作为函数参数的问题

02-23

记得C++标准中临时对象作为右值,与其匹配的copy构造函数的参数应该为const&,因此如果copy构造函数声明中的参数为non const的应用类型,那么就无法实现对临时对象的copy。rn然而下面这段代码在编译时却遇到没有问题,顺利通过了。。想请教一下各位前辈这是什么原因呢?rn另外,如果采用重载“=”的方式,编译就会出错,提示没有匹配的函数。rn[code=c]rnrn#include rnusing std::cout;rnusing std::cin;rnusing std::endl;rntemplate rnstruct auto_ptr_refrnrn public:rn Y*yp;rn auto_ptr_ref(Y*ptr)throw():yp(ptr)rn rnrn rn;rnrntemplate rnclass auto_ptrrnrnprivate:rn T*ap;rnpublic:rn typedef T element_type;rnrn explicit auto_ptr(T*ptr=0) throw():ap(ptr)rn rnrn rn auto_ptr(auto_ptr& rhs)throw():ap(rhs.release())rn rnrn rnrn templatern auto_ptr(auto_ptr&rhs)throw():ap(rhs.release())rn rnrn rnrn auto_ptr& operator=(auto_ptr&rhs) throw()rn rn reset(rhs.release());rn return *this;rn rn templatern auto_ptr& operator=(auto_ptr&rhs)throw()rn rn reset(rhs.release());rn return *this;rn rnrn ~auto_ptr() throw()rn rn delete ap;rn rnrn T* get()const throw()rn rn return ap;rn rn T& operator* ()const throw()rn rn return *ap;rn rn T* operator->() const throw()rn rn return ap;rn rnrn T* release() throw()rn rn T* tmp(ap);rn ap=0;rn return tmp;rn rn void reset(T*ptr=0)throw()rn rn if(ptr!=ap)rn rn delete ap;rn ap=ptr;rn rn rnrn;rnrnint main()rnrn auto_ptrp=auto_ptr();//编译错误rn auto_ptrq(auto_ptr());//编译通过rn return 0;rnrnrnrn[/code] 论坛

没有更多推荐了,返回首页