c实参传递给形参

  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);
}

 

 

转载于:https://www.cnblogs.com/encode/p/3344560.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值