免费预览已结束,剩余1页可下载查看
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
函数参数的传递问题(指针的指针)(转)函数参数的传递问题(指针的指针)(转)程序1:void mymalloc(char *s) /我想在函数中分配内存,再返回 s=(char *) malloc(100);void main() char *p=null; mymalloc(p); /这里的p实际还是null,p的值没有改变,为什么? if(p) free(p);程序2:void mymalloc(char *s) *s=(char *) malloc(100);void main() char *p=null; mymalloc(&p); /这里的p可以得到正确的值了 if(p) free(p);程序3:#includevoid fun(int *p) int b=100; p=&b;main() int a=10; int *q; q=&a; printf(%dn,*q); fun(q); printf(%dn,*q); return 0;结果为1010程序4:#includevoid fun(int *p) *p=100;main() int a=10; int *q; q=&a; printf(%dn,*q); fun(q); printf(%dn,*q); return 0;结果为10100为什么?-1.被分配内存的是行参s,p没有分配内存2.被分配内存的是行参s指向的指针p,所以分配了内存-不是指针没明白,是函数调用的问题!看看这段:7-4-1指针参数是如何传递内存的?如果函数的参数是一个指针,不要指望用该指针去申请动态内存。示例7-4-1中,test函数的语句getmemory(str, 200)并没有使str获得期望的内存,str依旧是null,为什么?void getmemory(char *p, int num) p = (char *)malloc(sizeof(char) * num);void test(void) char *str = null; getmemory(str, 100); / str仍然为null strcpy(str, hello); /运行错误示例7-4-1试图用指针参数申请动态内存毛病出在函数getmemory中。编译器总是要为函数的每个参数制作临时副本,指针参数p的副本是_p,编译器使_p = p。如果函数体内的程序修改了_p的内容,就导致参数p的内容作相应的修改。这就是指针可以用作输出参数的原因。在本例中,_p申请了新的内存,只是把_p所指的内存地址改变了,但是p丝毫未变。所以函数getmemory并不能输出任何东西。事实上,每执行一次getmemory就会泄露一块内存,因为没有用free释放内存。如果非得要用指针参数去申请内存,那么应该改用“指向指针的指针”,见示例7-4-2。void getmemory2(char *p, int num) *p = (char *)malloc(sizeof(char) * num);void test2(void) char *str = null; getmemory2(&str, 100); /注意参数是&str,而不是str strcpy(str, hello); cout str endl; free(str);示例7-4-2用指向指针的指针申请动态内存由于“指向指针的指针”这个概念不容易理解,我们可以用函数返回值来传递动态内存。这种方法更加简单,见示例7-4-3。char *getmemory3(int num) char *p = (char *)malloc(sizeof(char) * num); return p;void test3(void) char *str = null; str = getmemory3(100); strcpy(str, hello); cout str endl; free(str);示例7-4-3用函数返回值来传递动态内存用函数返回值来传递动态内存这种方法虽然好用,但是常常有人把return语句用错了。这里强调不要用return语句返回指向“栈内存”的指针,因为该内存在函数结束时自动消亡,见示例7-4-4。char *getstring(void) char p = hello world; return p; /编译器将提出警告void test4(void)char *str = null;str = getstring(); / str的内容是垃圾cout str endl;示例7-4-4 return语句返回指向“栈内存”的指针用调试器逐步跟踪test4,发现执行str = getstring语句后str不再是null指针,但是str的内容不是“hello world”而是垃圾。如果把示例7-4-4改写成示例7-4-5,会怎么样?char *getstring2(void) char *p = hello world; return p;void test5(void) char *str = null; str = getstring2(); cout str endl;示例7-4-5 return语句返回常量字符串函数test5运行虽然不会出错,但是函数getstring2的设计概念却是错误的。因为getstring2内的“hello world”是常量字符串,位于静态存储区,它在程序生命期内恒定不变。无论什么时候调用getstring2,它返回的始终是同一个“只读”的内存块。-看看林锐的高质量的c/c+编程,上面讲得很清楚的-对于1和2:如果传入的是一级指针s的话,那么函数中将使用的是s的拷贝,要改变s的值,只能传入指向s的指针,即二级指针-程序1:void mymalloc(char *s) /我想在函数中分配内存,再返回 s=(char *) malloc(100); / s是值参,函数返回后就回复传递前的数值,无法带回分配的结果这个和调用void func (int i) i=1;一样,退出函数体,i指复原的程序2:void mymalloc(char *s) *s=(char *) malloc(100); /这个是可以的等价于void int func(int * pi) *pi=1; pi指针不变,指针指向的数据内容是变化的值参本身不变,但是值参指向的内存的内容发生了变化。程序3:void fun(int *p) int b=100; p=&b; /等同于第一个问题,b的地址并没有被返回程序4:void fun(int *p) *p=100; / oka
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年儿童阅读五年课程体系报告
- 2025年渭南师范学院马克思主义基本原理概论期末考试参考题库
- 《中医推拿结合心理康复治疗肩周炎的疗效与患者康复进程观察》教学研究课题报告
- 2025年海南比勒费尔德应用科学大学马克思主义基本原理概论期末考试模拟试卷
- 《小学品德与生活教育中生成式AI情感互动的教学策略与实践》教学研究课题报告
- 《职业院校双师型教师队伍科研能力提升策略研究》教学研究课题报告
- 2024年长春工业大学马克思主义基本原理概论期末考试笔试题库
- 2025年国家法官学院马克思主义基本原理概论期末考试参考题库
- 2025年赣州师范高等专科学校马克思主义基本原理概论期末考试笔试真题汇编
- 2025年达州中医药职业学院马克思主义基本原理概论期末考试真题汇编
- 落地式钢管脚手架专项施工方案
- 2025年母子公司间投资合同范本
- 2026中央广播电视总台招聘参考笔试题库及答案解析
- 班玛县公安局招聘警务辅助人员考试重点题库及答案解析
- 母婴安全管理制度
- Q-CR 783.1-2021 铁路通信网络安全技术要求 第1部分:总体技术要求
- JJG 1087-2013矿用氧气检测报警器
- GB/T 36964-2018软件工程软件开发成本度量规范
- FZ/T 10007-2018棉及化纤纯纺、混纺本色纱线检验规则
- 普通高校学生转学申请确认表(模板)
- 口腔医院医疗纠纷及投诉处理接待制度
评论
0/150
提交评论