如何写一个获取值的函数
来源:互联网 发布:视频文件旋转角度软件 编辑:程序博客网 时间:2024/05/16 11:59
例子:
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);
0 0
- 如何写一个获取值的函数
- 如何写一个漂亮的strcpy函数
- 如何写一个高质量的函数
- 前段时间写的一个获取腾讯星座的函数
- 如何写一个分段函数
- 写一个函数,获取某张网卡的IP地址
- 怎样写一个获取非行间样式的函数
- 写一个获取非行间样式的函数
- 【C语言】如何写一个参数可变的函数
- 写一个函数求PI的值
- 如何写一个随机洗牌函数
- 写一个memcpy的函数
- 写的一个split函数
- 学习笔记 “写一个函数获取某一张指定的网卡的IP地址”
- 一个MM程序员写的一个函数
- 最近给办公室写的一个网页元素获取函数,支持utf8
- 我写的一个高效递归函数,可用之轻松获取无限级子分类
- 一个获取毫秒的函数
- android BitmapFactory的OutOfMemoryError: bitmap size exceeds VM budget解决方案
- vim命令汇总
- Tomcat WebSocket basic authentication
- fragment刷新状态数据的方法
- 四、泛型与反射的使用总结之反射篇
- 如何写一个获取值的函数
- 字符串是否为回文
- C# 16进制转换为Base64字符串
- CS与BS区别
- java正则该如何表达
- python 3 连接mysql方法
- php打印杨辉三角、金字塔、九九乘法表
- CountDownLatch笔记
- JSP学习之再谈计算器