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

剛接觸指針的時候,你極可能會以爲:數組和指針基本上是同一個東西。的確,數組和指針均可以用*取值,均可以加減某個數得到別的指針,均可以用[]來取值……例以下面的代碼: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的返回值,類型都是指針。數組和指針是兩種不一樣的類型。code

另外,數組加減一個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

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

int arr1[5], arr2[5];
int* ptr = arr1;
ptr = arr2; //能夠
arr1 = arr2; //不能夠,error: array type 'int [5]' is not assignable
相關文章
相關標籤/搜索