免费预览已结束,剩余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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 【正版授权】 IEC 60749-26:2025 EN-FR Semiconductor devices - Mechanical and climatic test methods - Part 26: Electrostatic discharge (ESD) sensitivity testing - Human body model (HBM)
- 【正版授权】 IEC 62541-1:2025 EN-FR OPC Unified Architecture - Part 1: Overview and concepts
- 2025年大学理学(地球物理学)试题及答案
- 2025年中职母婴照护(婴儿常见疾病护理)试题及答案
- 力争实现最好的结果数说新时代课件
- 副校级领导安全培训安排课件
- 制氢系统培训课件
- 制备色谱技术
- 2026年不动产统一登记知识竞赛试题及答案
- 2026年《工会法》知识竞赛试题库(含答案)
- 【MOOC】材料工程基础-武汉理工大学 中国大学慕课MOOC答案
- 彩票店装修合同范例
- 国家开放大学专科《法理学》(第三版教材)形成性考核试题及答案
- 2023年兴业银行贵阳分行招聘人员笔试上岸历年典型考题与考点剖析附带答案详解
- SJ-T 11795-2022 锂离子电池电极材料中磁性异物含量测试方法
- 运输合同纠纷答辩状
- 母婴安全管理制度
- Q-CR 783.1-2021 铁路通信网络安全技术要求 第1部分:总体技术要求
- JJG 1087-2013矿用氧气检测报警器
- GB/T 36964-2018软件工程软件开发成本度量规范
- 普通高校学生转学申请确认表(模板)
评论
0/150
提交评论