



免费预览已结束,剩余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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 8《我们受特殊保护》第二课时(教学设计)部编版道德与法治六年级上册
- 高中信息技术粤教版选修4教学设计-4.3.4 创建“密码验证”窗体-
- 第四节 现代通信教学设计-2025-2026学年初中物理鲁科版五四学制九年级下册-鲁科版五四学制2012
- 2025年中考数学总复习《等腰三角形》专项检测卷(附答案)
- 2.2.2生物对环境的适应和影响说课稿-2024-2025学年苏科版生物七年级上册
- 2025年全国育婴师职业技能鉴定中级考试题库(含答案)
- 2025年高考数学试题分类汇编:平面向量与复数(试卷+解析)
- 2025年山东省泰安市中考生物试题及答案
- 小班师德师风题目及答案
- 《2025企业员工聘用劳务合同》
- 迈瑞注射泵的操作流程
- 数据共享保密协议书
- 空调系统故障应急预案
- 手术室安全知识
- DL-T 5876-2024 水工沥青混凝土应用酸性骨料技术规范
- 运动解剖学课件完整版
- 骨科术后下肢肿胀护理
- 《套期保值会计》课件
- Unit 1 This is me reading I 教学设计2024-2025学年译林版英语七年级上册
- 河南省南阳市2023-2024学年小升初语文试卷(含答案)
- 2024住院患者静脉血栓栓塞症预防护理与管理专家共识要点(全文)
评论
0/150
提交评论