如何写一个获取值的函数

例子:

void Get1(int nNum)
{
	nNum = 4;
}

int _tmain(int argc, _TCHAR* argv[])
{
	
	int nNum = 10;

	Get1(nNum);
	printf("nNum1=%d\n", nNum);

	system("pause");
	return 0;
}

从函数里面修改传入的值,但是输出时函数值不变,为什么,这是因为参数传递时传入的并不是原值的地址,而是地址的拷贝

将代码改成下面这个样子:

void Get1(int nNum)
{
	printf("Get1:%p\n", &nNum);
	nNum = 4;
}

int _tmain(int argc, _TCHAR* argv[])
{
	
	int nNum = 10;
	printf("nNum:%p\n", &nNum);

	Get1(nNum);
	printf("nNum1=%d\n", nNum);
	system("pause");
	return 0;
}

可以看出传进去的参数值的地址和原值的地址已经发生了变化,所以在里面改变值不会对外面造成任何影响


如果你想改变值,可以使用引用和指针:

void Get2(int &nNum)
{
	printf("Get2:%p\n", &nNum);
	nNum = 4;
}

void Get3(int *nNum)
{
	printf("Get2:%p\n", nNum);
	*nNum = 5;
}

int _tmain(int argc, _TCHAR* argv[])
{
	
	int nNum = 10;
	printf("nNum:%p\n", &nNum);

	Get1(nNum);
	printf("nNum1=%d\n", nNum);

	Get2(nNum);
	printf("nNum2=%d\n", nNum);
	
	Get3(&nNum);
	printf("nNum3=%d\n", nNum);

	system("pause");
	return 0;
}


可以看出引用和指针情况下传入的地址与原值地址一样,所以在函数里改变值可以对原值造成影响


当然下面3种情况也是可以做到获取需要的值:

int Get4()
{
	int i = 6;
	return i;
}

int& Get5()
{
	int i = 6;
	return i;
}

int* Get6()
{
	int i = 7;
	return &i;
}

int _tmain(int argc, _TCHAR* argv[])
{
	int nNum4 = Get4();
	printf("nNum4=%d\n", nNum4);

	int &nNum5 = Get5();
	printf("nNum5=%d\n", nNum5);

	int *pNum6 = Get6();
	printf("nNum6=%d\n", *pNum6);

	system("pause");
	return 0;
}
这里可以看出返回值是什么类型调用时就用什么类型的接收

实际项目应用

假如有一个结构体:

typedef struct tagTtInfo
{    BOOL bEnable;    
     int  nIP;          //IP    
     int nMask;        //子网掩码    
     int  nGateWay;   //网关
public:
     tagTtInfo()
     {
         memset( this ,0 ,sizeof( tagTtInfo) );
     }
}Tinfo;

写一个实现获取这个结构体值的方法:

方法1:使用void Get(Tinfo& tinfo),void Get(Tinfo* ptinfo)在内部赋值实现

方法2:Tinfo Get()实现(当然也可以用Tinfo &Get(),Tinfo *Get()),使用时这样调用Tinfo tinfo =  Get();

总结:

1、写获取值的Get函数时如果利用形参在内部赋值实现的则要传入引用或指针,或者利用返回值实现

2、返回值形式int Get4(),int& Get5(),int* Get6()的函数,调用时返回值是什么类型就用什么类型接收

3、返回值为指针类型的,使用时通常使用memcpy拷贝一份,再进行操作,而不是直接进行使用

如下:

Tinfo *pinfo = (Tinfo *)Get();

如果直接对pinfo操作,因为指针指向的是别人传过来的东西,可能存在被别人释放的情况,一旦被别人释放,那么pinfo为NULL,对其操作通常会

造成程序崩溃

正确处理如下:

Tinfo *pinfo = (Tinfo *)Get();
ASSERT(pinfo);
Tinfo info;
memcpy(&info,pinfo,sizeof(Tinfo))

然后对info进行操作就没问题了


附:

常犯的错误案例:

void GetString(CString str)
{   
    str = _T("Hello world");
    //还有使用format的
}
CString strtmp;
GetString(strtmp);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值