参数传递问题 GetMemory - 指针型参数
请实现一个函数 bool GetMemory(ptr, size),它从堆上申请 size个字节的内存,通过参数ptr传递(传出)申请到的内存的首地址。 函数返回值 true 表成功,false 表失败。
错误示例:
- bool GetMemory(char *ptr, int size)
- {
- ptr = malloc(size);
- if(ptr!=NULL)
- return true;
- else
- return false;
- }
- void main()
- {
- char *p=NULL;
- GetMemory(p, 100); // 申请100字节内存
- }
分析:
函数调用时 实参向形参赋值: ptr = p = NULL;
调用 ptr=malloc(size) 后 ptr 指向申请到的内存 —— 不是 p 而是 ptr 指向申请到的内存 !
修正:
- bool GetMemory(char **pptr, int size)
- {
- *ptr = malloc(size);
- if(*ptr!=NULL)
- return true;
- else
- return false;
- }
- void main()
- {
- char *p=NULL;
- GetMemory(&p, 100); // 申请100字节内存
- }
分析:
函数调用时 实参向形参赋值: pptr = &p;
函数让 p 指向申请到的内存: *pptr = malloc(size); 也即 p = malloc(size);
总结:
- C的参数传递只有“传值”,即拷贝。
- 所谓的“传址”即传递“变量的地址值”,目的是希望函数内对变量产生副作用。
- 所谓的“指针”是“指针变量”的简称(或误称),实际上和其它变量一样,它有一个地址,存放一个某种类型的值。
- 关于C指针:花样很多,搞懂后,其实不难。即使懂了,也要时刻仔细!如同高空走钢丝,再熟练也得小心!
提示:
C++还有一种参数传递方式:引用。它具有指针变量的效率,同时具有一般变量的用法。
阅读(2682) | 评论(1) | 转发(0) |