1. 程式人生 > >面試題4:陣列、指標、引用的聯絡區別

面試題4:陣列、指標、引用的聯絡區別

陣列和指標???

從兩個方面來看,一是作為一個語言,陣列是必須要支援的一種陣列型別,原因很簡單,陣列是線性表的直接體現。而從編譯器設計者的角度來看,如果為陣列專門設計一套實現標準會非常繁雜(事實上,後來C++完成了這一任務,它就是標準庫中的vector容器)。這一對矛盾最後以雙方的相互妥協得以解決,而解決方法就是利用現有的指標來間接實現陣列

編譯器為了簡化對陣列的支援,實際上是利用指標實現了對陣列的支援。具體來說,就是將表示式中的陣列元素引用轉化為指標加偏移量的引用。這麼說大家可能不理解,首先什麼是引用呢?引用其實就是使用,從編譯器的角度來看,就是從一個符號找到對應記憶體並進行讀寫的過程。

要區分兩個相關的概念,一定要將二者的作用區分清楚,即為什麼要有這個東西。就比如sizeof與strlen的區分,只要明白了二者各自的作用,就會發現二者其實根本沒有一點兒關係,完全是為了實現不同功能而設定的。陣列和指標也是一樣,指標是一類特殊的變數,主要用途是函式間的傳址,用這種方式來改變實參內容。而陣列是用來實現線性表的結構,用於把同類物件集中在一起放置。所以,如果下次有人問你陣列和指標的區別,你首先第一句要說的就是二者根本沒有聯絡,這麼說並這麼理解,對於弄清這兩個傢伙的關係是很有裨益的。

___________________________________________________________________________________________

舉例:

1.陣列的分配與釋放

陣列在記憶體中是連續存放的,開闢一塊連續的記憶體空間;陣列所佔儲存空間:sizeof(陣列名),陣列大小:sizeof(陣列名)/sizeof(資料型別)。初始化字元陣列時要注意字串結尾處有結尾符‘\0’。 

char a[]={"Hello"};//按字串初始化,大小為6.
char b[]={'H','e','l','l','o'};//按字元初始化(錯誤,輸出時將會亂碼,沒有結束符)

char c[]={'H','e','l','l','o','\0'};//按字元初始化

2.指標的分配與釋放:

指標是一種型別,包含其他變數的地址,也有的叫它“地址變數”。指標的型別是說明指標所指向的地址空間的型別。

申請、釋放堆中的指標,使用new 和 delete,動態分配失敗,返回一個空指標(NULL)

指向物件的指標:int *p=new int(0) ;    delete p;(()裡面的值是初始化值)

指向陣列的指標:int *p=new int[n];    delete[] p;(n表示陣列的大小,值不必再編譯時確定,可以在執行時確定)

指向類的指標:Class *p=new Class;  delete p;(若建構函式有引數,則new Class後面有引數,否則呼叫預設建構函式,delete呼叫解構函式)

指標陣列:一個數組裡面存放的同類型的指標,如 int *a[10];需要對陣列每個元素初始化如:a[0]=new int [n];a[1]=new int [m];釋放也要單獨釋放:delete a[0];delete a[1]

陣列指標:指向陣列的指標。1維:int *p=new int[10];delete []p; 2維:int (*p)[10]=new int[10][10];delete[] p; 3維:int(*p)[9][9]=new int [1][9][9];delete []p;

指標的指標:int **pp=new (int*)[2]; pp[0]=new int[3];pp[1]=new int[4];delete[] pp[0];delete[]pp[1]

——————————————————————————————————————————————

一、引用的定義

引用是給另外一個變數起別名,所以引用不會分配記憶體空間。

引用的宣告方法:型別識別符號 &引用名=目標變數名;(如int &ptr = num;)

二、引用與指標的區別

1、指標是一個實體,需要分配記憶體空間。引用只是變數的別名,不需要分配記憶體空間。

2、引用在定義的時候必須進行初始化,並且不能夠改變。指標在定義的時候不一定要初始化,並且指向的空間可變。(注:不能有引用的值不能為NULL)

3、有多級指標,但是沒有多級引用,只能有一級引用。

4、指標和引用的自增運算結果不一樣。(指標是指向下一個空間,引用時引用的變數值加1)

5、sizeof 引用得到的是所指向的變數(物件)的大小,而sizeof 指標得到的是指標本身的大小。

6、引用訪問一個變數是直接訪問,而指標訪問一個變數是間接訪問。

補充: