注册 登录  
 加关注
查看详情
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

ideality

@linux c 编程@

 
 
 

日志

 
 
 
 

指针引用(转)  

2013-10-20 19:54:55|  分类: netfilter |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
在C语言中,如果想改变指针本身而不是这所指向的内容,函数声明可能像这样:
[cpp]  
void f(int **);  
当传递它时,必须取得指针的地址:
[cpp]  
int i = 47;  
int *ip = &i;  
f(&ip);  
当需要向一个buffer中不断的增加内容,需要改变buffer的地址。比如说,要分析一个文件,将文件中所有以s开头的单词都加入到这个buffer中,然后我们在分析文件之前,并不清楚多大的buffer可以装得下这些单词,所以开始时只能malloc出一个固定大小的buffer(比如1M),当发现buffer不够用时,再通过realloc增加buffer,这时buffer的地址可能改变。
我们用一个函数GetEnoughBuffer来增大既有buffer,如果不使用指针引用,则应该使用指针的指针,函数实现如下:
[cpp] 
int GetEnoughBuffer_PointerPointer(char **ppBuffer, unsigned int bufferSize)  
{  
    int newBufferSize = 0;  
    if (strlen(*ppBuffer) + 128 > bufferSize)  
    {  
        newBufferSize = bufferSize + 1024;  
        *ppBuffer = (char *) realloc((void *)*ppBuffer, newBufferSize);  
    }  
  
    if (NULL == *ppBuffer)  
        return 0;  
  
    return newBufferSize;  
}  
代码中多处用到*ppBuffer这样形式来获取buffer地址,阅读起来实在是费劲。
如果使用指针引用,则函数  
int GetEnoughBuffer_RefPointer(char *&pBuffer, unsigned int bufferSize)  
{  
    int newBufferSize = 0;  
    if (strlen(pBuffer) + 128 > bufferSize)  
    {  
        newBufferSize = bufferSize + 1024;  
        pBuffer = (char *) realloc((void *)pBuffer, newBufferSize);  
    }  
  
    if (NULL == pBuffer)  
        return 0;  
  
    return newBufferSize;  
}  
代码逻辑不变,语法上却清晰多了。函数参数变成指针的引用,用不着取得指针的地址:
[cpp]  
int main()  
{  
    char *pBuffer, *pBuffer1;  
    int bufferSize = 32;  
  
    pBuffer = (char *) calloc(bufferSize, 1);  
    strcat(pBuffer, "strong");  
  
    pBuffer1 = (char *) calloc(bufferSize, 1); // buffer1 是用于限制buffer后的可扩展空间,在  
    strcat(pBuffer1, "stone");              // VS2005中buffer1将在buffer后面96字节处开辟出来  
  
    // bufferSize = GetEnoughBuffer_PointerPointer(&pBuffer, bufferSize);  
    // bufferSize = GetEnoughBuffer_RefPointer(pBuffer, bufferSize);  
  
    return 0;  
}  
  评论这张
 
阅读(472)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018