且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

《从缺陷中学习C/C++》——6.6 指针变量的传值和传址

更新时间:2022-06-29 01:58:45

本节书摘来自异步社区出版社《从缺陷中学习C/C++》一书中的第6章,第6.6节,作者: 刘新浙 , 刘玲 , 王超 , 李敬娜 , ,更多章节内容可以访问云栖社区“异步社区”公众号查看。

6.6 指针变量的传值和传址

从缺陷中学习C/C++
代码示例

int func(int* pRes)
{
    if(pRes == NULL)
        pRes = new int(12);//分配新的内存空间给指针pRes,并赋值 
    return 0;
}
int main ()
{
    int *pInt = NULL;
    int val = func(pInt);
    printf("%d\n",*pInt);
    return 0;
}

现象&结果
函数返回后,指针pRes所指内容不是12。

Bug分析
上述代码中func函数的形参是指针类型 int pRes,在函数体中new了一块内存并赋值12,将内存地址赋值给指针pRes。在main函数中,定义了指针pInt,调用func函数,把pInt作为参数传入func函数中。程序的本意是在func函数退出后,指针pInt所指的内容pInt为12,但实际结果却不是。其原因是在func函数调用过程中,形参和实参的传递使用了值传递方式,这种情况下,形参变量在函数体内发生了变化,在函数结束之后,形参变量随之释放,不能把变化的结果返回给实参。要改变实参的值,必须使用指针传递或者引用传递。在本程序中,func函数的形参是整形指针类型int * pRes,要在函数体内改变pRes的值,并把这个变化返回到main函数中,必须传递pRes的指针。因为pRes本身就是指针,所以应该传递指针的指针,或者指针的引用。

正确代码

int func(int *&pRes);

本文仅用于学习和交流目的,不代表异步社区观点。非商业转载请注明作译者、出处,并保留本文的原始链接。