C++学习——引用和指针
文章目錄
- 1. 引用和指針的區(qū)別?
- 2. C++中的指針參數(shù)傳遞和引用參數(shù)傳遞
1. 引用和指針的區(qū)別?
從代碼可以看出,指針都占用4字節(jié)的空間
#include<iostream> using namespace std;int main() {double a = 3.14;double& b = a;cout << "b占用的字節(jié)數(shù):" << sizeof(b) << " " << "b的地址:" << &b << endl;cout << "a占用的字節(jié)數(shù):" << sizeof(a) << " " << "a的地址:" << &a << endl;return 0; } b占用的字節(jié)數(shù):8 b的地址:00E3FC1C a占用的字節(jié)數(shù):8 a的地址:00E3FC1C從代碼可以看出,a和b的大小相同,并且所在地址相同,所以a就是b,b就是a,引用b是a的別名。
上面代碼說明,指針可以不進(jìn)行初始化,并且指針指向的變量可以發(fā)生改變。
#include<iostream> using namespace std;int main() {int a = 1;int b = 5;int& r;//錯(cuò)誤,引用必須進(jìn)行初始化return 0; } 運(yùn)行錯(cuò)誤引用必須進(jìn)行初始化
#include<iostream> using namespace std;int main() {int a = 1;int b = 5;int& ref = a;ref = 3;cout << "a=" << a << " " << "ref=" << ref << endl;ref = b;cout << "a=" << a << " " << "ref=" << ref << endl;ref = 108;cout << "a=" << a << " " << "ref=" << ref << endl;return 0; } a=3 ref=3 a=5 ref=5 a=108 ref=108以上代碼說明,ref成為a的引用后,也即別名后,ref就和a綁定在一起,ref發(fā)生什么變化,a就發(fā)生什么變化,即ref和a的綁定關(guān)系不發(fā)生改變。
以上代碼可以看出:p++會(huì)使得p指向地址變?yōu)橄乱粋€(gè)地址空間,因?yàn)閜指向的變量類型為double型,所以地址值加8個(gè)字節(jié);引用自增,會(huì)加1。
sizeof 引用得到的是所指向的變量(對(duì)象)的大小,而sizeof 指針得到的是指針本身的大小。
引用訪問一個(gè)變量是直接訪問,而指針訪問一個(gè)變量是間接訪問。
使用指針前最好做類型檢查,防止野指針的出現(xiàn);
引用底層是通過指針實(shí)現(xiàn)的;
作為參數(shù)時(shí)也不同,傳指針的實(shí)質(zhì)是傳值,傳遞的值是指針的地址;傳引用的實(shí)質(zhì)是傳地址,傳遞的是變量的地址。
2. C++中的指針參數(shù)傳遞和引用參數(shù)傳遞
指針參數(shù)傳遞本質(zhì)上是值傳遞,它所傳遞的是一個(gè)地址值。值傳遞過程中,被調(diào)函數(shù)的形式參數(shù)作為被調(diào)函數(shù)的局部變量處理,會(huì)在棧中開辟內(nèi)存空間以存放由主調(diào)函數(shù)傳遞進(jìn)來的實(shí)參值,從而形成了實(shí)參的一個(gè)副本(替身)。值傳遞的特點(diǎn)是,被調(diào)函數(shù)對(duì)形式參數(shù)的任何操作都是作為局部變量進(jìn)行的,不會(huì)影響主調(diào)函數(shù)的實(shí)參變量的值(形參指針變了,實(shí)參指針不會(huì)變)。
引用參數(shù)傳遞過程中,被調(diào)函數(shù)的形式參數(shù)也作為局部變量在棧中開辟了內(nèi)存空間,但是這時(shí)存放的是由主調(diào)函數(shù)放進(jìn)來的實(shí)參變量的地址。被調(diào)函數(shù)對(duì)形參(本體)的任何操作都被處理成間接尋址,即通過棧中存放的地址訪問主調(diào)函數(shù)中的實(shí)參變量(根據(jù)別名找到主調(diào)函數(shù)中的本體)。因此,被調(diào)函數(shù)對(duì)形參的任何操作都會(huì)影響主調(diào)函數(shù)中的實(shí)參變量。
指針作為參數(shù)傳入函數(shù),函數(shù)內(nèi)部改變指針指向的地址值,并不影響主調(diào)函數(shù)內(nèi)指針值;引用作為參數(shù)傳入函數(shù),函數(shù)內(nèi)部改變引用的值,那么主調(diào)函數(shù)中的引用和引用綁定的變量都會(huì)發(fā)生改變。
引用傳遞和指針傳遞是不同的,雖然他們都是在被調(diào)函數(shù)??臻g上的一個(gè)局部變量,但是任何對(duì)于引用參數(shù)的處理都會(huì)通過一個(gè)間接尋址的方式操作到主調(diào)函數(shù)中的相關(guān)變量。而對(duì)于指針傳遞的參數(shù),如果改變被調(diào)函數(shù)中的指針地址,它將應(yīng)用不到主調(diào)函數(shù)的相關(guān)變量。如果想通過指針參數(shù)傳遞來改變主調(diào)函數(shù)中的相關(guān)變量(地址),那就得使用指向指針的指針或者指針引用。
從編譯的角度來講,程序在編譯時(shí)分別將指針和引用添加到符號(hào)表上,符號(hào)表中記錄的是變量名及變量所對(duì)應(yīng)地址。指針變量在符號(hào)表上對(duì)應(yīng)的地址值為指針變量的地址值,而引用在符號(hào)表上對(duì)應(yīng)的地址值為引用對(duì)象的地址值(與實(shí)參名字不同,地址相同)。符號(hào)表生成之后就不會(huì)再改,因此指針可以改變其指向的對(duì)象(指針變量中的值可以改),而引用對(duì)象則不能修改。
總結(jié)
以上是生活随笔為你收集整理的C++学习——引用和指针的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 排序算法以及基本数据结构
- 下一篇: 数据结构——队列的C++实现