C、C++用指標引用的差異

weixin_34377065發表於2015-08-08
1:並引述之間的區別在概念的指標

  參考是可變的別名。例如

  int m;
  int &n=m;
  引用作為一個別名。它在邏輯上不是獨立的。它的存在具有依附性。所以引用必須在一開始就被初始化。並且其引用的物件在其整個生命週期中是不能被改變的(自始至終僅僅能依附於同一個變數)。

則不論什麼對引用的操作即對變數的操作。

引用通常是用於處理函式的引數與返回值。


使用規則:
  a:引用在建立的時候必須被初始化(指標能夠在不論什麼時候賦值)
  b:引用必須與一個確定的合法記憶體單元相關聯。

不存在NULL引用。
  c:一旦引用初始化後,就不能改變引用所指向的變數。



#include <iostream>
#include<cstdio>
using namespace std;
int main()
{
	int a=1;
	int b=2;
	int &k=b;
	printf("%d   %d   %d   %p    %p    %p\n",a,b,k,&a,&b,&k);
	k=a;
	printf("%d   %d   %d   %p    %p    %p\n",a,b,k,&a,&b,&k);
	return 0;
}

非常明顯。引用別名k和b有著同樣的地址,會間接性改變b變數。

(符合a,b,c規則)

     指標是一個變數。其存放的是另外一個是變數的地址。

   int m;
   int *n=&m;

所以通過指標能夠對變數的地址進行直接操作,這樣程式猿有著更加靈活的選擇,可是,指標會帶來很多其它的不安全因素。
因此作為一個變數的指標。其在邏輯上是獨立的,它能夠被改變。包含其所指向的地址的改變和其指向的地址中所存放的資料的改變。
 
  3:引用於指標在函式傳參時的差別:


在C++中。指標和引用經經常使用於函式的引數傳遞。然而,指標傳遞引數和引用傳遞引數是有本質上的不同的:


指標傳遞引數本質上是值傳遞的方式。它所傳遞 的是一個地址值。

值傳遞過程中,被調函式的形式引數作為被調函式的區域性變數處理,即在棧中開闢了記憶體空間以存放由主調函式放進來的實參的值,從而成為了實 參的一個副本。值傳遞的特點是被調函式對形式引數的不論什麼操作都是作為區域性變數進行。不會影響主調函式的實參變數的值。

(這裡是在說實參指標本身的地址值不會變)
而在引用傳遞過程中,被調函式的形式引數儘管 也作為區域性變數在棧中開闢了記憶體空間,可是這時存放的是由主調函式放進來的實參變數的地址。被調函式對形參的不論什麼操作都被處理成間接定址,即通過棧中存放 的地址訪問主調函式中的實參變數。正由於如此,被調函式對形參做的不論什麼操作都影響了主調函式中的實參變數。
 
二者更加細微的差別有:
●相對於前面介紹的const的使用方法,沒有int& const a這樣的形式,而const int& a是有的,  前者指引用本身即別名不能夠改變。這是當然的。所以不須要這樣的形式。後者指引用所指的值不能夠改變。
 
●“sizeof 引用”得到的是所指向的變數(物件)的大小,而“sizeof 指標”得到的是指標本身的大小;
●指標和引用的自增(++)運算意義不一樣;
●引用是型別安全的,而指標不是 (引用比指標多了型別檢查

  引用在函式引數傳遞中的運用。(類似於固定了的static型別。但又能夠自由改變)

#include <iostream>

using namespace std;

void Func(int &n)
{
    n++;
    cout<<"now the value is "<<n<<endl;
}
int main()
{
    int a=10;
    Func(a);
    Func(a);
}
部分內容來自:http://www.cnblogs.com/lintong/archive/2012/07/28/2613222.html

版權宣告:本文部落格原創文章,部落格,未經同意,不得轉載。

相關文章