再说参数传递
来源:互联网 发布:网易云写入数据库失败 编辑:程序博客网 时间:2024/06/03 03:47
大家好,我目前就职于一家工业制造公司,我的email是wuxfei@gmail.com,工作近3年时间了,今天借助于CSDN博客温习一下c++参数传递,如有错误还望读者指正!
我们先看一下面一段代码
void GetMemory(char *p, int num){p = (char *)malloc(sizeof(char) * num);}void main(void){char *str = NULL;GetMemory(str, 100); strcpy(str, "Hello");}
在这段代码中,main函数希望通过调用GetMemory获得一片指定大小的内存区域,但是经过编译运行后发现,程序运行到strcpy(str, "Hello");时,程序挂掉了!
GetMemory中已经申请了内存空间,并且已经赋值给了指针变量呀,为什么str还是NULL呢?
先看看函数的执行过程:
1、main函数在执行语句GetMemory(str, 100);时,编译系统是将str的值赋值给p了,就是说在还未执行p = (char *)malloc(sizeof(char) * num);时,p和str的值是相同的,都是NULL,即都指向0地址。
2、当GetMemory申请到内存空间后,其只是将申请到的内存空间的编号存到p中了,即只是赋值给p了,就是说p指向了刚刚申请到的内存区域。
3、显然,GetMemory(str, 100);执行过后,str的值是没有改变的,就是说str还是指向0地址。
那么怎么改,可达到当初的设计意愿呢?
方法一、
void GetMemory(char *&p, int num){p = (char *)malloc(sizeof(char) * num);}void main(void){char *str = NULL;GetMemory(str, 100); strcpy(str, "Hello");}
方法二、
void GetMemory(char **p, int num){*p = (char *)malloc(sizeof(char) * num);}void main(void){char *str = NULL;GetMemory(&str, 100); strcpy(str, "Hello");}
对比这两种方法,第一种方法改动比较小,其利用引用的特性。第二种方法改动稍多点,且调用形式也变了。
方法一中:
p已经不再占用存储空间了,p是一个指针变量的引用,即在执行GetMemory(str, 100);时,p成了str的一个别名,在执行p = (char *)malloc(sizeof(char) * num);时,即已经改变了str的值,因为p是str的一个别名,故对p赋值,就是在对str赋值。
方法二中:
GetMemory中已经将p申明为二级指针了,所以main函数在执行调用时,传递的是str的地址,即p是指向str的,在执行*p = (char *)malloc(sizeof(char) * num);时,即改变了p所指向的变量,换句话说就是改变了str。
以上两种更改方法都达到了更改str的目的,也就是实现了程序最初的设计意愿。
- 再说参数传递
- 参数传递
- 参数传递
- 参数传递
- 传递参数
- 参数传递
- 参数传递
- 参数传递
- 传递参数
- 参数传递
- 参数传递
- 参数传递
- 参数传递
- *参数传递*
- 参数传递
- 参数传递
- 参数传递
- 传递参数
- mysql查询及修改字符集
- ognlognl表达式 研究
- linux内核学习中--“list.h”文件中 hlist所有函数与宏定义的详解
- 避免android程序开发内存泄漏
- ContentProvider数据共享例子
- 再说参数传递
- 解决ie6 png 作为背景图片的透明问题
- 隐马尔科夫模型HMM自学 (2)
- Unix 命令链接 ln
- 学习java的一些重要网址
- iOS: UIKeyboard
- javascript 控制frameset左边显示与隐藏
- as3 测试各个显示对象占用内存的大小
- 基于线程安全的单例模式