天天看點

C++中方括号[]的作用總結

  今天在程式設計的時候,遇到這樣一條語句”delete [] p;”,回想之前使用delete基本上都是采用的”delete p;”的方式,比較好奇這兩種語句的差別。查找相關資料資料之後,決定進一步地把C++中最為常見的符号“[]”的作用進行總結。

  一般來說,“[]”的作用一共有三種:

  

1.

  聲明變量時使用“[]”,表示數組。如下所示:

  int a[5];  //定義了一個大小為5的整型數組

  int a[]={1,2,3,4,5};  //定義一個整型數組并初始化

  int *p=new int[size];  //申請一個動态整型數組,數組長度由變量size決定

  int (*a)[10];  //定義一個數組指針,注意:*a表明a是指針類型,而[10]則表明a指向的是一個大小為10的數組。

  int *a[10];  //這一條與上一條對比來看,同樣表示了一個大小為10的數組,不過數組元素均是指向整型變量的指針,故稱為指針數組。

  

2.

  表示下标運算。如下所示:

  int *p;

  p[1]=2;

  上面的語句不難了解:定義了一個指向整型變量的指針p,由于指針變量中儲存着位址,通過“位址+[]”的運算即可給下一位址指派2.

  關于指針與位址再多寫一些。記得剛學c語言的時候,為這兩者之間的關系困惑了很久。後來我們老師是這樣解釋的:你可以建立一個整型變量a來存儲整型數,同樣也可以建立指針(變量)來存儲相應資料位址。你可以使用整型變量a進行各種運算,如(a+2)*3,同樣地,指針也可以“代表”資料位址進行各種處理,譬如上面的p[1]=2.

  STL中的一些模闆,也重載了[]運算符,如vector和map。

  

3.

  訓示指針。這種用法一般是在數組作為函數參數時會用到。如下所示:

  void fun(int a[]);  //[]說明a是一個指針變量

  void fun(int a[][10]);   //前一個“[]”說明a是指針類型,後一個“[]”則說明指針數組的大小為10.這裡的“數組”指的是由二維數組行向量構成的一維數組。這種書寫方式一般是在二維數組作為函數參數調用時會用到,此處的10即代表的是數組第二維的大小。需要注意的是,第二維的大小必須明确。

  void fun(int (*a)[10]);  //這種寫法和上面是等價的。同樣,必須規定第二維的大小。第一維的大小則不受限制,甚至會被編譯器“忽略”。例如,你定義了一個函數void func(int a[3][10]),如果此時實參是b[5][10],也可以通過編譯,即使它的第一維長度5超過了形參的一維長度3;而如果實參是b[3][8],則不會編譯通過,因為它們的第二維長度不一緻。 

  值得注意的是,void fun(int **p)與上式的含義是不一樣的。這裡的p表示的是指針的指針,是“二重”的指針,與int *a[10]中的a是一個意思;而void fun(int a[][10])中的a是二維數組的行向量構成的一維數組的指針,歸根結底是“一重”的指針。

————————————————————我是分割線———————————————————

  回到最開始提到的問題:delete p與delete[] p到底有什麼差別?查閱資料可知,這兩種用法分别是operator delete函數的兩個重載版本。

  通常來說,如果p指向的是單個對象的話,應當調用delete p,以釋放記憶體;如果p指向的是一組對象的記憶體位址的話,則應當調用delete[] p,可以達到逐個調用每個對象的析構函數,再釋放記憶體的效果。在第二種情況下,如果還是使用delete p語句,則除p[0]之外對象的記憶體沒有得到釋放,會造成記憶體洩漏。

  需要注意的是,如果p指向的一組對象都是像int/long/float一類的簡單資料類型,由于它們沒有析構函數,是以此時使用delete p與使用delete[] p的效果是一緻的。  

繼續閱讀