您的位置:首页 > 其它

如何写一个获取值的函数

2016-12-13 17:11 274 查看
例子:

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);
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