• 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语言指针操作(八)*动态内存分配与指向它的指针变量 

  • 相关阅读:
    是否需要提高代码阅读能力?这有技巧
    ANR系列之ContentProvider类型原理讲解
    面试:ArrayList和LinkedList
    openEuler 22.03 LTS 环境使用 Docker Compose 一键部署 JumpServer (all-in-one 模式)
    远程Debug运行在容器内的Java项目实践整理
    java毕业设计MVC的时鲜蔬菜配送系统Mybatis+系统+数据库+调试部署
    【JAVA刷题初阶】刷爆力扣第三弹——数组
    Xilinx Artix7-100T低端FPGA解码MIPI视频,基于MIPI CSI-2 RX Subsystem架构实现,提供工程源码和技术支持
    浅谈—IBIS入门理解(二)
    GBASE 8A v953报错集锦28--使用企业管理器执行 select count(1) into @c from t1;报错
  • 原文地址:https://blog.csdn.net/m0_63794226/article/details/126597206