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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

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

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

文章目錄

    • 1. 引用和指針的區別?
    • 2. C++中的指針參數傳遞和引用參數傳遞

1. 引用和指針的區別?

  • 指針是一個實體,需要分配內存空間。引用只是變量的別名,不需要分配內存空間。
  • #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 << "字節數:" << sizeof(p1) << " " << "指針值所在內存地址:" << &p1 <<endl;cout << "字節數:" << sizeof(p1) << " " << "指針值所在內存地址:" << &p2 << endl;cout << "字節數:" << sizeof(p1) << " " << "指針值所在內存地址:" << &p3 << endl;return 0; } 字節數:4 指針值所在內存地址:008FF9EC 字節數:4 指針值所在內存地址:008FF9E0 字節數:4 指針值所在內存地址:008FF9D4

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

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

    上面代碼說明,指針可以不進行初始化,并且指針指向的變量可以發生改變。

    #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的綁定關系不發生改變。

  • 有多級指針,但是沒有多級引用,只能有一級引用。
  • #include<iostream> using namespace std;int main() {int** p;//正確,二級指針int&& r;//錯誤,沒有多級引用return 0; }
  • 指針和引用的自增運算結果不一樣。(指針是指向下一個空間,引用時引用的變量值加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++會使得p指向地址變為下一個地址空間,因為p指向的變量類型為double型,所以地址值加8個字節;引用自增,會加1。

  • sizeof 引用得到的是所指向的變量(對象)的大小,而sizeof 指針得到的是指針本身的大小。

  • 引用訪問一個變量是直接訪問,而指針訪問一個變量是間接訪問。

  • 使用指針前最好做類型檢查,防止野指針的出現;

  • 引用底層是通過指針實現的;

  • 作為參數時也不同,傳指針的實質是傳值,傳遞的值是指針的地址;傳引用的實質是傳地址,傳遞的是變量的地址。

  • 2. C++中的指針參數傳遞和引用參數傳遞

  • 指針參數傳遞本質上是值傳遞,它所傳遞的是一個地址值。值傳遞過程中,被調函數的形式參數作為被調函數的局部變量處理,會在棧中開辟內存空間以存放由主調函數傳遞進來的實參值,從而形成了實參的一個副本(替身)。值傳遞的特點是,被調函數對形式參數的任何操作都是作為局部變量進行的,不會影響主調函數的實參變量的值(形參指針變了,實參指針不會變)。

  • 引用參數傳遞過程中,被調函數的形式參數也作為局部變量在棧中開辟了內存空間,但是這時存放的是由主調函數放進來的實參變量的地址。被調函數對形參(本體)的任何操作都被處理成間接尋址,即通過棧中存放的地址訪問主調函數中的實參變量(根據別名找到主調函數中的本體)。因此,被調函數對形參的任何操作都會影響主調函數中的實參變量。

  • #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

    指針作為參數傳入函數,函數內部改變指針指向的地址值,并不影響主調函數內指針值;引用作為參數傳入函數,函數內部改變引用的值,那么主調函數中的引用和引用綁定的變量都會發生改變。

  • 引用傳遞和指針傳遞是不同的,雖然他們都是在被調函數棧空間上的一個局部變量,但是任何對于引用參數的處理都會通過一個間接尋址的方式操作到主調函數中的相關變量。而對于指針傳遞的參數,如果改變被調函數中的指針地址,它將應用不到主調函數的相關變量。如果想通過指針參數傳遞來改變主調函數中的相關變量(地址),那就得使用指向指針的指針或者指針引用。

  • 從編譯的角度來講,程序在編譯時分別將指針和引用添加到符號表上,符號表中記錄的是變量名及變量所對應地址。指針變量在符號表上對應的地址值為指針變量的地址值,而引用在符號表上對應的地址值為引用對象的地址值(與實參名字不同,地址相同)。符號表生成之后就不會再改,因此指針可以改變其指向的對象(指針變量中的值可以改),而引用對象則不能修改。

  • 總結

    以上是生活随笔為你收集整理的C++学习——引用和指针的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。