zoukankan      html  css  js  c++  java
  • 数组指针和指针数组和二重指针

    数组指针和指针数组分析

    1.概念区别
    1.1.数组指针: 也就是数组的指针。一个指针,它指向一个数组。
    1.2.指针数组: 也就是指针 的数组。一个数组,里面的元素都是指针。

    2.指针和数组分别定义的符号
    2.1 int * p;
    分析:
    第一步:找核心,核心是p。
    第二步:逐层剥离,p和*结合是指针。所以int*p;是定义了一个指针

    2.2. int p[5];
    分析:
    第一步:找核心,核心是p。
    第二步:逐层剥离,p和[]结合是数组。所以int p[5];是定义了一个数组。

    3.指针数组和数组指针分别定义的符号
    3.1 int * p[5]
    分析:
    第一步:找核心,核心是p。
    第二步:逐层剥离,这时候p先和[]结合还是先和*结合,查优先级表得到[]优先级更高。所以p先和[]结合成为数组。
    第三步:继续逐层剥离,p[5]这个数组再和*结合
    第四步:得到结果,有一个数组有5个元素,其元素都是指针,即指针数组。

    3.2. int (* p)[5];
    分析:
    第一步:找核心,核心是p。
    第二步:逐层剥离,p和谁结合?小括号优先级更高,所以p先和*结合成为指针,
    第三步:继续逐层剥离,*p这个指针再和数组结合,
    第四步:得到结果,有一个指针,该指针指向一个数组,即数组指针。

    4.一维指针int * 和数组指针int (*)[]的类型匹配问题
    4.1.
    int * p;
    int a[5];
    p = a; //类型匹配吗?

    别怕,我们来分析
    (1)p和结合是指针,再和int结合,说明,p是一个指向int类型变量的指针,类型为int
    (2)a是数组名,a做右值表示数组首元素的首地址,首元素是int类型,首元素的地址是int*类型。
    (3)得出结论,p和a类型一致。都是int*类型的。

    4.2.
    int * p;
    int a[5];
    p = & a; //类型匹配吗?

    我们再来分析
    (1)p和结合是指针,再和int结合,说明,p是一个指向int类型变量的指针,类型为int
    (2)a是数组名,&a做右值表示整个数组的首地址,也就是一个指向数组的指针,即数组指针,其类型为 int(*)[]
    (3)第三步:得出结论,p和&a类型不匹配,p的类型是int*,&a的类型是int(*)[]

    5.二维指针int * * p1;和指针数组 int*p2[5];(实际中用的比较少,如果用到二维指针肯定是和指针数组连用)
    5.1.指针数组
    int *p[5];

    分析:
    第一步:p先和[]结合是数组,再和*结合,也就是数组里面的元素都是指针,也就是说,数组中的元素,p0,p1,p2,p3,p4,都是指针,那数组名p是什么类型?
    第二步:数组名p做右值时表示整个数组的首地址,整个数组都是指针,那p就是指针的指针了,即p的类型是指向指针的指针,二重指针。
    重要:二重指针就是指针数组指针

  • 相关阅读:
    SpringBoot之采用AOP统一打印日志信息
    SpringBoot之SpringBoot整合log4j
    SpringBoot之SpringBoot整合logback
    SpringBoot之SpringBoot整合多环境不同配置文件
    SpringBoot之SpringBoot整合devtools热部署
    [bug] Flask:jinja2.exceptions.UndefinedError: 'None' has no attribute 'id'
    [bug] Python:“TabError: inconsistent use of tabs and spaces in indentation”
    [bug] MySQL 无法删除表
    [bug] Flask css 不更新
    [bug] flink on yarn 启动失败
  • 原文地址:https://www.cnblogs.com/1024E/p/13209622.html
Copyright © 2011-2022 走看看