1. 程式人生 > >傳值、傳址和傳引用

傳值、傳址和傳引用

上一個 play 基本 大神 clas 默認 alt 通過 約定

  在編寫個人函數的時候,你將受到C++中一條基本原則的限制:在默認的情況下,參數只能以值傳遞的方式給函數。這句話的理解是:被傳遞到函數的只是變量的值,永遠不會是變量本身。舉例如下:

#include <iostream>

void changeAge( int age, int newAge );

// 如果想要實現計劃功能,需要怎麽改?
 
main()
{
    int age = 24;
    std::cout << "My age is " << age << "\n";
    
    changeAge( age, age
+1 ); std::cout << "Now my age is " << age << "\n"; } void changeAge( int age, int newAge ) { age = newAge; std::cout << "In this , my age is " << age << "\n"; }
技術分享圖片
My age is 24
In this , my age is 25
Now my age is 24
請按任意鍵繼續. . .
View Code

  繞開“值傳遞”問題的第一種方法是向函教傳遞變量的地址取代它的值。我們說C語言強大,有很大一部分就是在於他的靈活,他的靈活,有大一部分就是可以利用指針進行委婉地亂改。。。正如我們所理解的,想要獲取某個變量的地址只需要在它前邊加上一個“取地址”操作符(&)就行了。


  那我們可以試著這樣:changeAge(&age,age+1)

#include <iostream>

void changeAge( int *age, int newAge );

// 如果想要實現計劃功能,需要怎麽改?
 
main()
{
    int age = 24;
    std::cout << "My age is " << age << "\n";
    
    changeAge( &age, age+1 );
    
    std::cout << "Now my age is 
" << age << "\n"; } void changeAge( int *age, int newAge ) { *age = newAge; std::cout << "In this , my age is " << *age << "\n"; }
技術分享圖片
My age is 24
In this , my age is 25
Now my age is 25
請按任意鍵繼續. . .
View Code

  註意:如果傳過去的是地址,在函教中必須要通過“*”對指針進行解引用,除非你有其他用途。

  練習題:swap.cpp

技術分享圖片
#include <iostream>

void swap( int *x, int *y );

main()
{
    int x, y;
    
    std::cout << "請輸入兩個不同的值:";    
    std::cin >> x >> y;
    
    swap( &x, &y );
    
    std::cout << "調換後輸出:" << x <<   << y << "\n\n"; 
}

void swap( int *x, int *y )
{
    int temp;
    temp = *x;
    *x = *y;
    *y = temp;
}
View Code

  另外的一種不需要中有的互換方案:swap2.cpp

技術分享圖片
#include <iostream>

void swap( int *x, int *y );

main()
{
    int x, y;
    
    std::cout << "請輸入兩個不同的值:";    
    std::cin >> x >> y;
    
    swap( &x, &y );
    
    std::cout << "調換後輸出:" << x <<   << y << "\n\n"; 
}

void swap( int *x, int *y )
{
    //利用異或操作 
    *x ^= *y;
    *y ^= *x;
    *x ^= *y;
}
View Code

引用傳遞
  傳址在我們看來已經是很不錯,不過C++語言的大神們在完善的過程中完善了地址這個概念。
  設想:如果事先就知道某個函數的參數只能接受一個地址,能不能使用某種約定使得在調用該函數時不需要使用指針的語法呢?
  於是乎,以引用傳遞方式傳遞輸入方式的概念因比而產生了。
  其實他跟我們這個傳址的目的是一樣的,都是把地址傳遞給函數,但語法不同更加容易使用了。以swap舉例如下:

#include <iostream>

void swap( int &x, int &y ); //引用傳遞:聲明時接受的是地址 

main()
{
    int x, y;
    
    std::cout << "請輸入兩個不同的值:";    
    std::cin >> x >> y;
    
    swap( x, y );
    
    std::cout << "調換後輸出:" << x <<   << y << "\n\n"; 
}

void swap( int &x, int &y )
{
    int temp;
    temp = x;
    x = y;
    y = temp;
}

傳值、傳址和傳引用