Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1530743
  • 博文数量: 226
  • 博客积分: 3997
  • 博客等级: 少校
  • 技术积分: 2369
  • 用 户 组: 普通用户
  • 注册时间: 2010-06-19 17:26
个人简介

Never save something for a special occasion. Every day in your life is a special occasion.

文章分类

全部博文(226)

文章存档

2018年(5)

2017年(11)

2016年(1)

2015年(17)

2014年(14)

2013年(30)

2012年(5)

2011年(52)

2010年(107)

分类: C/C++

2011-01-19 22:50:56

参数传递问题 GetMemory - 指针型参数
 
请实现一个函数 bool GetMemory(ptr, size),它从堆上申请 size个字节的内存,通过参数ptr传递(传出)申请到的内存的首地址。 函数返回值 true 表成功,false 表失败。
 
错误示例:
  1. bool GetMemory(char *ptr, int size)
  2. {
  3.  ptr = malloc(size);
  4.  if(ptr!=NULL)
  5.    return true;
  6.  else
  7.    return false;
  8. }

  9. void main()
  10. {
  11.  char *p=NULL;
  12.  GetMemory(p, 100); // 申请100字节内存
  13. }
分析:
函数调用时 实参向形参赋值: ptr = p = NULL;
调用 ptr=malloc(size) 后 ptr 指向申请到的内存 —— 不是 p 而是 ptr 指向申请到的内存 !
 
修正:
  1. bool GetMemory(char **pptr, int size)
  2. {
  3.  *ptr = malloc(size);
  4.  if(*ptr!=NULL)
  5.    return true;
  6.  else
  7.    return false;
  8. }

  9. void main()
  10. {
  11.  char *p=NULL;
  12.  GetMemory(&p, 100); // 申请100字节内存
  13. }
 
分析:
函数调用时 实参向形参赋值: pptr = &p;
函数让 p 指向申请到的内存: *pptr = malloc(size);  也即 p = malloc(size);
 
总结:
  1. C的参数传递只有“传值”,即拷贝。
  2. 所谓的“传址”即传递“变量的地址值”,目的是希望函数内对变量产生副作用。
  3. 所谓的“指针”是“指针变量”的简称(或误称),实际上和其它变量一样,它有一个地址,存放一个某种类型的值。
  4. 关于C指针:花样很多,搞懂后,其实不难。即使懂了,也要时刻仔细!如同高空走钢丝,再熟练也得小心!
提示:
C++还有一种参数传递方式:引用。它具有指针变量的效率,同时具有一般变量的用法。
 
 
阅读(2690) | 评论(1) | 转发(0) |
给主人留下些什么吧!~~

mengyingchina2011-01-24 13:11:01

呜呜,这几天写程序,参数传递折腾人啊。