博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
指针引用
阅读量:4108 次
发布时间:2019-05-25

本文共 1580 字,大约阅读时间需要 5 分钟。

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

转载地址:http://vxtsi.baihongyu.com/

你可能感兴趣的文章
在JS中 onclick="save();return false;"return false是
查看>>
内容里面带标签,在HTML显示问题,JSTL
查看>>
VS编译器运行后闪退,处理方法
查看>>
用div+css做下拉菜单,当鼠标移向2级菜单时,为什么1级菜单的a:hover背景色就不管用了?
查看>>
idea 有时提示找不到类或者符号
查看>>
ng-class的几种用法
查看>>
node入门demo-Ajax让前端angularjs/jquery与后台node.js交互,技术支持:mysql+html+angularjs/jquery
查看>>
神经网络--单层感知器
查看>>
注册表修改DOS的编码页为utf-8
查看>>
matplotlib.pyplot.plot()参数详解
查看>>
拉格朗日对偶问题详解
查看>>
MFC矩阵运算
查看>>
最小二乘法拟合:原理,python源码,C++源码
查看>>
ubuntu 安装mysql
查看>>
c# 计算器
查看>>
C# 简单的矩阵运算
查看>>
gcc 常用选项详解
查看>>
c++输入文件流ifstream用法详解
查看>>
c++输出文件流ofstream用法详解
查看>>
字符编码:ASCII,Unicode 和 UTF-8
查看>>