1. 程式人生 > 其它 >計算機組成原理+傳值傳引用傳指標

計算機組成原理+傳值傳引用傳指標

最近結合計算機組成原理再學習一遍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 }

執行結果: