美文网首页
指针与数组

指针与数组

作者: mark_x | 来源:发表于2019-07-30 22:22 被阅读0次

    基础

    方法一:
    用字符数组定义字符串,用指针访问。

    #include <stdio.h>
    int main()
    {
        char a[] = "I love China!";
        char *p;
        int i;
        
        p = a;  // 数组名就是数组首元素的地址,可以直接赋给指针p
        
        // 通过指针读取并打印字符数组元素
        for (i = 0; *(p+i) != '\0'; i++)
        {
            printf("%c", *(p+i));
        }
        
        return 0;
    }
    

    方法二:
    用指针定义字符串,用数组下标访问。

    #include <stdio.h>
    int main()
    {
        char *p = "I love China!";
        int i;
        
        for (i = 0; p[i] != '\0'; i++)
        {
            printf("%c", p[i]);
        }
        
        return 0;
    }
    

    C语言没有定义字符串变量,字符串的存储是通过字符数组实现的。
    从方法一来看,定义数组的操作实际上是把数组首元素的地址赋给数组名a,因此后面通过p = a,直接把首元素地址赋给指针p;
    从方法二来看,定义数组的操作是把数组首元素的地址赋给指针p,p也就成了数组名,因此后面也可以通过数组的方式访问数组元素。

    指针数组

    首先再说明一个问题,上面指针指向字符串,实际上是指针指向第一个字符元素的地址,指针指向一个元素

    既然一个指针可以指向一个字符串,那么多个指针就可以指向多个字符串,那么多个指针构成的一个指针数组就可以指向多个字符串。

    // 代码1-1
    #include <stdio.h>
    
    int main()
    {
            char *p1[5] = {
                    "让编程改变世界 -- 鱼C工作室",
                    "Just do it -- NIKE",
                    "一切皆有可能 -- 李宁",
                    "永不止步 -- 安踏",
                    "One more thing... -- 苹果"
            };
            int i;
    
            for (i = 0; i < 5; i++)
            {
                    printf("%s\n", p1[i]);
            }
    
            return 0;
    }
    

    p1是一个指针数组,其中的每一个元素都是指针,每个指针指向一个字符数组的首元素。
    每个指针元素又可以看成是一个数组名,因此在打印的时候,有p1[i],相当于:

    // 代码1-2
    #include <stdio.h>
    int main()
    {
        char a[] = "ABCDE";
        printf("%s", a);
    }
    

    指向指针的指针

    再看代码1-1片段,进行一下修改:

    // 代码2-1
    #include <stdio.h>
    
    int main()
    {
            char *p1[5] = {
                    "让编程改变世界 -- 鱼C工作室",
                    "Just do it -- NIKE",
                    "一切皆有可能 -- 李宁",
                    "永不止步 -- 安踏",
                    "One more thing... -- 苹果"
            };
           
           char **p;
           p = &p1[1]; //p1[1]是指针数组的一个元素,是一个指针,对指针取地址
    
           printf("%s", *p);  //前面多了个取值,这里就多一个解引用,看代码2-2
    
            return 0;
    }
    

    与下面这段一个道理

    // 代码2-2
    #include <stdio.h>
    int main()
    {
        char *p= "ABCDE";
            char **pp;
    
            pp = &p;
        printf("%s", *pp);
            printf("%s", p);
    
    }
    

    这种有点类似于多此一举的骚操作有什么好处呢?以上例子是看不出来的,看下面的例子,用于指针数组元素的分类,可以避免创建多个指针数组,而且也便于修改。其实很好理解,把实体存一份,用指针来分类,用的时候用指针查找。

    #include <stdio.h>
    
    int main()
    {
        char *books[6] = {
            "《C程序设计语言》",
            "《C专家编程》",
            "《C和指针》",
            "《C陷阱与缺陷》",
            "《C prime Plus》",
            "《带你学C带你飞》"
        };
        
        char **other[5];//指针数组  
        char **fishC;  //一个指针
        int i;
        
        // 利用指针指向进行分类   
        other[0] = &books[0];
        other[1] = &books[1];
        other[2] = &books[2];
        other[3] = &books[3];
        other[4] = &books[4];
    
        fishC = &books[5];
        
        
        printf("小甲鱼出版的书籍:\n");
        printf("%s\n\n", *fishC);
        
        printf("其他经典书籍:\n");
        for (i = 0; i < 5; i++)
        {
            printf("%s\n", *other[i]);  // 这里采用访问数组名的方式打印字符串
        }
        
        
        return 0;
    }
    

    相关文章

      网友评论

          本文标题:指针与数组

          本文链接:https://www.haomeiwen.com/subject/nlvorctx.html