• 指针数组概念


    一个数组,其元素均为指针类型数据,称为指针数组

                               即:指针数组中每一个元素都是指针变量

    指针数组的定义格式:

                        类型标识符 *数组名(数字长度说明);

    如:

                        int *p[4];   //每个数组元素都可以看成是一个指针变量,都可以指向 一个整型普通变量。

                    数组指针:int (*p)[4];     //这是指向一维数组的指针变量,也就是说,他首先是一个指针变量。

    例题:

    1. #include
    2. int main()
    3. {
    4. char *pName[]={"C++","JAVA","PYTHON","GO","CSHarp"}; //指针数组
    5. int is1=sizeof(pName); //每个指针变量占4个字节,所以有五个元素一共占20个字节
    6. int isize=is1/sizeof(pName[0]); //20/4=5,表示pName中有5个元素,pName能引用的下标就是[0]-[4]
    7. int i;
    8. char *p2="JAVA"; //把字符串的首地址赋值给指针;字符串常量会固定分配地址;p2=pName[1]
    9. for(i=0;i
    10. {
    11. printf("pName[%d]=%s\n",i,pName[i]);
    12. }
    13. printf("----------------------------------\n");
    14. char *ptemp;
    15. ptemp=pName[0]; //ptemp指向了"C++"
    16. pName[0]=pName[1]; //pName[0]指向了"JAVA"
    17. pName[1]=ptemp; //pName[1]指向了"C++"
    18. /*
    19. ptemp保存了"C++"的地址,然后pName[1]保存了"JAVA"的地址,最后再把"C++"的地址给pName[2].
    20. */
    21. for(i=0;i
    22. {
    23. printf("pName[%d]=%s\n",i,pName[i]);
    24. }
    25. printf("----------------------------------\n");
    26. return 0;
    27. }

    二、指向指针的指针
    用来指向指针变量 的变量,简称:指向指针的指针。
    char **p;    //定义了一个 指向  字符串指针变量的  指针变量
    int **p;       //定义了一个 指向  整型指针变量的  指针变量
    *(*p);   //表示  指针变量p  是  指向一个  指针变量,*p 是 p  所指向的 指针变量。

     

    1. 接上方代码
    2. char **pp; //定义一个指向指针的指针
    3. pp=&pName[0]; //*pp就是pp所指向的指针,也就是pName[0];
    4. printf("pp=%s\n",*pp);
    5. printf("----------------------------------\n");
    6. int abc=5;
    7. int *pabc=&abc; //指向 整型数据的指针 *pabc保存的是 abc的地址
    8. int **ppabc=&pabc; //指向 指针的指针 **ppabc保存的是 [*pabc保存的地址(就是abc的地址)]
    9. printf("abc=%d\n",abc);
    10. printf("abc=%d\n",*pabc);
    11. printf("abc=%d\n",**ppabc); //*ppabc 等价于 pabc,所以 **ppabc 等价于 abc
    12. return 0;
    13. }
    三、指针数组做main函数形参
    指针数组有个重要应用:
    第一种传递形参的方法:
    第一种方法:
    1. 第一种方法:
    2. int main(int arge,char *argv[]) //int arge:整型形参 应该是argv指针数组的元素个数
    3. //char *argv[]:指针数组做函数形参argv[0]保存的是 当前可执行文件的完整路径文件 名;可以接收不确定参数个数
    4. {
    5. int i;
    6. printf("argc=%d\n",arge); //我们输入的参数个数 +1
    7. for(i=0;i
    8. {
    9. printf("argv[%d]=%s\n",i,argv[i]);
    10. //等价于上面一条代码
    11. printf("argv[%d]=%s\n",i,*argv);
    12. argv++;
    13. }
    14. printf("-------\n");
    15. return 0;
    16. }

    第二种传递形参的方法(使用命令行):

    四、本章小结
    1、指针数据类型小结表
    2、指针运算小结
    ① 指针变量的 加减
    p++;p--
    int *p;  1000;1004
    ②指针变量的 赋值
    int *p =1000; //这样是 不可以的,不能直接赋予数字,不要认为可以将地址赋值给p,只能够将变量的已经分配的地址赋值给指针变量。
    int a;
    int *p=&a;  //只可以这样
    ③指针变量 可以为空值表示不指向任何变量
    int *p=NULL;  //NULL就是整数0,就是使p指向地址为0的单元;
                             //系统会保证地址为0这个单元不存放有效数据
    if(p==NULL)
    {
         //p=&a;
    }
    3、void  *型指针:万能型指针变量,也就是 能够指向任意数据类型
    int a=3;
    int *p=&a;
    float bf=56.f;
    float *pg=&bf;
    void *pwn=NULL;
    pwn=p;   //可以把整型变量的地址赋值给万能型指针变量
    pwn=pf;   //这个也可以把上面bf的地址赋值给他
    pf=(float *)pwn;  //这里把pwn的地址赋值回给pf必须强制类型转换
    4、总结
    指针的优点: 效率高
    指针的缺点: 太过灵活

     

     

  • 相关阅读:
    【随笔】无题
    程序员的健康生活
    【Java笔试强训】Day1(100449-组队竞赛 、OR63 删除公共字符)
    Python 深拷贝和浅拷贝的区别
    QT中sqlite的使用
    不要再白嫖Github了
    【光流法实现目标追踪:Python实战指南】
    算法升级之路(七)-盛最多水的容器
    单点登录SSO
    企业电子招标采购系统源码Spring Boot + Mybatis + Redis + Layui + 前后端分离 构建企业电子招采平台之立项流程图
  • 原文地址:https://blog.csdn.net/qq_48516121/article/details/126891326