代码改变世界

c实参传递给形参

2013-09-28 19:21  放作夥  阅读(772)  评论(0编辑  收藏  举报
  1. viod GetMemory(char*p,int num) 
  2. { 
  3.      p=(char*)malloc(sizeof(char)*num); 
  4. } 
  5.  
  6. voidTest(void) 
  7. { 
  8.      char*str=NULL; 
  9.      GetMemory(str,100);//str仍为NULL 
  10.      strcpy(str,"hello");//运行出错 
  11. }

 

无论函数参数是什么类型,都是按照传递一份拷贝进去的,就算是指针也是一样。本例中,GetMemory(str,100)这句话,实际上传递的也是str指针的值null进去。所以其实GetMemory(char *p, int num)中的p指针实际上是一个临时变量(一个在别的内存位置的变量),只是存储了和str一样的值而已。所以在函数中改变的指针p的值只是改变了函数参数中临时变量的值,与str实际上是一点关系都没有,str还是null
那么传指针究竟是什么作用呢?虽然指针的值也是一份拷贝进去的,但是由于拷贝的值的特殊性,因为指针的值实际上就是一个地址,那么在调用函数的内部,可以通过传递进来的临时指针变量的值引用指针所指向的内存空间,从而改变所指向空间的值
所以,传递指针参数,不能改变指针所指向的地址,只能改变指针所指向地址的空间的值。

要使用指针的指针才行,也就是二级指针:

  
  1. viod GetMemory(char**p,int num) 
  2. { 
  3.      *p=(char*)malloc(sizeof(char)*num); 
  4. } 
  5.  
  6. voidTest(void) 
  7. { 
  8.      char*str=NULL; 
  9.      GetMemory(&str,100); 
  10.      strcpy(str,"hello"); 
  11. }

我们可以用函数返回值来传递动态内存。这种方法更加简单

char *GetMemory3(int num)
{
char *p = (char *)malloc(sizeof(char) * num);
return p;
}
void Test3(void)
{
char *str = NULL;
str = GetMemory3(100);
strcpy(str, "hello");
cout<< str << endl;
free(str);
}