zoukankan      html  css  js  c++  java
  • 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指针指向的是一个指针数组.

     

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

    你 。。还不明白吗

  • 相关阅读:
    服务部署 RPC vs RESTful
    模拟浏览器之从 Selenium 到splinter
    windows程序设计 vs2012 新建win32项目
    ubuntu python 安装numpy,scipy.pandas.....
    vmvare 将主机的文件复制到虚拟机系统中 安装WMware tools
    ubuntu 修改root密码
    python 定义类 简单使用
    python 定义函数 两个文件调用函数
    python 定义函数 调用函数
    python windows 安装gensim
  • 原文地址:https://www.cnblogs.com/silentjesse/p/2796313.html
Copyright © 2011-2022 走看看