指針和數組在c++++中本質不同,使用場景和內存訪問方式也存在差異。1. 指針是變量,存儲地址,可改變指向;數組是連續內存塊,大小固定,不可賦值。2. 數組訪問基于固定偏移,編譯器直接計算地址;指針訪問依賴當前地址,通過移動實現數據訪問。3. 數組適合靜態結構、保證內存連續的場景,如局部數據存儲;指針適合動態內存分配、傳遞大數據或實現復雜結構。4. sizeof運算符對數組返回整體大小,對指針僅返回指針長度;數組傳入函數時退化為指針,需額外參數傳遞長度。理解這些區別有助于合理選擇類型,提高代碼效率與安全性。
在c++中,指針和數組看起來很像,尤其是在表達式中數組名會退化成指針。但它們本質不同,使用場景和內存訪問方式也有差異。
指針是變量,數組是連續內存塊
指針是一個變量,它存儲的是一個地址。你可以讓它指向不同的地方,甚至可以為 nullptr。而數組是一塊連續的內存空間,一旦定義了大小,就不能再變了。
比如:
立即學習“C++免費學習筆記(深入)”;
int a[10]; // 數組,分配了10個int的空間 int* p = a; // 指針指向數組首元素
這里 a 是數組類型,在大多數表達式上下文中會被自動轉換為指向首元素的指針(即 &a[0]),但它本身不是一個變量,不能被賦值,也不能改變指向。
內存訪問方式:偏移計算略有不同
雖然訪問數組元素和通過指針訪問看起來差不多,但底層機制略有區別:
-
數組訪問是基于固定偏移的。編譯器知道數組的起始地址和元素大小,直接通過下標訪問。
a[3] = 10;
-
指針訪問則依賴于當前指針所保存的地址,可以通過移動指針來訪問不同位置的數據。
*(p + 3) = 10;
兩者在運行時的行為可能一樣,但語義上不一樣。數組強調“一塊數據”,指針強調“指向某處”。
使用場景對比:數組適合靜態結構,指針更靈活
-
數組適用的情況:
-
指針適用的情況:
- 動態分配內存(比如用 new 或 malloc);
- 函數間傳遞大型數據結構時避免復制;
- 實現鏈表、樹等復雜數據結構;
- 遍歷或操作數組時作為迭代器使用。
舉個例子:
int* arr = new int[20]; // 動態數組,本質是指針
這時候 arr 是指針,但你可以像數組一樣訪問它的元素。
注意:sizeof 和引用綁定行為不同
這是容易出錯的地方:
- 對數組使用 sizeof 得到的是整個數組占用的字節數;
- 對指針使用 sizeof 只能得到指針本身的大?。ㄍǔJ?或8字節);
例如:
int b[10]; int* q = b; sizeof(b); // 返回 10 * sizeof(int) sizeof(q); // 返回指針大小,與int無關
另外,當你把數組傳給函數時,它會自動退化成指針,因此函數內部無法得知數組的實際長度,除非你額外傳入長度參數。
基本上就這些。指針靈活但容易出錯,數組安全但不夠靈活。理解它們的區別,能幫助你在寫代碼時做出更合適的選擇。