C++ 值傳遞 址傳遞 引用傳遞

1:按值傳遞:

 

    程序如下:

 

view plaincopy to clipboardprint?

#include <iostream>  

using namespace std;  

void swap(int a,int b)//指針保存地址  

{  

int c;  

cout<<"前: a:"<<a<<" b:"<<b<<endl;  

c=a;  

a=b;  

b=c;  

cout<<"後: a:"<<a<<" b:"<<b<<endl;  

}  

int main()  

{  

   int a=3,b=4;  

   cout<<"主程序前:a:"<<a<<" b:"<<b<<endl;  

   swap(a,b);//取地址傳遞 變量的內存地址  

   cout<<"主程序後:a:"<<a<<" b:"<<b<<endl;  

   return 0;  

#include <iostream>

using namespace std;

void swap(int a,int b)//指針保存地址

{

int c;

cout<<"前: a:"<<a<<" b:"<<b<<endl;

c=a;

a=b;

b=c;

cout<<"後: a:"<<a<<" b:"<<b<<endl;

}

int main()

{

         inta=3,b=4;

         cout<<"主程序前: a:"<<a<<" b:"<<b<<endl;

         swap(a,b);//取地址傳遞變量的內存地址

         cout<<"主程序後: a:"<<a<<" b:"<<b<<endl;

         return0;

}

 

輸出的結果是:

 

主程序前: a:3  b:4

 

前: a:3  b:4

 

後: a:4  b:3

 

主程序前: a:3  b:4

 

主程序的值沒有改變,改變的值是棧中的a 和b的副本的值,值傳遞的時候在棧中拷貝一個變量的副本來操作,這樣的話就改變不了以前的值.用的時候要小心.

 

      

 

2:按址傳遞:

 

這個時候是用地址傳遞 程序如下:

 

 viewplaincopy to clipboardprint?

#include <iostream>  

using namespace std;  

void swap(int *a,int *b)//指針保存地址  

{  

int c;  

cout<<"前: a:"<<*a<<" b:"<<*b<<endl;  

c=*a;  

*a=*b;  

*b=c;  

cout<<"後: a:"<<*a<<" b:"<<*b<<endl;  

}  

int main()  

{  

   int a=3,b=4;  

   cout<<"主程序前:a:"<<a<<"  b:"<<b<<endl;  

   swap(&a,&b);//取地址傳遞 變量的內存地址  

   cout<<"主程序後:a:"<<a<<" b:"<<b<<endl;  

   return 0;  

#include <iostream>

using namespace std;

void swap(int *a,int *b)//指針保存地址

{

int c;

cout<<"前: a:"<<*a<<" b:"<<*b<<endl;

c=*a;

*a=*b;

*b=c;

cout<<"後: a:"<<*a<<" b:"<<*b<<endl;

}

int main()

{

         inta=3,b=4;

         cout<<"主程序前: a:"<<a<<" b:"<<b<<endl;

         swap(&a,&b);//取地址傳遞變量的內存地址

         cout<<"主程序後: a:"<<a<<" b:"<<b<<endl;

         return0;

}

 

 

這個就是按地址傳遞 在方法swap(&a,&b);的參數中&a,&b都是取地址 那麼傳遞過去的地址由指針來接收所以在定義函數的時候有void swap(int *a,int *b)定義了倆個指針來存放地址,這樣就好理解了 swap(){}函數裏面的操作都是按指針來操作的*a ,*b

 

這樣的話結果就是:

 

 

主程序前: a:3  b:4

 

前: a:3  b:4

 

後: a:4  b:3

 

主程序前: a:4  b:3

 

可以看到結果是改變了,因爲直接操作的是a,b的內存地址

 

 

 

3:按別名(引用)傳遞:

 

 viewplaincopy to clipboardprint?

#include <iostream>  

using namespace std;  

void swap(int &a,int&b)//接收倆個別名  

{  

int c;  

cout<<"前: a:"<<a<<" b:"<<b<<endl;  

c=a;  

a=b;  

b=c;  

cout<<"後: a:"<<a<<" b:"<<b<<endl;  

}  

int main()  

{  

   int a=3,b=4;  

   cout<<"主程序前:a:"<<a<<" b:"<<b<<endl;  

   swap(a,b);//直接傳遞a b 傳遞過去的時候由別名接收那麼就是自身的別名了  

   cout<<"主程序後:a:"<<a<<" b:"<<b<<endl;  

   return 0;  

#include <iostream>

using namespace std;

void swap(int &a,int &b)//接收倆個別名

{

int c;

cout<<"前: a:"<<a<<" b:"<<b<<endl;

c=a;

a=b;

b=c;

cout<<"後: a:"<<a<<" b:"<<b<<endl;

}

int main()

{

         inta=3,b=4;

         cout<<"主程序前: a:"<<a<<" b:"<<b<<endl;

         swap(a,b);//直接傳遞a b 傳遞過去的時候由別名接收 那麼就是自身的別名了

         cout<<"主程序後: a:"<<a<<" b:"<<b<<endl;

         return0;

}

 

 

  這樣的話接受的參數就是倆個別名,他們分別是主函數中a b的別名,因爲別名和自身一樣所以結果就改變了

 

主程序前: a:3  b:4

 

前: a:3  b:4

 

後: a:4  b:3

 

主程序前: a:4  b:3

 

可以看到用值傳遞一不小心就達不到目的了,用地址傳遞的話寫法會比較困難,不小心會出錯,用引用傳遞的話考慮的問題就沒有那麼多了,我們就可以放心的使用了,寫函數的時候用引用,那麼調用的時候就不用考慮太多了.

發佈了14 篇原創文章 · 獲贊 19 · 訪問量 17萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章