一、什么是指针数组
指针数组是指一个数组的元素都是指针类型,即指向其他变量的地址。可以将指针数组看作是一个数组,但每个元素都是指针,可以指向不同的变量。
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 < n; i++) { cin >> *(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 < 2; i++) { arr[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++中非常重要的一个概念,它可以灵活的操作内存和对象的指针。在实际开发中,需要根据具体情况选择是否使用指针数组,在使用时要注意指针变量的生存期和下标访问的安全性。