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

1. 值传递

 void f( int  p){
printf("\n%x",&p);
printf("\n%x",p);
p=0xff;
}
void main()
{
int a=0x10;
printf("\n%x",&a);
printf("\n%x\n",a);
f(a);
printf("\n%x\n",a);
}

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

2. 引用传递

 void f( int & p){
printf("\n%x",&p);
printf("\n%x",p);
p=0xff;
}
void main()
{
int a=0x10;
printf("\n%x",&a);
printf("\n%x\n",a);
f(a);
printf("\n%x\n",a);
}

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

3. 指针传递

 void f( int*p){
printf("\n%x",&p);
printf("\n%x",p);
printf("\n%x\n",*p);
*p=0xff;
}
void main()
{
int a=0x10;
printf("\n%x",&a);
printf("\n%x\n",a);
f(&a);
printf("\n%x\n",a);
}

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

4. 指针的引用传递

 void f( int*&p){
printf("\n%x",&p);
printf("\n%x",p);
printf("\n%x\n",*p);
*p=0xff;
}
void main()
{
int a=0x10;
printf("\n%x",&a);
printf("\n%x\n",a);
int *b=&a;
printf("\n%x",&b);
printf("\n%x",b);
printf("\n%x\n",*b);
f(b);
printf("\n%x\n",a);
}

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

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

 void f( int*p){
printf("\n%x",&p);
printf("\n%x",p);
printf("\n%x\n",*p);
*p=0xff;
}
void main()
{
int a=0x10;
printf("\n%x",&a);
printf("\n%x\n",a);
int *b=&a;
printf("\n%x",&b);
printf("\n%x",b);
printf("\n%x\n",*b);
f(b);
printf("\n%x\n",a);
printf("\n%x\n",b);
}

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

C/C++中的值传递,引用传递,指针传递,指针引用传递的更多相关文章

  1. 【.Net】浅谈C#中的值类型和引用类型

    在C#中,值类型和引用类型是相当重要的两个概念,必须在设计类型的时候就决定类型实例的行为.如果在编写代码时不能理解引用类型和值类型的区别,那么将会给代码带来不必要的异常.很多人就是因为没有弄清楚这两个 ...

  2. Java中的值传递和引用传递

    这几天一直再纠结这个问题,今天看了这篇文章有点思路了,这跟C++里函数参数为引用.指针还是有很大区别. 当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里 ...

  3. 一道笔试题来理顺Java中的值传递和引用传递

      题目如下: private static void change(StringBuffer str11, StringBuffer str12) { str12 = str11; str11 = ...

  4. java中的值传递和引用传递有什么区别呀?

    值传递: (形式参数类型是基本数据类型和String):方法调用时,实际参数把它的值传递给对应的形式参数,形式参数只是用实际参数的值初始化自己的存储单元内容,是两个不同的存储单元,所以方法执行中形式参 ...

  5. Java语言中的值传递与引用传递

    Java应用程序中永远不会传递对象,而只会传递对象应用,因此,按对象引用传递. (1)      Int作为参数传递时,对形参值得修改不会影响到实参: (2)      StringBuffer作为参 ...

  6. Java 中的值传递和引用传递问题

    Java 中的值传递和引用传递问题 public class Operation { int data = 50; void change(int data) { data = data + 100; ...

  7. Java中的值传递和地址传递(传值、传引用)

    首先,不要纠结于 Pass By Value 和 Pass By Reference 的字面上的意义,否则很容易陷入所谓的“一切传引用其实本质上是传值”这种并不能解决问题无意义论战中.更何况,要想知道 ...

  8. Java中的值传递与“引用传递”

    首先,Java没有 引用传递 这么一说. Java仅仅有值传递.传递的都是值,基本数据类型传递的是值.引用类型传递的是地址值. 我来理一下这当中宛如米线跟米面绞在一起了,再跟粉丝混在一起的关系. 好的 ...

  9. Java中只有值传递,(及值传递与引用传递详解)

    首先呢,我们来说一下值传递与引用传递的区别(这两个玩意儿实在调用函数的时候提到的) 比如说 code( a) code( int a ) code(a)是调用函数,a是我们原本函数的一个值类型,然后使 ...

随机推荐

  1. 如何解决iOS6、iOS7 3.5寸和4.0寸屏的适配问题?不要写两个xib文件

    如何解决iOS6.iOS7 3.5寸和4.0寸屏的适配问题?不要写两个xib文件

  2. Git:配置

    概念 一般在新的系统上,我们都需要先配置下自己的Git 工作环境.配置工作只需一次,以后升级时还会沿用现在的配置.当然,如果需要,你随时可以用相同的命令修改已有的配置. Git 提供了一个叫做git ...

  3. ibatis.net:第五天,QueryForObject

    xml <statement id="LoadOrder" parameterClass="int" resultClass="Order&qu ...

  4. 一篇linux的通讯文章

    今年的linux内核开发大会上,google的开发人员也上台做了名为“how google use linux”的演讲.我斗胆翻译注解一番――括号内为注解,欢迎读者斧正. 原文链接参见:http:// ...

  5. mysql递归查询子类ID查询所有子类

    先来看数据表的结构如下: id  name    parent_id  ---------------------------  1   Home        0  2   About        ...

  6. localhost与127.0.0.1及本机ip的区别

    很多人会接触到这个ip地址127.0.0.1.也许你会问127.0.0.1是什么地址?其实127.0.0.1是一个回送地址,指本地机,一般用来测试使用.大家常用来ping 127.0.0.1来看本地i ...

  7. 行尸走肉第八季/全集The Walking Dead迅雷下载

    <行尸走肉第八季>将在10月22号回归播出, 将于5月1日起正式开始拍摄!目前剧组已开始招募客串演员和丧尸群演,第八季拍摄时长初步预计会持续到11月16日.而这三位已确认为<行尸走肉 ...

  8. 盾牌第一至七季/全集The Shield迅雷下载

    英文译名The Shield,第1-7季(2002-2008)FX.本季看点:<盾牌>一部极具争议性的连续剧,打破了传统警匪片套路,刻画了性格复杂的警察,他们在与各种罪案做斗争的同时,也面 ...

  9. 得到ImageView中drawable显示的区域的计算方法

    我们都知道Imageview中有不同的拉伸比率,比如fitStart,centCrop这样的,所以imageview中的drawable不一定和imageview占有相同的位置和大小,那么怎么计算呢? ...

  10. Bluemix结合DevOps Service实现一键部署

    林炳文Evankaka原创作品.转载请注明出处http://blog.csdn.net/evankaka 摘要:本文讲述了怎样通过Bluemix与DevOps Service相结合.来构建与部署一个持 ...