首页 > 其他 > 详细

计算机组成原理+传值传引用传指针

时间:2021-06-14 17:35:52      阅读:21      评论:0      收藏:0      [点我收藏+]
最近结合计算机组成原理再学习一遍C++基础,现在对函数的值传递、引用传递和指针传递都有了新的认识,CPU能够操作的是指令和地址,所有你看到的数字实际上都是在内存中的一个地址
1.值传递:
01调用函数时,相当于p1=c,p2=d(将内存中c和d的值复制一份,分别存在另一处地址上)
02在函数内部,是对复制的后的内存进行交换操作,不是对被复制的数(内存)进行操作,因此只会修改函数内部,不会对主函数的值造成影响
03值传递的适用范围:当函数内部需要修改参数,并且不希望这个改变影响调用者时,采用值传递。
 1 #include <iostream>
 2 
 3 using namespace std;
 4 void swap2(int p1, int p2) //定义---此处传的是数值
 5 {
 6     cout<<"funIn value p1="<<p1<<" funIn value p2="<<p2<<"  funIn addr p1:"<<&p1<<" funIn addr p2:"<<&p2<<endl;
 7     int p; p=p1; p1=p2; p2=p;
 8     cout <<"p addr"<<&p<<endl;
 9     cout<<"funOut value p1="<<p1<<" funOut value p2="<<p2<<"  funOut addr p1:"<<&p1<<" funOut addr p2:"<<&p2<<endl;
10   }
11 int main()//调用
12 {
13     int c=3,d=4;
14     cout<<"Input value c="<<c<<" Input value d="<<d<<"  Input addr c:"<<&c<<" Input addr d:"<<&d<<endl;
15     swap2(c,d);
16     cout<<"Output value c="<<c<<" Output value d="<<d<<"  Output addr c:"<<&c<<" Output addr d:"<<&d;
17 }

运行结果:

技术分享图片

 

 2.引用传递:

01调用函数时,相当于&p1=c,&p2=d(将内存中c和d分别取别名,不懂取别名的要先看看引用的基础)

02在函数内部,用着这个别名(形参)的操作实际是操作的实参(从函数中打印c和d的地址可以看出操作的是实参所在的内存地址),

03引用传递的适用范围:当希望函数能改变实参的值时候,使用引用传递

04再来几行代码让你看看引用(起别名)的意义:打印结果是01,这说明给了别名之后,对原变量的操作是操作,对引用名字的操作也是对原变量的操作,总之!!原名字和引用名都是指向同一个变量(也是同一个内存地址),可以理解成给你起了个小名,你的大名和小名都指向你。

#include <iostream>

using namespace std;

int main()
{
    int a=0 ;
    const int &ra=a;
    cout << ra;
   // ra=1;//错误的!因为不能再对ra赋值了
    a=1;
    cout << ra;
}

 

 1 #include <iostream>
 2 
 3 using namespace std;
 4 void swap2(int &p1, int &p2) //定义---此处传的是引用
 5 {
 6     cout<<"funIn value p1="<<p1<<" funIn value p2="<<p2<<"  funIn addr p1:"<<&p1<<" funIn addr p2:"<<&p2<<endl;
 7     int p; p=p1; p1=p2; p2=p;
 8     cout <<"p addr"<<&p<<endl; 
 9     cout<<"funOut value p1="<<p1<<" funOut value p2="<<p2<<"  funOut addr p1:"<<&p1<<" funOut addr p2:"<<&p2<<endl;
10   }
11 int main()//调用
12 {
13     int c=3,d=4;
14     cout<<"Input value c="<<c<<" Input value d="<<d<<"  Input addr c:"<<&c<<" Input addr d:"<<&d<<endl;
15     swap2(c,d);
16     cout<<"Output value c="<<c<<" Output value d="<<d<<"  Output addr c:"<<&c<<" Output addr d:"<<&d;
17 }

运行结果:

技术分享图片

 

 3.指针传递:

(1)

