C++的array和&array有什麼區別
如果在C++中定義瞭一個數組,例如“ int array[5] ”,那麼“ array ”或“ &array ”是什麼意思?它們是相同的還是不同的?讓我們一探究竟!
要檢查這一點,首先可以想到的是以下程序:
#include <iostream> using namespace std; int main() { int array[5]; cout<<"array= "<<array<<" ,&array= "<<&array<<endl; return 0; }
“ array ”和“ &array ”輸出的地址是相同。雖然地址的內容相同,但它們是不同類型的地址。這才是“ array ”和“ &array ”真正的區別。
為瞭顯示這種差異,修改一下上面的程序:
#include <iostream> using namespace std; int main() { int array[5]; cout<<"array= "<<array<<" ,&array= "<<&array<<endl; cout<<"array+1= "<<array+1<<endl; cout<<"&array+1= "<<&array+1<<endl; return 0; }
運行結果:
將整數添加到指針時會指向該指針類型的下一個地址。從輸出結果可以看出:
- array+1輸出的結果中地址值相較於array增加瞭4個字節。
- &array+1輸出的結果中地址值相較於&array增加瞭20個字節(0x14 bytes)。
通過這個結果可以推斷出:
“ array ”是“指向 array 的第一個元素的指針”,而“ &array ”是“指向 擁有5 個 int 元素的整個數組的指針”。
這個邏輯也可以擴展到多維數組。假設 twoDarray[5][4] 是一個二維數組。這裡,“twoDarray”是一個指向擁有4個int型元素數組的指針,而“&twoDarray”是指向擁有5個元素,每個元素是擁有4個int型元素的數組的,數組的指針”。可以使用程序打印測試。
所以結論是:任何數組名稱本身都是指向數組第一個元素的指針,它更像是&array[0]。 但數組名稱的 &(即地址)是指向整個數組本身的指針。
在使用其它的指針變量通過賦值符號保存地址值時。數組名稱既然代表的是第一個元素,那麼聲明指針變量時就是:元素類型* 指針名稱;而對於&數組名稱,就需要聲明一個指向數組的指針保存&array的值,要註意書寫方式,指向數組的指針的書寫方式與指向函數的指針有些類似。
int* p1 = array; int* p2 = &array[0]; int (*p3)[5] = &array;
如果感覺指向數組的指針書寫形式過於復雜,也可以直接使用auto推斷類型:
int* p1 = array; int* p2 = &array[0]; int (*p3)[5] = &array; auto p4 = &array;
本文部分內容參自:What’s difference between “array” and “&array” for “int array[5]” ?
到此這篇關於C++的array和&array有什麼區別的文章就介紹到這瞭,更多相關C++ array和&array內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!
推薦閱讀:
- C++ 命名空間 using聲明使用示例詳解
- C++ 程序流程結構詳解
- C++深入淺出講解內存四區與new關鍵字的使用
- 詳解C++ STL vector容器訪問元素的幾種方式
- C++的程序流程結構你瞭解多少