目錄
一、指針與數組:親密無間的伙伴
1.1 指針是數組的 “快捷通道”
1.2 數組名與指針:微妙的差別
1.3 動態數組:指針大顯身手
二、指針與字符串:千絲萬縷的聯系
2.1 字符指針與 C 風格字符串
2.2 指針與 std::string 類
2.3 字符串常量與指針
三、指針在數組和字符串操作中的實際應用
3.1 字符串操作函數中的指針運用
3.2 數組排序:指針優化效率
3.3 復雜數據結構構建:指針串聯數組與字符串
四、總結與展望
一、指針與數組:親密無間的伙伴
在 C++ 的編程世界里,指針與數組就像一對親密無間的伙伴,它們之間的關系既緊密又微妙。理解它們之間的關系,是掌握 C++ 編程的關鍵。
1.1 指針是數組的 “快捷通道”
在 C++ 中,指針可以被看作是訪問數組元素的 “快捷通道”。從內存層面來看,數組在內存中是連續存儲的,數組名實際上就是數組首元素的地址。這就意味著,我們可以通過指針來直接訪問數組元素,而不需要通過數組下標來進行間接訪問。這種方式不僅提高了訪問效率,還為我們提供了更加靈活的操作方式。
例如,我們有一個整型數組arr,可以定義一個指針p指向數組的首元素:
int arr[5] = {1, 2, 3, 4, 5};int *p = arr;
通過指針p,我們可以使用*p來訪問數組的第一個元素,使用*(p + 1)來訪問數組的第二個元素,以此類推。這種方式與使用數組下標arr[0]、arr[1]等效果是一樣的,但在某些情況下,指針操作更加高效。比如,在遍歷數組時,使用指針可以避免每次都進行數組下標的計算,從而提高程序的執行速度:
for (int i = 0; i < 5; i++) {cout << *p << " ";p++;}
1.2 數組名與指針:微妙的差別
雖然數組名和指針在很多情況下表現得極為相似,但它們之間還是存在一些微妙的差別。數組名本質上是一個常量指針,它指向數組的首元素,并且這個指針的值是固定不變的。這意味著我們不能對數組名進行賦值操作,也不能對其進行自增、自減等改變其值的操作。
例如,下面的代碼是錯誤的:
int arr[5] = {1, 2, 3, 4, 5};arr++; // 錯誤,數組名是常量,不能自增int *p = arr;p++; // 正確,指針是變量,可以自增
另外,當我們使用sizeof運算符時,對數組名和指針的計算結果也不同。對數組名使用sizeof,得到的是整個數組占用的內存大小;而對指針使用sizeof,得到的是指針本身的大小(通常在 32 位系統上是 4 個字節,在 64 位系統上是 8 個字節)。
int arr[5] = {1, 2, 3, 4, 5};int *p = arr;cout << sizeof(arr) << endl; // 輸出數組占用的內存大小,例如20(假設int占4個字節)cout << sizeof(p) << endl; // 輸出指針的大小,例如4或8
1.3 動態數組:指針大顯身手
在 C++ 編程中,我們常常需要根據實際需求動態地分配和釋放內存,這時候指針就大顯身手了。通過使用new和delete運算符,我們可以利用指針來創建和銷毀動態數組。
例如,下面的代碼展示了如何使用指針動態分配一個包含 10 個整數的數組:
int *dynamicArray = new int[10];
這里,new int[10]在堆內存中分配了一塊連續的空間,用于存儲 10 個整數,并返回指向這塊空間首地址的指針,將其賦值給dynamicArray。在使用完動態數組后,我們必須使用delete[]來釋放分配的內存,以避免內存泄漏:
delete[] dynamicArray;
內存管理是 C++ 編程中的一個重要環節,如果我們忘記釋放動態分配的內存,就會導致內存泄漏,這可能會使程序的性能逐漸下降,甚至導致程序崩潰。因此,在使用動態數組時,一定要養成及時釋放內存的好習慣。
二、指針與字符串:千絲萬縷的聯系
在 C++ 編程中,指針與字符串之間也有著千絲萬縷的聯系。無論是 C 風格的字符串,還是 C++ 標準庫中的std::string類,指針都在其中扮演著重要的角色。