指针引用

在C语言中,如果想改变指针本身而不是这所指向的内容,函数声明可能像这样:
void f(int **);
当传递它时,必须取得指针的地址:
int i = 47;
int *ip = &i;
f(&ip);
当需要向一个buffer中不断的增加内容,需要改变buffer的地址。比如说,要分析一个文件,将文件中所有以s开头的单词都加入到这个buffer中,然后我们在分析文件之前,并不清楚多大的buffer可以装得下这些单词,所以开始时只能malloc出一个固定大小的buffer(比如1M),当发现buffer不够用时,再通过realloc增加buffer,这时buffer的地址可能改变。
我们用一个函数GetEnoughBuffer来增大既有buffer,如果不使用指针引用,则应该使用指针的指针,函数实现如下:
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;
}
代码逻辑不变,语法上却清晰多了。函数参数变成指针的引用,用不着取得指针的地址:
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;
}



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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值