首页 > 编程笔记 > C++笔记 阅读:2

C++中的指针数组(存储指针的数组)

C++ 里,如果数组中的元素均为指针变量,这样的数组称为指针数组

一维指针数组的定义形式如下:
类型名 *数组名[数组长度];
例如,定义一个指针数组 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
soft
print() 函数中,name 表示指针数组首元素的地址,name+i 表示 name[i] 的地址,即指向指针的指针。还可以设置一个指针变量 p,指向指针数组的元素。p 就是指向指针型数据的指针变量,它指向的字符串如下图所示。


图 2 p 指向的字符串

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

相关文章