C++中數組和指針的區別

剛接觸指針的時候,你很可能會覺得:數組和指針基本上是同一個東西。的確,數組和指針都可以用*取值,都可以加減某個數獲得別的指針,都可以用[]來取值……例如下面的代碼:

int arr[5] = {2, 3, 5, 7, 9}; //定義一個數組,長度爲5
int* arr_ptr = arr; //定義一個指針指向數組arr

cout << "*arr = " << *arr << "\t*(arr + 3) = " << *(arr + 3) << "\t\tarr[3] = " << arr[3] << endl;
cout << "*arr_ptr = " << *arr_ptr << "\t*(arr_ptr + 3) = " << *(arr_ptr + 3) << "\tarr_ptr[3] = " << arr_ptr[3] << endl;

/* 
  輸出:
  *arr = 2        *(arr + 3) = 7          arr[3] = 7
  *arr_ptr = 2    *(arr_ptr + 3) = 7      arr_ptr[3] = 7
*/

嗯,看來數組和指針確實很像。但是數組和指針並不是完全等價的,一個簡單的例子就是sizeof:

int arr[5]; //定義一個數組,長度爲5
int* arr_ptr = arr; //定義一個指針指向數組arr

cout << "Size of arr: " << sizeof arr << endl; //輸出20,20 = 4 * 5
cout << "Size of arr_ptr: " << sizeof arr_ptr << endl; //輸出8(在64位系統上)

面對數組,sizeof運算符(注意sizeof不是函數)求出了這個數組所佔所有空間的大小(一個int佔4字節,5個int佔了20字節);但是面對指針arr_ptr,sizeof直接求出了arr_ptr這個int*類型的變量的大小。在64位系統上,一個內存地址需要8字節來存儲,所以sizeof arr_ptr就是8。

利用c++的typeinfo頭文件,我們還可以直接看看這些變量的類型是什麼:

int arr[5] = {2, 3, 5, 7, 9}; //定義一個數組,長度爲5
auto arr_ptr = arr; //定義一個指針指向數組arr
auto new_ptr = new int[5]; //new出來5個int類型對象

cout << "Type of arr: " << typeid(arr).name() << endl; //輸出A5_i,表示arr是一個長度爲5的int類型數組
cout << "Type of arr_ptr: " << typeid(arr_ptr).name() << endl; //輸出Pi,表示arr_ptr的類型是int的指針
cout << "Type of new_ptr: " << typeid(new_ptr).name() << endl; //也輸出Pi

可以發現,arr的類型是數組,而且這個類型裏自帶了數組的長度;而無論是直接定義出來的指針變量還是new的返回值,類型都是指針。數組和指針是兩種不同的類型。

另外,數組加減一個int之後,也會變成指針;兩個指針相減,則會返回long類型。

cout << "Type of (arr + 1): " << typeid(arr + 1).name() << endl; //輸出Pi
cout << "Type of (arr_ptr + 1): " << typeid(arr_ptr + 1).name() << endl; //輸出Pi
cout << "Type of (arr - arr_ptr): " << typeid(arr - arr_ptr).name() << endl; //輸出l

另外一個區別是:指針變量是可以賦值的,一個指針可以從前指向位置1、後來指向位置2;而數組是不能被賦值的。

int arr1[5], arr2[5];
int* ptr = arr1;
ptr = arr2; //可以
arr1 = arr2; //不可以,error: array type 'int [5]' is not assignable

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章