美文网首页
指针与数组

指针与数组

作者: 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;
}

相关文章

  • C语言的数组指针与指针数组(One)

    一、数组指针与指针数组: 数组指针<——>本质是指针 指针数组<——>本质是数组上图: 二、数组指针: int ...

  • C语言21 指针数组与数组指针

    C语言21 指针数组与数组指针 指针数组的定义 指针数组的赋值 结构体指针数组 分析下面的代码 数组指针的定义 数...

  • 指针数组 & 数组指针 & 函数指针

    一、指针数组 & 数组指针 普通数组: 即数组名a与(*p)等价,都代表数组的首地址,此为数组指针 指针数组: ...

  • 指针笔记

    指针数组和数组指针 数组指针是指向数组的指针,指针的值与数组首元素地址相同,但范围是整个数组,所以数组指针和数组名...

  • C语言特性(指针数组和指向指针变量的指针)

    指针数组和指向指针变量的指针 指针数组与main()函数形参 声明指针数组与声明普通数组的语法类似,其语法格式如下...

  • 指针

    指针数组与数组指针 在这里数组指针是指向数组的指针,其本质为指针,指向的对象是数组。由于数组的形式多样所以数组指针...

  • iOS 指针详解

    指针数组与数组指针在这里数组指针是指向数组的指针,其本质为指针,指向的对象是数组。由于数组的形式多样所以数组指针的...

  • 2019-09-18C语言复杂表达式与指针高级应用

    1.指针数组与数组指针 1.1、字面意思来理解指针数组和数组指针 (1)指针数组的实质是一个数组,这个数组中存储的...

  • 数组知识点

    数组指针与指针数组: int(*p)[4]; --定义数组指针p,指向含4个元素的一维整型数组的指针变量(是指针)...

  • c基础—指针运算和函数指针

    二级指针 数组和数组指针 采用指针遍历数组循环赋值 遍历 赋值 指针与数组的几种写法 函数指针(回调) 题目:监听...

网友评论

      本文标题:指针与数组

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