• c语言的声明__它是指针?变量?还是函数呢?


    在c语言中,一个声明你是否都能很明确的知道他是什么类型?

    它肯定是两大类型:变量或者函数。但需要更具体点:

    1、变量分为:非指针类型的变量、指向变量的指针类型的变量(这个指针变量指向的可能是非指针变量,也可能是指针变量)、指向函数的指针类型的变量

    2、函数:返回非指针类型的函数、返回指针变量的函数

    所以在c语言里面,一个声明你需要清晰的知道该声明是上面综述的5种类型中的哪一种类型。要怎么进行分析、要根据什么来进行分析。

    下面有几个声明,请先自己分析一下。

    ---------------------------------------------------------------

    int p;

    int *p;

    int p[3];

    int *p[3];

    int (*p)[3];

    int **p;

    int p(int);

    int (*p)(int);

    int *(*p(int))[3];

    int*(*ptr)[4];

    ---------------------------------------------------------------

     要如何分析呢?

    编译器当然是要根据某种规范来解析这些声明:

    A  声明从它的名字开始读取,然后按照优先级顺序依次读取;

    B  优先级从高到低依次是:

            B.1  声明中被括号括起来的那部分

            B.2  后缀操作符;

                            括号()表示这是一个函数,而

                           方括号[] 表示这是一个数组。

             B.3   前缀操作符; 星号 * 表示“指向...的指针”。

    C  如果const 和 ( 或 ) volatile 关键字的后面紧跟类型说明符 (如 int, long等),那么它作用于类型说明符。在其他情况下,const 和 ( 或 ) volatile 关键字作用于它左边紧邻的指针星号。

         

    根据以上的红色字部门的规范我们来一一进行解析

    int p;

    //这里的p是最简单的非指针类型的变量

     

    int *p;

    //这里的p是最简单的指针类型的变量

     

    int p[3];

    //1、根据原则A先读取p

    //2、根据原则B.1,发现除后缀之外并无括号

    //3、根据原则B.2,发现p有后缀[3]所以这是一个数组类型的非指针类型的变量

    //4、最后再与类型int结合,所以p是一个int类型的数组变量

     

    int *p[3];

    //1、根据原则A先读取p

    //2、根据原则B.1,发现除后缀之外并无括号

    //3、根据原则B.2,发现有后缀[3],说明P不是一个指针类型的变量,而是一个非指针类型的变量(数组变量)

    //4、这时你会想这数组是什么类型的呢?

    //把p[3]用q代替则声明为:int * q,则说明q是一个int类型的指针,这里说明p[3]的这个数组的类型是int指针类型即数组的元素是int类型指针

    //这也就是指针数组

     

    int (*p)[3];

    //1、根据原则A读取p

    //2、根据原则B.1,说明p是一个指针,那么p所指向的类型是什么呢?把*p用q代替,则声明为int q[3]

    //3、根据原则B.2,发现q有后缀[3],则q与[3]结合,再与int 结合,说明q是一个数组。所以p指针所指向的类型为int类型的数组

    //这即是数组指针

     

    int **p;

    //1、根据原则A读取p

    //2、根据原则B.1,发现除后缀之外并无括号

    //3、根据原则B.2,p并无括号或者中括号.

    //4、p直接与其前面的第一个*结合,说明p是一个指针,该指针指向什么呢?同理代替 int * q; q为int类型的指针,所以p指针指向的是int 类型的指针

     

    int p(int);//这基础的简单的函数声明

     

    int (*p)(int);

    //这里就不具体再说明,编译器先读取到p,然后在由于小括号的优先级比较高,所以p与*结合,即p是一个指针那么p指向什么呢,同理代替,则声明为:int q(int)

    //所以p指向的是int q(int)类型的函数

     

    int *(*p(int))[3];

    //先读取p,p与(int)结合,说明p是一个参数是int类型的函数,那么该函数返回的类型是什么呢,同理代替,则声明为: int*(*q)[3];从这里可以看出q与*结合,则可以看出q是一       //个指针,那么q指针指向的是什么呢?同理代替,则声明为:int *r[3],从上面知道 int * r[3]是一个指针数组。由此可以看出这是一个返回类型为指针的函数的声明,返回的指针所指向的还是一个指针类型的变量,该类型的指针指向的是一个指针数组.

     

     

    int*(*ptr)[4];

    //ptr先与*结合,所以ptr是一个指针,该指针指向什么呢,同理代替,声明为:int *q[4], 所以ptr指针指向的是一个指针数组.

     

    直到这里,已把开头说的声明的五种类型都包括了。

    你 。。还不明白吗

  • 相关阅读:
    filter过滤组件Grok 正则捕获
    Logstash 最佳实践配置语法
    【小记】Ubuntu 工具链升级 gcc 流程
    图数据集cora详解
    HGNN超图神经网络代码
    modelnet40数据集
    GCN代码解读(版本1)
    GCN代码解读(版本2:github版本)
    企业微信代开发自建应用开发
    企业微信服务商工具实现
  • 原文地址:https://www.cnblogs.com/silentjesse/p/2796313.html
Copyright © 2020-2023  润新知