如何写一个获取值的函数
2016-12-13 17:11
274 查看
例子:
从函数里面修改传入的值,但是输出时函数值不变,为什么,这是因为参数传递时传入的并不是原值的地址,而是地址的拷贝
将代码改成下面这个样子:
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);
可以看出传进去的参数值的地址和原值的地址已经发生了变化,所以在里面改变值不会对外面造成任何影响
如果你想改变值,可以使用引用和指针:
可以看出引用和指针情况下传入的地址与原值地址一样,所以在函数里改变值可以对原值造成影响
当然下面3种情况也是可以做到获取需要的值:
实际项目应用
假如有一个结构体:
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,对其操作通常会
造成程序崩溃
正确处理如下:
然后对info进行操作就没问题了
附:
常犯的错误案例:
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);
相关文章推荐
- 运行时如何获取运行当前代码所在的函数,一个神奇的宏
- 如何调用MFC中的函数打开一个系统资源面板,获取文件
- Javascript如何用一个优雅的姿势通过getStyle函数来获取元素的样式
- 如何获取一个对话控件的指针
- 如何利用代码从网站上获取一个文件的大小,并且下载时不出现保存提示框
- 如何编写一个过滤掉HTML代码的函数?
- 如何让一个函数返回多个值(C#)
- [收藏]如何构造一个main以外执行的函数
- JAVA 程序中如何拷贝一个目录下的文件及子目录到另一个目录,如何获取系统环境变量等...
- 自己写一个strcpy(char*dest,char*src),如何在函数内部实现防御性溢出?
- 关于hook设置函数如何支持多核CPU的一个说明
- 在DB2 中创建一个获取汉字拼音首字母的SQL 函数
- 在一个函数中如何知道调用者(Python)
- 请问如何可以获取代码中函数与函数的调用关系.
- 如何用DOS命令,获取一个目录下的文件数目
- 在vb中使用Iphlpapi.dll获取网络信息 第四章 第二节 一个重要函数
- 收藏——在C#使用SHGetFileInfo获取(管理)文件或者文件夹图标(C#封装Win32函数的一个例子)
- CodeProject - 在C#使用SHGetFileInfo获取(管理)文件或者文件夹图标(C#封装Win32函数的一个例子)
- 一个如何从某一天格式(2005-12-31)得到该天的下一天格式(2006-01-01)的函数
- 如何让一个函数返回多个值(C#)