CC++中的值传递,引用传递,指针传递,指针引用传递

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

CC++中的值传递,引⽤传递,指针传递,指针引⽤传递
在⾯试过程中,被⾯试官问到传值和传引⽤的区别,之前没有关注过这个问题,今天在⽹上找了⼀篇包含代码和图⽚的讲解⽂章,浅显易懂,遂转载备忘。

参考:[]
1. 值传递
1void f( int p){
2 printf("\n%x",&p);
3 printf("\n%x",p);
4 p=0xff;
5 }
6void main()
7 {
8int 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. 引⽤传递
1void f( int & p){
2 printf("\n%x",&p);
3 printf("\n%x",p);
4 p=0xff;
5 }
6void main()
7 {
8int 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. 指针传递
1void f( int*p){
2 printf("\n%x",&p);
3 printf("\n%x",p);
4 printf("\n%x\n",*p);
5 *p=0xff;
6 }
7void main()
8 {
9int 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. 指针的引⽤传递
1void f( int*&p){
2 printf("\n%x",&p);
3 printf("\n%x",p);
4 printf("\n%x\n",*p);
5 *p=0xff;
6 }
7void main()
8 {
9int a=0x10;
10 printf("\n%x",&a);
11 printf("\n%x\n",a);
12int *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的内容。

⽰意图如下:
我们再来看⼀下如果不⽤指针的引⽤传递会出现什么结果
1void f( int*p){
2 printf("\n%x",&p);
3 printf("\n%x",p);
4 printf("\n%x\n",*p);
5 *p=0xff;
6 }
7void main()
8 {
9int a=0x10;
10 printf("\n%x",&a);
11 printf("\n%x\n",a);
12int *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。

⽰意图如下:。

相关文档
最新文档