很多时候,我们都会看到在教科书上写着各种值传递,引用传递,一看一大堆,有时候看的还容易迷糊,什么情况该怎么传总是区分不清,下边我们用一小版块并结合代码实例讲解下。
一、值传递
// 普通值传递
void test(int num)
{
num = 5;
cout << "in function " << __FUNCTION__ << " " << "num = " << num <
输出结果如下:
in function test num = 5
in function main num = 9
可见按值传递,在test函数内部,修改num的值,对实参num并无影响,即test函数接收到的实际上是外层num的一个拷贝。
// 指针按值传递
void testPt(int * p)
{
p = new int;
*p = 9;
if (p)
{
printf("%d\n", *p);
printf("in function %s p = %p\n", __FUNCTION__, p);
}
}
int main(int argc, char* argv[])
{
int *p = NULL;
testPt(p);
printf("in function %s p = %p\n", __FUNCTION__, p);
getchar();
return 0;
}
输出结果如下:
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
版权声明:本文为博主原创文章,转载请附上博文链接!
推荐阅读
- 学习笔记|uni-app开发小程序
- java计算文本MD5值
- Android圆形进度条控件-CircleSeekBar
- 学习笔记|安卓中一些界面过场动画的实现
- MongoDB-存储
- 学习笔记|Burnside引理和polay计数学习笔记
- Python|【网易2019年秋招笔试题】编程题第二题(香槟塔里倒香槟——参考代码和编程思路)
- Android|安装APP损坏,出现[INSTALL_FAILED_DEXOPT]的解决办法
- Android|java日期格式化
- Android|android 读取json数据(遍历JSONObject和JSONArray