指標傳遞引數本質上是值傳遞的方式,它傳遞的是乙個位址。在值傳遞過程中,被調函式的形式引數作為被呼叫函式的區域性變數處理,即在棧中開闢記憶體空間來存放主調函式傳進來的實參的值,從而成為實參的乙個副本。值傳遞的特點是被呼叫函式對形式引數的任何操作都是作為區域性變數進行,不會影響主調函式的實參變數的值。對於指標傳遞的引數,如果改變被調函式中的指標位址,它將影響不到主調函式的相關變數,這裡是在說實參指標本身的位址值不會變
。指標傳遞引數時,指標中存放的也是實參的位址,但是在被調函式內部指標存放的內容可以被改變,即可能改變指向的實參,所以並不安全)
而在引用傳遞過程中,被調函式的形式引數雖然也作為區域性變數在棧中開闢了記憶體空間,但是這時存放的是由主調函式放進來的實參變數的位址(int &a的形式)。被調函式對形參的任何操作都被處理成間接定址,即通過棧中存放的位址訪問主調函式中的實參變數。正因為如此,被調函式對形參做的任何操作都影響了主調函式中的實參變數。
引用傳遞和指標傳遞是不同的,雖然它們都是在被調函式棧空間上的乙個區域性變數,但是任何對於引用引數的處理都會通過乙個間接定址的方式操作到主調函式中的相關變數。而對於指標傳遞的引數,如果改變被調函式中的指標位址,它將影響不到主調函式的相關變數。如果想通過指標引數傳遞來改變主調函式中的相關變數,那就得使用指向指標的指標,或者指標引用。
從編譯的角度來看,程式在編譯時分別將指標和引用新增到符號表上,符號表上記錄的是變數名及變數所對應位址。指標變數在符號表上對應的位址值為指標變數的位址值,而引用在符號表上對應的位址值為引用物件的位址值。符號表生成後就不會再改,因此指標可以改變其指向的物件(指標變數中的值可以改),而引用物件則不能修改。
●都是位址的概念;
指標指向一塊記憶體,它的內容是所指記憶體的位址;而引用則是某塊記憶體的別名。
●指標是乙個實體,而引用僅是個別名;
●引用只能在定義時被初始化一次,之後不可變;指標可變;引用「從一而終」,指標可以「見異思遷」;
●引用沒有const,指標有const,const的指標不可變;(具體指沒有int& const a這種形式,而const int& a是有 的, 前者指引用本身即別名不可以改變,這是當然的,所以不需要這種形式,後者指引用所指的值不可以改變)
●引用不能為空,指標可以為空;
●「sizeof 引用」得到的是所指向的變數(物件)的大小,而「sizeof 指標」得到的是指標本身的大小;
●指標和引用的自增(++)運算意義不一樣;
●引用是型別安全的,而指標不是 (引用比指標多了型別檢查
const對指標和引用的限定是有差別的。
常量指標:指向常量的指標,在指標定義語句的型別前加const,表示指向的物件是常量。
定義指向常量的指標只限制指標的間接訪問操作,而不能規定指標指向的值本身的操作規定性。
常量指標定義"const int* pointer=&a"告訴編譯器,*pointer是常量,不能將*pointer作為左值進行操作。
常量引用:指向常量的引用,在引用定義語句的型別前加const,表示指向的物件是常量。也跟指標一樣不能利用引用對指向的變數進行重新賦值操作。
在指標定義語句的指標名前加const,表示指標本身是常量。在定義指標常量時必須初始化!而這是引用天生具來的屬性,不用再引用指標定義語句的引用名前加const。
指標常量定義"int* const pointer=&b"告訴編譯器,pointer是常量,不能作為左值進行操作,但是允許修改間接訪問值,即*pointer可以修改。
常量指標常量:指向常量的指標常量,可以定義乙個指向常量的指標常量,它必須在定義時初始化。常量指標常量定義"const int* const pointer=&c"告訴編譯器,pointer和*pointer都是常量,他們都不能作為左值進行操作。
而就不存在所謂的"常量引用常量",因為跟上面講的一樣引用變數就是引用常量。c++不區分變數的const引用和const變數的引用。程式決不能給引用本身重新賦值,使他指向另乙個變數,因此引用總是const的。如果對引用應用關鍵字const,起作用就是使其目標稱為const變數。即沒有:const double const& a=1;只有const double& a=1;
指標引用和引用指標的區別
c 在傳參的過程中,指標 和指標引用 是有區別的。雖然,我們往往可以通過傳指標然後通過間址訪問來修改指標所指向物件的值,同樣,通過引用也可以直接修改物件的值。但是,當傳指標的時候有乙個問題,就是,我們雖然可以通過指標來修改指標所指向物件的值,但是我們沒有不能直接修改指標的內容 也就是指標變數存放的位...
傳指標和傳指標引用的區別 指標和引用的區別(本質)
指標傳遞引數本質上是值傳遞的方式,它所傳遞的是乙個位址值。值傳遞過程中,被調函式的形式引數作為被調函式的區域性變數處理,即在棧中開闢了記憶體空間以存放由主調函式放進來的實參的值,從而成為了實參的乙個副本。值傳遞的特點是被調函式對形式引數的任何操作都是作為區域性變數進行,不會影響主調函式的實參變數的值...
傳指標和傳指標引用的區別 指標和引用的區別(本質)
指標傳遞引數本質上是值傳遞的方式,它所傳遞的是乙個位址值。值傳遞過程中,被調函式的形式引數作為被調函式的區域性變數處理,即在棧中開闢了記憶體空間以存放由主調函式放進來的實參的值,從而成為了實參的乙個副本。值傳遞的特點是被調函式對形式引數的任何操作都是作為區域性變數進行,不會影響主調函式的實參變數的值...