一、什麼是指針數組
指針數組是指一個數組的元素都是指針類型,即指向其他變量的地址。可以將指針數組看作是一個數組,但每個元素都是指針,可以指向不同的變量。
int a = 1, b = 2, c = 3; int *p[3]; // 定義一個指針數組,元素個數為3 p[0] = &a; // 第0個元素指向變量a p[1] = &b; // 第1個元素指向變量b p[2] = &c; // 第2個元素指向變量c cout << *p[0] << " " << *p[1] << " " << *p[2] << endl; // 輸出1 2 3
二、指針數組的應用
指針數組常用於實現動態內存分配,可以根據需要動態的生成指針數組,來靈活的操作內存。
int n; cin >> n; // 用戶輸入元素個數 int *p = new int[n]; // 動態分配內存 for (int i = 0; i > *(p + i); // 用戶輸入元素的值 } // 輸出輸入的元素值 for (int i = 0; i < n; i++) { cout << *(p + i) << " "; } delete[] p; // 釋放內存
另外,指針數組也可以用於實現多態性,通過基類的指針數組,來遍歷所有子類對象。
class Base { public: virtual void func() { cout << "Base::func()" << endl; } }; class Derived1 : public Base { public: void func() { cout << "Derived1::func()" << endl; } }; class Derived2 : public Base { public: void func() { cout << "Derived2::func()" << endl; } }; int main() { Base* arr[2]; // 定義一個基類指針數組 Derived1 d1; Derived2 d2; arr[0] = &d1; // 第一個元素指向Derived1對象 arr[1] = &d2; // 第二個元素指向Derived2對象 for (int i = 0; i func(); // 遍歷所有子類對象並調用其func函數 } return 0; }
三、指針數組的優勢
指針數組可以充分利用指針的優勢,節約內存空間。例如,對於一個數組元素的交換操作,使用指針數組可以大大減少內存操作。
int a[2] = { 1, 2 }; int *p[2] = { a, a + 1 }; // 指針數組元素指向a數組元素地址 swap(*p[0], *p[1]); // 交換指針數組元素指向的變量的值 cout << a[0] << " " << a[1] << endl; // 輸出2 1
同時,指針數組還可以方便的使用指針運算,實現指向數組元素的操作。
char s[5] = { 'a', 'b', 'c', 'd', 'e' }; char *p[5]; // 定義char類型的指針數組 for (int i = 0; i < 5; i++) { p[i] = &s[i]; // 指向s數組元素地址 } for (char **q = p; q < p + 5; q++) { cout << **q << " "; // 輸出a b c d e }
四、指針數組的注意事項
使用指針數組需要注意以下幾點:
- 指針數組的每個元素必須是指針類型。
- 指針數組的元素指向的應該是已經存在的變量或動態分配的內存。
- 使用指針數組時,必須慎重考慮指針變量的生存期,否則會出現未定義的行為。
- 指針數組訪問元素時必須保證下標不越界。
五、結論
指針數組是C++中非常重要的一個概念,它可以靈活的操作內存和對象的指針。在實際開發中,需要根據具體情況選擇是否使用指針數組,在使用時要注意指針變量的生存期和下標訪問的安全性。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/244738.html