傳值、傳址和傳引用
阿新 • • 發佈:2019-01-11
上一個 play 基本 大神 clas 默認 alt 通過 約定
那我們可以試著這樣:changeAge(&age,age+1)
在編寫個人函數的時候,你將受到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; }
傳值、傳址和傳引用