




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
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(&
2、amp;p; /这里的p可以得到正确的值了 if(p free(p;程序3:#include<stdio.h>void 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:#include<stdio.h>void
3、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指针参数是如何传递内存的?
4、如果函数的参数是一个指针,不要指望用该指针去申请动态内存。示例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; &
5、#160; / str 仍然为 NULL strcpy(str, "hello" / 运行错误示例7-4-1 试图用指针参数申请动态内存毛病出在函数GetMemory中。编译器总是要为函数的每个参数制作临时副本,指针参数p的副本是 _p,编译器使 _p = p。如果函数体内的程序修改了_p的内容,就导致参数p的内容作相应的修改
6、。这就是指针可以用作输出参数的原因。在本例中,_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
7、 *str = NULL; GetMemory2(&str, 100; / 注意参数是 &str,而不是str strcpy(str, "hello" cout<< str << endl; free(str
8、; 示例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;
9、60; str = GetMemory3(100; strcpy(str, "hello" cout<< str << endl; free(str; 示例7-4-3 用函数返回值来传递动态内存用函数返回值来传递动态内存这种方法虽然好用,但是常常有人把retu
10、rn语句用错了。这里强调不要用return语句返回指向“栈内存”的指针,因为该内存在函数结束时自动消亡,见示例7-4-4。char *GetString(void char p = "hello world" return p; / 编译器将提出警告void Test4(voidchar *str = NULL;str = GetString(; /
11、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
12、(void char *str = NULL; str = GetString2(; cout<< str << endl;示例7-4-5 return语句返回常量字符串函数Test5运行虽然不会出错,但是函数GetString2的设计概念却是错误的。因为GetString2内的“hello world”是常量字符串,位于静态存储区,它在程序生命期内恒定不变。无论什么时候调用GetString2,它返回的始终是同一个“只读”的内
13、存块。-看看林锐的高质量的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; / okay 结论:1.
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 社区社区服务心理学研究管理基础知识点归纳
- 2024年湖南中烟招聘考试真题及答案
- 历史村落保护规划基础知识点归纳
- 2025年大学计算机复试题
- 地理(武汉专用)2025年中考考前押题最后一卷
- 冀教版小学一年级数学三单元教学设计
- 绿色金融产融合作的国际化发展趋势与实践经验
- 完善企业民主管理制度的绩效评估与反馈机制
- 智慧养老的策略及实施路径
- 天然气管道项目可行性研究报告
- 特种工作作业人员体格检查表
- 小学道德与法治人教五年级上册第四单元骄人祖先灿烂文化-《意蕴隽永的汉字》教学设计
- 关于赣州市登革热病例疫情的初步调查报告
- 网络舆论监督存在的问题及对策分析研究行政管理专业
- T∕CAEPI 31-2021 旋转式沸石吸附浓缩装置技术要求
- 普佑克四期临床方案
- 国家级高技能人才培训基地建设项目实施管理办法
- 深圳实验学校小学毕业班数学试卷
- 人教精通版小学英语五年级下册期末测试
- 自动喂料搅拌机
- 上海初中地理会考知识点汇总(上海乡土地理
评论
0/150
提交评论