日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

C++学习——引用和指针

發(fā)布時(shí)間:2024/7/19 c/c++ 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C++学习——引用和指针 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

文章目錄

    • 1. 引用和指針的區(qū)別?
    • 2. C++中的指針參數(shù)傳遞和引用參數(shù)傳遞

1. 引用和指針的區(qū)別?

  • 指針是一個(gè)實(shí)體,需要分配內(nèi)存空間。引用只是變量的別名,不需要分配內(nèi)存空間。
  • #include<iostream> using namespace std;class solution { public:void print() {cout << "print" << endl;} private:int a;int b; }; int main() {int* p1 = new int;double* p2 = new double;solution* p3 = new solution;cout << "字節(jié)數(shù):" << sizeof(p1) << " " << "指針值所在內(nèi)存地址:" << &p1 <<endl;cout << "字節(jié)數(shù):" << sizeof(p1) << " " << "指針值所在內(nèi)存地址:" << &p2 << endl;cout << "字節(jié)數(shù):" << sizeof(p1) << " " << "指針值所在內(nèi)存地址:" << &p3 << endl;return 0; } 字節(jié)數(shù):4 指針值所在內(nèi)存地址:008FF9EC 字節(jié)數(shù):4 指針值所在內(nèi)存地址:008FF9E0 字節(jié)數(shù):4 指針值所在內(nèi)存地址:008FF9D4

    從代碼可以看出,指針都占用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的別名。

  • 引用在定義的時(shí)候必須進(jìn)行初始化,并且不能夠改變。指針在定義的時(shí)候不一定要初始化,并且指向的空間可變。(注:不能有引用的值不能為NULL)
  • #include<iostream> using namespace std;int main() {int a = 1;int b = 5;int* p;//正確,指針可以不進(jìn)行初始化p = &a;cout << "*p=" << *p << " " << "a=" << a << endl;p = &b;//正確,指針的指向可以發(fā)生改變cout << "*p=" << *p << " " << "a=" << a << endl;return 0; } *p=1 a=1 *p=5 a=1

    上面代碼說明,指針可以不進(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ā)生改變。

  • 有多級(jí)指針,但是沒有多級(jí)引用,只能有一級(jí)引用。
  • #include<iostream> using namespace std;int main() {int** p;//正確,二級(jí)指針int&& r;//錯(cuò)誤,沒有多級(jí)引用return 0; }
  • 指針和引用的自增運(yùn)算結(jié)果不一樣。(指針是指向下一個(gè)空間,引用時(shí)引用的變量值加1)
  • #include<iostream> using namespace std;int main() {double a = 3.14;double* p = &a;cout << "p指向的地址:" << p << endl;p++;cout << "p自增指向的地址:" << p << endl;int b=8;int& r = b;cout << "r=" << r << endl;r++;cout << "r=" << r << endl;return 0; } p指向的地址:00EFFC58 p自增指向的地址:00EFFC60 r=8 r=9

    以上代碼可以看出: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í)參變量。

  • #include<iostream> using namespace std;void p_fun(int* p) {int a = 108;p = &a; }void r_fun(int& r) {r = 100; } int main() {int value1 = 10;int* p = &value1;cout << "p指向的地址:" << p << endl;p_fun(p);cout<< "p指向的地址:" << p << endl;int value2 = 11;int& r = value2;cout << "value2=" << value2 << endl;r_fun(r);cout << "value2=" << value2 << endl;return 0; } p指向的地址:0075FB7C p指向的地址:0075FB7C value2=11 value2=100

    指針作為參數(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)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。