01调用函数时,相当于*p1=&c,*p2=&d(在内存中新建两个指针分别为*p1和*p2(声明),p1指针指向c所在的地址(定义),p2指针指向d所在的地址(定义)),不懂指针声明和定义的先去看看书)

02在函数内部,定义了一个临时变量p,两两交换后(始终是值交换),p1和p2指向的地址未变,变的是指向的地址的内容,而其指向的内容就是实参c和实参d,下图中的第7行就是在操作实参c和d

03指针传递适用范围:

 

 1 #include <iostream>
 2 
 3 using namespace std;
 4 void swap2(int *p1, int *p2) //定义---此处传的是指针
 5 {
 6     cout<<"funIn pointvalue p1="<<*p1<<" funIn pointvalue p2="<<*p2<<"  funIn value p1="<<p1<<" funIn value p2="<<p2<<"  funIn addr p1:"<<&p1<<" funIn addr p2:"<<&p2<<endl;
 7     int p; p=*p1; *p1=*p2; *p2=p;
 8     cout <<"funIn pointvalue p="<<p<<"  funIn value p="<<p<<"  funIn addr p:"<<&p<<endl;
 9     cout<<"funOut pointvalue p1="<<*p1<<" funOut pointvalue p2="<<*p2<<"  funOut value p1="<<p1<<" funOut value p2="<<p2<<"  funOut addr p1:"<<&p1<<" funOut addr p2:"<<&p2<<endl;
10   }
11 int main()//调用
12 {
13     int c=3,d=4;
14     cout<<"Input value c="<<c<<" Input value d="<<d<<"  Input addr c:"<<&c<<" Input addr d:"<<&d<<endl;
15     swap2(&c,&d);
16     cout<<"Output value c="<<c<<" Output value d="<<d<<"  Output addr c:"<<&c<<" Output addr d:"<<&d;
17 }

运行结果:

技术分享图片

 

(2)介绍一个容易和(1)混淆的代码

01调用函数时,相当于*p1=&c,*p2=&d(在内存中新建两个指针分别为*p1和*p2(声明),p1指针指向c所在的地址(定义),p2指针指向d所在的地址(定义)),不懂指针声明和定义的先去看看书)

02在函数内部,定义了一个临时指针*p,两两交换后(始终是指针相互交换),p1和p2指向的地址互换,但这个互换并未影响c和d的值以及c和d所在的地址,因此实参c、d未发生任何改变

02

 1 #include <iostream>
 2 
 3 using namespace std;
 4 void swap2(int *p1, int *p2) //定义---此处传的是指针
 5 {
 6     cout<<"funIn pointvalue p1="<<*p1<<" funIn pointvalue p2="<<*p2<<"  funIn value p1="<<p1<<" funIn value p2="<<p2<<"  funIn addr p1:"<<&p1<<" funIn addr p2:"<<&p2<<endl;
 7     int *p; p=p1; p1=p2; p2=p;
 8     cout <<"funIn pointvalue p="<<*p<<"  funIn value p="<<p<<"  funIn addr p:"<<&p<<endl;
 9     cout<<"funOut pointvalue p1="<<*p1<<" funOut pointvalue p2="<<*p2<<"  funOut value p1="<<p1<<" funOut value p2="<<p2<<"  funOut addr p1:"<<&p1<<" funOut addr p2:"<<&p2<<endl;
10   }
11 int main()//调用
12 {
13     int c=3,d=4;
14     cout<<"Input value c="<<c<<" Input value d="<<d<<"  Input addr c:"<<&c<<" Input addr d:"<<&d<<endl;
15     swap2(&c,&d);
16     cout<<"Output value c="<<c<<" Output value d="<<d<<"  Output addr c:"<<&c<<" Output addr d:"<<&d;
17 }

运行结果:

技术分享图片

 

 

 

计算机组成原理+传值传引用传指针

原文:https://www.cnblogs.com/huskyWuWuWu/p/14882176.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!