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