C/C++中的值传递,引用传递,指针传递,指针引用传递

简介:

在面试过程中,被面试官问到传值和传引用的区别,之前没有关注过这个问题,今天在网上找了一篇包含代码和图片的讲解文章,浅显易懂,遂转载备忘。

1. 值传递 

复制代码
 1 void f( int  p){
 2     printf("\n%x",&p);
 3     printf("\n%x",p);
 4     p=0xff;
 5 }
 6 void main()
 7 {
 8     int a=0x10;
 9     printf("\n%x",&a);
10     printf("\n%x\n",a);
11     f(a);
12     printf("\n%x\n",a);
13 }
复制代码

通过上例我们可以看到,int a=0x10,存放的地址为0x12ff44,值为10,当调用f(a)时,传递给p的值为10,但是p的地址为0x12fef4,当改变p=0xff,时是改变地址为0x12fef4中的内容,并没有改变0x12ff44中的内容,所以调用f(a),后a的值仍然为0x10,所以值传递无法改变变量的值。示意图如下:

2. 引用传递

复制代码
 1 void f( int & p){
 2     printf("\n%x",&p);
 3     printf("\n%x",p);
 4     p=0xff;
 5 }
 6 void main()
 7 {
 8     int a=0x10;
 9     printf("\n%x",&a);
10     printf("\n%x\n",a);
11     f(a);
12     printf("\n%x\n",a);
13 }
复制代码

通过上面引用传递传递案例我们可以看到,调用f(a)时,传递给p的是a的地址,所以p和a的地址都是0X12ff44,所以p就是a,改变p当然能改变a。示意图如下:

3. 指针传递

复制代码
 1 void f( int*p){
 2     printf("\n%x",&p);
 3     printf("\n%x",p);
 4     printf("\n%x\n",*p);
 5     *p=0xff;
 6 }
 7 void main()
 8 {
 9     int a=0x10;
10     printf("\n%x",&a);
11     printf("\n%x\n",a);
12     f(&a);
13     printf("\n%x\n",a);
14 }
复制代码

通过指针传递的案例我们可以看到,调用f(&a)是将a的地址0x12ff44传递给p,则*p就指向了a的内容,改变*p后,a的内容自然就改变了,示意图如下:

4. 指针的引用传递

复制代码
 1 void f( int*&p){
 2     printf("\n%x",&p);
 3     printf("\n%x",p);
 4     printf("\n%x\n",*p);
 5     *p=0xff;
 6 }
 7 void main()
 8 {
 9     int a=0x10;
10     printf("\n%x",&a);
11     printf("\n%x\n",a);
12     int *b=&a;
13     printf("\n%x",&b);
14     printf("\n%x",b);
15     printf("\n%x\n",*b);
16     f(b);
17     printf("\n%x\n",a);
18 }
复制代码

为了使用指针的引用传递我们要新建一个指针b,然后将b的引用传递给p,其实p就是b的一个拷贝,*p=*b都指向a,所以改变*p的内容也就改变a的内容。示意图如下:

我们再来看一下如果不用指针的引用传递会出现什么结果

复制代码
 1 void f( int*p){
 2     printf("\n%x",&p);
 3     printf("\n%x",p);
 4     printf("\n%x\n",*p);
 5     *p=0xff;
 6 }
 7 void main()
 8 {
 9     int a=0x10;
10     printf("\n%x",&a);
11     printf("\n%x\n",a);
12     int *b=&a;
13     printf("\n%x",&b);
14     printf("\n%x",b);
15     printf("\n%x\n",*b);
16     f(b);
17     printf("\n%x\n",a);
18     printf("\n%x\n",b);
19 }
复制代码

从结果中我们可以看到调用f(b)时,传递给p的是b的内容,但是&b,和&p是不一样的,虽然*p和*b都指向a。示意图如下:



本文转自ZH奶酪博客园博客,原文链接:http://www.cnblogs.com/CheeseZH/p/5163280.html,如需转载请自行联系原作者

相关文章
|
存储 安全 算法
【C++智能指针 相关应用】深入探索C++智能指针:跨进程、动态库与最佳实践
【C++智能指针 相关应用】深入探索C++智能指针:跨进程、动态库与最佳实践
63 5
|
1月前
|
存储 安全 C++
在C++指针和引用
在C++指针和引用
|
28天前
|
JSON JavaScript 前端开发
C++ 智能指针与 JSON 处理:高级编程技巧与常见问题解析
C++ 智能指针与 JSON 处理:高级编程技巧与常见问题解析
262 0
|
14天前
|
存储 C++
C++指针
C++指针
|
26天前
|
存储 编译器 C语言
【c++】类和对象(二)this指针
朋友们大家好,本节内容来到类和对象第二篇,本篇文章会带领大家了解this指针
【c++】类和对象(二)this指针
|
26天前
|
存储 编译器 C语言
【C++练级之路】【Lv.2】类和对象(上)(类的定义,访问限定符,类的作用域,类的实例化,类的对象大小,this指针)
【C++练级之路】【Lv.2】类和对象(上)(类的定义,访问限定符,类的作用域,类的实例化,类的对象大小,this指针)
|
28天前
|
存储 安全 数据库连接
【C++智能指针】深入探究C++智能指针:自定义删除器的设计与选择
【C++智能指针】深入探究C++智能指针:自定义删除器的设计与选择
82 0
|
28天前
|
存储 安全 编译器
【C++ 函数设计的艺术】深挖 C++ 函数参数的选择 智能指针与 std::optional:最佳实践与陷阱
【C++ 函数设计的艺术】深挖 C++ 函数参数的选择 智能指针与 std::optional:最佳实践与陷阱
106 0
|
28天前
|
安全 算法 程序员
【C++ 空指针的判断】深入理解 C++11 中的 nullptr 和 nullptr_t
【C++ 空指针的判断】深入理解 C++11 中的 nullptr 和 nullptr_t
47 0
|
29天前
|
安全 算法 程序员
【C++智能指针 空指针判断】深入探索C++智能指针:nullptr与empty的微妙差异
【C++智能指针 空指针判断】深入探索C++智能指针:nullptr与empty的微妙差异
27 1