Chinaunix首页 | 论坛 | 博客
  • 博客访问: 652373
  • 博文数量: 128
  • 博客积分: 4385
  • 博客等级: 上校
  • 技术积分: 1546
  • 用 户 组: 普通用户
  • 注册时间: 2010-07-22 14:05
文章分类

全部博文(128)

文章存档

2012年(2)

2011年(51)

2010年(75)

分类: C/C++

2010-08-26 09:49:42

总结:当变量作为函数的参数时,函数内修改的是形参,实参不变化;(swap(int a, int b))
     当指针作为函数的参数时,函数内:若修改指针变量,实参指针指向变量不变。若修改指针指向,实参指针指向的变量变化。(swap(int *a, int *b))
     当二级指针为函数的参数时,函数内,修改一级指针式,实参一级指针变化!分析如下:
 
下是经典程序(载自林锐的从c\c++高质量编程)
void GetMemory(char *p,int num)
{
p=(char*)malloc(sizeof(char)*num);       //p是形参指向的地址
}
void main()
{
char *str=NULL;
GetMemory(str,100);                            //str是实参指向的地址,不能通过调用函数来申请内存
strcpy(str,"hello");
}
结构是编译能通过,却不能运行,为什么呢?
先说一下指针作为函数参数的意义:当将指针作为参数时,实参向形参传递的是地址,在函数执行过程中,既可以对该参数指针进行处理,也可以对该参数指针所指向的数据进行处理,(以上程序段来说就是可以对p或*p进行处理)。由于此时形参和实参都是指向同一个存储单元,因此当形参指针所指向的数据改变时,实参指针所指向的数据也作相应的改变,因此这时的形参可以作为输出参数使用。
按照上面的说法,这个程序应该没有问题的啊,实参str和形参p指向同一个存储单元,给形参分配的内存单元应该也给实参分配了才对啊,问题就是在这里
实参和形参是指向同一个地址,它们只是指向相同,但它们自身的地址不是同时申请的,就是说p在申请内存时,str并不可以通过调用Getmemory同时申请内存,所以尽管str调用了GetMemory,但它仍然是个空指针,所以进行strcpy是就不能运行。
要使程序可以运行,只要小小的改动就行了(用指向指针的指针):
void GetMemory(char **p,int num)
{
*p=(char*)malloc(sizeof(char)*num);       //此时*p就变成了是形参本身的地址
}
void main()
{
char *str=NULL;
GetMemory(&str,100);                            //&str是实参的地址,所以实参和形参之间就可以直接调用
strcpy(str,"hello");
free(str); 
程序就会如你所愿,输出hello了。
阅读(12594) | 评论(2) | 转发(3) |
给主人留下些什么吧!~~

liunian0232013-12-19 11:08:09

清晰明了,nice!

chinaunix网友2010-08-28 08:53:50

Download More than 1000 free IT eBooks: http://free-ebooks.appspot.com