C

函数参数的传递是按值传递的,指针类型的参数其实也是按值进行传递的,只不过传递的是变量的地址,按值传递会进行拷贝

用作函数的返回值,比较常见的是返回分配的堆内存地址。

下面用一个例子进行说明下:

  1. /*****************************************************************************/  
  2. /** 
  3. * \brief       分配指定大小size的堆空间 
  4. * \param[out]  pst      分配的内存的地址 
  5. * \param[in]   size     需要分配的内存大小 
  6. * \return      返回值描述 
  7. * \remarks     其它信息 
  8. ******************************************************************************/  
  9. bool get_memory(char *pst, unsigned int size)  
  10. {  
  11.     if (0 == size)  
  12.     {  
  13.         pst = NULL;  
  14.         return false;  
  15.     }  
  16.   
  17.     pst = (char*)malloc(size);  
  18.     if (NULL == pst)  
  19.     {  
  20.         return false;  
  21.     }  
  22.     memset(pst, 0, size);  
  23.   
  24.     return true;  
  25. }  
  26.   
  27. int use_get_memory()  
  28. {  
  29.     char *pStr = NULL;  
  30.     char buf[] = "hello world.";  
  31.     get_memory(pStr, 1024);  
  32.   
  33.     memcpy(pStr, buf, sizeof(buf));  
  34.   
  35.     return 0;  
  36. }  
当我们运行这段程序的时候,会发现程序崩溃了,出错的原因是对内存的非法访问,为什么会出现这种情况呢,我们明明已经分配了内存的啊,那我们就进行调试一下,看看问题究竟出现在哪里,vs的调试截图如下:

发现调用get_memory函数之后,pStr所指向的内存竟然是空的,可见问题就出现在这里。

函数参数的传递是按值传递的,指针类型的参数其实也是按值进行传递的,只不过传递的是变量的地址,按值传递会进行拷贝,下面用一个图进行解释。

调用get_memory后,pStr参数会进行拷贝传给get_memory,这里假设拷贝之后的参数为_pStr,执行malloc之后,_pStr指向的是分配的堆空间,而pStr指向的仍然是NULL,所以使用pStr进行操作的时候,会报内存非法访问的错误,而此时,get_memory返回后,新分配的内存(_pStr所指向的空间)没发使用,还会导致内存泄露


p中放的是中间桥梁bridge的地址&bridge,则*p就是中间桥梁bridge的内容即是目标操作数的地址&income,从而**p就是目标操作数.

p就是这里**a种的a.当我们申明**p之后,p就已经存在了。其实这个bridge也已经存在了,那么我们要做的就是bridge中放 我们要操作的数的地址。也就是&incom;那么,其实这样操作*bridge就是操作&incom也就是&b啊,这个一级指针 没什么区别啊

对于一级指针,我们要操作的是就是b,那么按照汇编语言的规则,就要把b放到寄存器或者栈中去操作,我们相当于复制了一个副本去操作,等我们操作完了,返回函数,这些寄存器,栈等都释放了,main中什么也没发生。但是如果我们用双指针,二级指针就不一样了。我们操作的是bridge.我们只是机械的复制一个bridge的内容到寄存器或者到栈中,而没有实际的去复制imcom的内容,我们只是告诉bridge,你要指向一个叫incom的地址, 也就是说,bridge的内容就是incom的地址,即&incom,通过bridge这个中间桥梁,所以,就达到目的了。所以,双指针让参数传递具有穿透力。
    双指针主要用在但我们想向一个A函数传递参数的时候,但是我们希望在A内部对参数做任何修改都能保存起来,那么就是用双指针吧。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值