普通值、指针、引用作为函数参数时的理解

很多时候,我们都会看到在教科书上写着各种值传递,引用传递,一看一大堆,有时候看的还容易迷糊,什么情况该怎么传总是区分不清,下边我们用一小版块并结合代码实例讲解下。
一、值传递

// 普通值传递 void test(int num) { num = 5; cout << "in function " << __FUNCTION__ << " " << "num = " << num <


输出结果如下:
9
in function testPt p = 032C5978
in function main p = 00000000
在这里我们需要稍微注意下,指针作为一种特殊的值(相对于上一种情况的int值而言)进行传递,结合testPt理解,在testPt内部对该参数进行分配内存,从输出结果可以看到在函数内部的值已改变,但是在main函数体的p依然没有改变,而已这样也是值拷贝,不具备回传效果。
下边的涉及部分new空间没有释放,有些是演示的需要,实际开发中,可不能这样哦,哪里new了,对应就得释放掉。
二、指针的引用传递
实例:
void testptref(int* &pref) { pref = new int(); if (pref) { *pref = 9; printf("%d\n", *pref); printf("in function %s pref = %p\n", __FUNCTION__, pref); } } int main(int argc, char* argv[]) { int * pref = NULL; testptref(pref); printf("in function %s pref = %p\n", __FUNCTION__, pref); getchar(); return 0; }


输出结果如下:
【普通值、指针、引用作为函数参数时的理解】9
in function testptref pref = 02674F08
in function main pref = 02674F08
可以看到,在testptref函数内外输出的结果一样了,说明内部的修改对传入的实参起作用了。对指针的引用作为参数传递,其实并没有拷贝,而是使用了同一个变量。
三、二级指针作为参数传递
二级指针一般形式为int**p; 我们通常认为,一个指针变量存储一个它所指向内容的地址。二级指针变量存储的是指向地址的地址,即存储了一级指针变量的地址。
实例:
voidtest2pt(int **p) { // 修改的是一级指针。 *p = new int(); if (*p) { **p = 9; printf("%d\n", **p); printf("in function %s p = %p\n", __FUNCTION__, *p); } } int main(int argc, char* argv[]) { int *p = NULL; test2pt(&p); printf("in function %s p = %p\n", __FUNCTION__, p); getchar(); return 0; }

输出结果如下:
9
in function test2pt p = 030A4F08
in function main p = 030A4F08
从结果可以看到,内外的指针值,即内部函数的修改对外部的该指针也起作用了。
---------------------
作者:浪淘米
来源:CSDN
原文:https://blog.csdn.net/this_is_me_anyway/article/details/80192574
版权声明:本文为博主原创文章,转载请附上博文链接!

    推荐阅读