函数参数的传递问题(指针的指针)_第1页
函数参数的传递问题(指针的指针)_第2页
函数参数的传递问题(指针的指针)_第3页
函数参数的传递问题(指针的指针)_第4页
函数参数的传递问题(指针的指针)_第5页
已阅读5页,还剩2页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论