首页 > 编程笔记 > C语言笔记 阅读:14

C语言二级指针的用法(附带实例)

一个指针可以指向整型变量、实型变量、字符型变量,当然也可以指向另一个指针,此时称其为指向指针的指针,又叫做二级指针。


图 1 二级指针(指向指针的指针)

如上图所示,整型变量 i 的地址是 &i,将其值传递给指针变量 p1,则 p1 指向 i;同时,将 p1 的地址 &p1 传递给 p2,则 p2 指向 p1。这里的 p2 就是指向指针变量的指针,也就是二级指针。

二级指针的定义如下:
类型标识符 **指针变量名;
例如,“int **p;”的含义为定义一个指针变量 p,它指向另一个指针变量,该指针变量又指向一个基本整型变量。由于指针运算符“*”自右至左结合,所以上述定义相当于“int *(*p);”。

知道如何定义二级指针后,可以将图 1 用图 2 更形象地表示出来:


图 2 二级指针

【实例 1】利用二级指针,输出化学周期表前 20 个元素中的金属元素,具体代码如下:
#include<stdio.h>
int main()
{
    int i; /*定义循环控制变量*/
    char **p; /*定义一个指向指针的指针变量*/
    char *element[] = /*定义一个指针数组,并为其赋初值*/
    {
        "锂",
        "铍",
        "钠",
        "镁",
        "铝",
        "钾",
        "钙"
    };
    for(i = 0; i < 7; i++) /*输出指针数组中的各元素*/
    {
        p = element + i;
        printf("%s\n", *p);
    }
    return 0;
}
程序运行结果为:








【实例 2】利用二级指针输出一维数组中其值为偶数的元素,并统计偶数的个数,具体代码如下:
#include<stdio.h>
int main()
{
    int a[10], *p1, **p2, i, n = 0;
    printf("please input:\n");
    for(i = 0; i < 10; i++)
        scanf("%d", &a[i]); /*给数组 a 中各元素赋值*/
    p1 = a; /*将数组 a 的首地址赋给 p1*/
    p2 = &p1; /*将指针 p1 的地址赋给 p2*/
    printf("the array is:");
    for(i = 0; i < 10; i++)
    {
        if(*(*p2 + i) % 2 == 0) /*如果是偶数*/
        {
            printf("%5d", *(*p2 + i)); /*输出数组中的偶数元素*/
            n++; /*偶数个数加 1*/
        }
    }
    printf("\n");
    printf("the number is:%d\n", n);
    return 0;
}
程序运行结果为:

please input:
1 2 3 4 5 6 7 8 9 10
the array is:    2    4    6    8   10
the number is:5

程序中,将数组 a 的首地址赋给指针变量 p1,又将指针变量 p1 的地址赋给 p2,要通过这个双重指针变量 p2 访问数组中的元素,就要一层层地来分析。首先看 *p2 的含义,*p2 指向的是指针变量 p1 所存放的内容,即数组 a 的首地址,要想取出数组 a 中的元素,就必须在 *p2 前面再加一个指针运算符“*”。

根据前面讲过的指针的用法,还可将实例 2 改写成如下形式:
#include<stdio.h>
int main()
{
    int a[10], *p1, **p2, n = 0; /*定义数组、指针等为基本整型*/
    printf("please input:\n");
    for(p1 = a; p1 < a + 10; p1++) /*指针 p1 从 a 的首地址开始变化*/
    {
        p2 = &p1;
        scanf("%d", *p2); /*将指针 p1 的地址赋给 p2 */
                                 /*通过指针变量给数组元素赋初值*/
    }
    printf("the array is:");
    for(p1 = a; p1 < a + 10; p1++) /*再次将指针 p1 的地址赋给 p2 */
    {
        p2 = &p1;
        if(**p2 % 2 == 0) /*如果是偶数*/
        {
            printf("%5d", **p2); /*将数组中的偶数元素输出*/
            n++; /*偶数个数加 1*/
        }
    }
    printf("\n");
    printf("the number is:%d\n", n);
    return 0;
}
运行结果为:

please input:
1 2 3 4 5 6 7 8 9 10
the array is:    2    4    6    8   10
the number is:5

相关文章