传值 传引用 传地址

本文介绍了编程中三种常见的参数传递方式:传值、传地址和传引用。传值是将实参的副本传递给形参,不改变实参;传地址则是传递实参的内存地址,允许形参修改实参;传引用直接让形参和实参指向同一内存空间。通过通俗的文件比喻和实例解析,帮助读者深入理解这三种传递方式,并提供了面试中常出现的三个相关题目供读者思考。

传值:就是把实参的值传给形参,实参的值不改变,形参接收到值

传地址:以传值的方式传递一个特殊的值,这里的值是存的地址;那么传递后也可以通过形参改变实参

传引用:以地址的形式真正的传递参数,形参和实参指向同一个内存;改变形参,就会相应的改变实参


通俗理解:

值传递好比是你把文件复制一份,通过网络传给他,然后他可以在他本机上对文件做任何的修改,修改会保存下来,但是你机器上的文件不会发生任何的变化。即形参与实参是两个不同的变量,各自占用不同的存储单元。

地址传递好比是你把文件在网络上的地址告诉他人,他人通过网络访问你机器上的文件,他可以对文件进行修改并保存,此时,文件的内容就会发生变化。即形参与实参是相同的变量,占用同一段内存空间。


下面的实例一定要仔细看

//传值
#include <"stdio.h">

int getSquare(int);

int main()

{

  int r=5;

  printf("The original value of r is %d\n",r);

  getSquare(r);

  printf("The new value of r is %d\n",r);

  return 0;

}

int getSquare(int i)

{

  return i*i;

}

//传引用(地址)

#include <"stdio.h">

int getSquare(int *);

int main()

{

  int r=5;

  printf("The original value of r is %d\n",r);

  getSquare(&r);

  printf("The new value of r is %d\n",r);

}

int getSquare(int *i)

{

  return *i * *i;

}




面试常出的三个题目:

1. 考题一:程序代码如下:

#include "stdlib.h"

void Exchg1(int x, int y)
{
  //printf("x=%x,y=%x\n",&x,&y);
  //printf("x0=%d,y0=%d\n",x,y);

  int tmp;
  tmp=x;
  x=y;
  y=tmp;

  //printf("x=%x,y=%x\n",&x,&y);

  printf("x=%d,y=%d\n",x,y);
}
void main()
{
  int a=4,b=6;

  printf("a=%x,b=%x\n",&a,&b);

  Exchg1 (a,b) ;
  printf("a=%d,b=%d\n",a,b);
}


输出的结果:
x=____, y=____
a=____, b=____

问下划线的部分应是什么,请完成。

答案:

x=6, y=4
a=4, b=6

如果大家把注释的两个地方去掉会看到如下给力大图



解析;这里纯属值传递,x,y的值确实交换啦;但是这和a,b没有任何关系;所以说改变的只是函数内部的值。

2. 考题二:代码如下。

#include "stdlib.h"

Exchg2(int *px, int *py)
{
  int tmp=*px;
  *px=*py;
  *py=tmp;
  //printf("px=%x,py=%x\n",px,py);
  printf("*px=%d,*py=%d\n",*px,*py);
}
main()
{
  int a=4;
  int b=6;
  printf("a=%x and b=%x\n",&a,&b);
  Exchg2(&a,&b);
  printf("a=%d,b=%d\n", a, b);
  return 0;
}




输出的结果为:
*px=____, *py=____
a=____, b=____

问下划线的部分应是什么,请完成。

答案:

如果大家把注释的两个地方去掉会看到如下给力大图


3. 考题三:

#include "stdlib.h"

Exchg2(int &x, int &y)
{
   int tmp=x;
   x=y;
   y=tmp;
   printf("x=%d,y=%d\n",x,y);
}
main()
{
  int a=4;
  int b=6;
  printf("a=%x and b=%x\n",&a,&b);

  Exchg2(a,b);
  printf("a=%d,b=%d\n", a, b);
}


输出的结果:
x=____, y=____

a=____, b=____


(这种函数写法就是不对的 )



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值