• C语言指针操作(七)*指针数组和多重指针


    在这里插入图片描述

    学习的最大理由是想摆脱平庸,早一天就多一份人生的精彩;迟一天就多一天平庸的困扰。 

    学习日记

    目录

    学习日记

    前言​编辑

     一、什么是指针数组

    二、指向指针数据的指针变量

    例1

    例2

     三、指针数组作main函数的形参

    注意

    C语言指针操作


    前言

            指针这里分为八个小部分,分别是“指针变量”、“通过指针引用数组”、“*通过指针引用多维数组”、“通过指针引用字符串”、“*指向函数的指针”、“*返回指针值的函数”、“*指针数组和多重指针”、“*动态内存分配与指向它的指针变量” 。   

     一、什么是指针数组

    类型名 *数组名[数组长度];                                int *p[4];

            一个数组,若其元素均为指针类型数据,称为指针数组,也就是说,指针数组中的每一个元素都存放一个地址,相当于一个指针变量。 指针数组比较适合用来指向若干个字符串,使字符串处理更加方便灵活。 

            将若干字符串按字母顺序(由小到大)输出。

    1. #include <stdio.h>
    2. #include <string.h>
    3. int main()
    4. { void sort(char *name[],int n); //函数声明
    5. void print(char *name[],int n); //函数声明
    6. char *name[]={"Follow me","BASIC",
    7. "Great Wall","FORTRAN","Computer design"};
    8. //定义指针数组,它的元素分别指向5个字符串
    9. int n=5;
    10. sort(name,n); //调用sort函数,对字符串排序
    11. print(name,n); //调用print函数,输出字符串
    12. return 0;
    13. }
    14. void sort(char *name[],int n) //定义sort函数
    15. { char *temp;
    16. int i,j,k;
    17. for(i=0;i<n-1;i++) //用选择法排序
    18. { k=i;
    19. for(j=i+1;j<n;j++)
    20. if(strcmp(name[k],name[j])>0) k=j;
    21. if(k!=i)
    22. { temp=name[i]; name[i]=name[k]; name[k]=temp;}
    23. }
    24. }
    25. void print(char *name[],int n) //定义print函数
    26. { int i;
    27. for(i=0;i<n;i++)
    28. printf("%s\n",name[i]);
    29. //按指针数组元素的顺序输出它们所指向的字符串
    30. }

    二、指向指针数据的指针变量

            在了解了指针数组的基础上,需要了解指向指针数据的指针变量,简称为指向指针的指针。

            name是一个指针数组,它的每一个元素是一个指针型的变量,其值为地址。name既然是一个数组,它的每一元素都应有相应的地址。数组名name代表该指针数组首元素的地址。name+i是name[i]的地址。name+i就是指向指针型数据的指针。还可以设置一个指针变量p,它指向指针数组的元素。p就是指向指针型数据的指针变量。 

    name

    name数组

    字符串

    name[0]

    Follow me

    p

    name[1]

    BASIC

    name[2]

    Great Wall

    name[3]

    FORTRAN

    name[4]

    Computer design

     定义一个指向指针数据的指针变量:char **p;

            p的前面有两个*号。p指向一个字符指针变量(这个字符指针变量指向一个字符型数据)。如果引用*p,就得到p所指向的字符指针变量的值。 

    1. p=name+2;
    2. printf(″%d\n″,*p); //name[2]的值(它是一个地址)
    3. printf(″%s\n″,*p); //以字符串形式(%s)输出字符串″Great Wall″

    例1

            使用指向指针数据的指针变量。

    1. #include <stdio.h>
    2. int main()
    3. { char *name[]={"Follow me","BASIC","Great Wall","FORTRAN","Computer design"};
    4. char **p;
    5. int i;
    6. for(i=0;i<5;i++)
    7. { p=name+i;
    8. printf("%s\n",*p);
    9. }
    10. return 0;
    11. }

    指针数组的元素也可以不指向字符串,而指向整型数据或实型数据等。

    例2

            有一个指针数组,其元素分别指向一个整型数组的元素,用指向指针数据的指针变量,输出整型数组各元素的值。

    1. #include <stdio.h>
    2. int main()
    3. { int a[5]={1,3,5,7,9};
    4. int *num[5]={&a[0],&a[1],&a[2],&a[3],&a[4]};
    5. int **p,i; //p是指向指针型数据的指针变量
    6. p=num; //使p指向num[0]
    7. for(i=0;i<5;i++)
    8. { printf("%d ",**p);
    9. p++;
    10. }
    11. printf("\n");
    12. return 0;
    13. }

    利用指针变量访问另一个变量就是“间接访问”。 

    如果在一个指针变量中存放一个目标变量的地址,这就是“单级间址”;

    指针变量

    变量

    地址

     指向指针数据的指针用的是“二级间址”方法;

    指针变量1

    指针变量2

    变量

    地址1

    地址2

    从理论上说,间址方法可以延伸到更多的级,即多重指针。 

    指针变量1

    指针变量2

    指针变量n

    变量

    地址1

    地址2

    地址n

     三、指针数组作main函数的形参

            指针数组的一个重要应用是作为main函数的形参。main函数的第1行一般写成

    int main()int main(void)
    

    括号中是空的或有“void”,表示main函数没有参数,调用main函数时不必给出实参。

            在某些情况下,main函数可以有参数,int main(int argc, char *argv[])

            argc和argv就是main函数的形参,它们是程序的“命令行参数”。argc(argument count的缩写,意思是参数个数),argv(argument vector缩写,意思是参数向量),它是一个*char指针数组,数组中每一个元素(其值为指针)指向命令行中的一个字符串的首字符。

    注意

            如果用带参数的main函数,其第一个形参必须是int型,用来接收形参个数(文件名也算一个参数),第二个形参必须是字符指针数组,用来接收从操作系统命令行传来的字符串中首字符的地址。 

    C语言指针操作

    C语言指针操作(一)指针变量

    C语言指针操作(二)通过指针引用数组

    C语言指针操作(三)*通过指针引用多维数组 

    C语言指针操作(四)通过指针引用字符串

    C语言指针操作(五)*指向函数的指针

    C语言指针操作(六)*返回指针值的函数

    C语言指针操作(七)*指针数组和多重指针 

    C语言指针操作(八)*动态内存分配与指向它的指针变量 

  • 相关阅读:
    Lattice SII9136CTU-3 HDMI1.4 视频音频接口芯片
    linux环境安装redis(亲测完成)
    海尔空调、新风系统加装wifi模块
    【UV打印机】电气之光电传感器
    c++桥接模式,中介者模式应用实现状态跳转
    Django老项目升级到新版本
    Spring基础:注解实现AOP
    【讲解下常见的Web前端框架】
    Helloworld 驱动模块加载
    C#创建ini文件写入并读取
  • 原文地址:https://blog.csdn.net/m0_63794226/article/details/126597206