C++中的指针数组(存储指针的数组)
在 C++ 里,如果数组中的元素均为指针变量,这样的数组称为指针数组。
一维指针数组的定义形式如下:
由于数组名本身也是指针,因此上述代码中指针数组的数组名 p 就是一个指向指针的指针。C++ 中,可以这样定义指向指针的指针:
使用指向指针的指针获取指针数组中的元素,和利用指针获取一维数组中的元素方法相同,如下图所示:

图 1 指向指针的指针
其中,第一次“*”运算获取的是一个地址,再进行一次“*”运算,就可以获取具体值。
【实例】字符串排序。将指针数组中的元素指向若干个字符串,然后调用 sort() 函数进行排序,并调用 print() 函数输出排序后的字符串。程序代码如下:

图 2 p 指向的字符串
利用指针变量访问另一个变量是间接访问。如果在一个指针变量中存放一个目标变量的地址,就是单级间址。指向指针的指针用的是二级间址方法,还有三级间址和四级间址,但二级间址应用最为普遍。
一维指针数组的定义形式如下:
类型名 *数组名[数组长度];例如,定义一个指针数组 p,并为 p[0] 赋值,代码如下:
int *p[4]; // 定义指针数组 p,包含 4 个指针变量 p[0]、p[1]、p[2]、p[3] int a = 1; // 定义整型变量 a *p[0] = &a; // 指针 p[0] 指向 a 的地址
由于数组名本身也是指针,因此上述代码中指针数组的数组名 p 就是一个指向指针的指针。C++ 中,可以这样定义指向指针的指针:
int **p; // 也可以是 int *p其中,“*”运算符表示 p 是一个指针变量,(*p) 表示这是一个指向指针的指针。
使用指向指针的指针获取指针数组中的元素,和利用指针获取一维数组中的元素方法相同,如下图所示:

图 1 指向指针的指针
其中,第一次“*”运算获取的是一个地址,再进行一次“*”运算,就可以获取具体值。
【实例】字符串排序。将指针数组中的元素指向若干个字符串,然后调用 sort() 函数进行排序,并调用 print() 函数输出排序后的字符串。程序代码如下:
#include <iostream> #include <cstring> using namespace std; void sort(char *name[], int n) // 定义 sort() 函数,对字符串进行排序 { char *temp; int i, j, k; for (i = 0; i < n - 1; i++) { k = i; for (j = i + 1; j < n; j++) // 使用 strcmp() 函数比较两个字符串 if (strcmp(name[k], name[j]) > 0) k = j; if (k != i) { temp = name[i]; name[i] = name[k]; name[k] = temp; } } } void print(char *name[], int n) // 定义 print() 函数,输出指针数组中的元素 { int i = 0; char *p; p = name[0]; while (i < n) { p = *(name++); cout << p << endl; } } int main() { char *name[] = { "c.biancheng.net", "soft", "C++", "biancheng" }; // 定义指针数组,存放 4 个字符串 int n = 4; sort(name, n); // 调用 sort() 函数排序 print(name, n); // 调用 print() 函数输出字符串 return 0; }程序运行结果为:
C++ biancheng c.biancheng.net softprint() 函数中,name 表示指针数组首元素的地址,name+i 表示 name[i] 的地址,即指向指针的指针。还可以设置一个指针变量 p,指向指针数组的元素。p 就是指向指针型数据的指针变量,它指向的字符串如下图所示。

图 2 p 指向的字符串
利用指针变量访问另一个变量是间接访问。如果在一个指针变量中存放一个目标变量的地址,就是单级间址。指向指针的指针用的是二级间址方法,还有三级间址和四级间址,但二级间址应用最为普遍。