美文网首页
c语言初探

c语言初探

作者: curry_li | 来源:发表于2019-11-13 12:24 被阅读0次

        这几周很高兴跟小组的成员过了一遍c语言,一是为了学习数据结构打基础,再者也是因为c语言很重要,闲话不说,直接上成果。

     8 预处理指令:

         预处理是C语言的一个重要功能,由预处理程序完成。当对一个源文件进行编译时,系统将自动调用预处理程序对源程序中的预处理部分作处理,处理完毕自动进入对源程序的编译。预处理指令以#号开头,并且一般放在程序的开头。整行语句构成了一条预处理指令,该指令将在编译器进行编译之前对源代码做某些转换。

        预处理指令作用包括:宏定义,文件包含,条件编译三部分。分别对应宏定义命令,文件包含命令,条件编译命令 三部分实现。预处理过程读入源代码,检查包含预处理指令的语句和宏定义,并对源代码进行响应的转换。预处理过程还会删除程序中的注释和多余的空白字符。下面是几个常用的c语言预处理指令:

        #   空指令,无任何效果

        #include     包含一个源代码文件    http://c.biancheng.net/view/1975.html

        #undef    取消已定义的    

        #if    如果给定条件为真,则编译下面代码    http://c.biancheng.net/view/1986.html

        #ifdef    如果宏已经定义,则编译下面代码

        #ifndef    如果宏没有定义,则编译下面代码

        #elif    如果前面的#if给定条件不为真,当前条件为真,则编译下面代码

        #endif    结束一个#if……#else条件编译块

    9指针:

        通俗的来说,指针就是数据住的房间的门牌号,计算机的内存就像是分好门牌号的一个个小房间,而门牌号就是内存地址,也就是指针。数据存储时,就是分配给他们房间,指针可以帮我们很快的找到他们。

        数据在内存中的地址也称为指针(Pointer,也就是内存地址),如果一个变量存储了一份数据的指针,我们就称它为指针变量。定义一个指针变量时必须加上*号,为指针变量赋值时必须给他一个地址(&取地址符号)。使用指针变量前一定要初始化,对于暂时没有指向的指针,应该赋值null。这里&是取地址运算符,*是...书上叫做“间接运算符”。&a的运算结果是一个指针,指针的类型是a的类型加个*,指针所指向的类型是a的类型,指针所指向的地址嘛,那就是a的地址。*p的运算结果就五花八门了。总之*p的结果是p所指向的东西,这个东西有这些特点:它的类型是p指向的类型,它所占用的地址是p所指向的地址。

            指针是一个特殊的变量,它里面存储的数值被解释成为内存里的一个地址。要搞清一个指针需要搞清指针的四方面的内容:指针的类型,指针所指向的类型,指针的值或者叫指针所指向的内存区,还有指针本身所占据的内存区。让我们分别说明。

                1指针的类型

                从语法的角度看,你只要把指针声明语句里的指针名字去掉,剩下的部分就是这个指针的类型。                这是指针本身所具有的类型        

        int *ptr; //指针的类型是int *

        char *ptr; //指针的类型是char *

        int **ptr; //指针的类型是 int **

        int (*ptr)[3]; //指针的类型是 int(*)[3]

        int *(*ptr)[4]; //指针的类型是 int *(*)[4]

                2指针所指向的类型

                当你通过指针来访问指针所指向的内存区时,指针所指向的类型决定了编译器将把那片内存区里的内        容当做什么来看待。从语法上看,你只须把指针声明语句中的指针名字和名字左边的指针声明符*去掉,剩下的就是指针所指向的类型。

               int *ptr; //指针所指向的类型是int

               char *ptr; //指针所指向的的类型是char

            int **ptr; //指针所指向的的类型是 int *

            int (*ptr)[3]; //指针所指向的的类型是 int()[3]

            int *(*ptr)[4]; //指针所指向的的类型是 int *()[4]

                3指针的指(指针所指向的内存区)

                指针的值是指针本身存储的数值,这个值将被编译器当作一个地址,而不是一个一般的数值。在32位程序里,所有类型的指针的值都是一个32位整数,因为32位程序里内存地址全都是32位长。指针所指向的内存区就是从指针的值所代表的那个内存地址开始,长度为sizeof(指针所指向的类型)的一片内存区。以后,我们说一个指针的值是XX,就相当于说该指针指向了以XX为首地址的一片内存区域;我们说一个指针指向了某块内存区域,就相当于说该指针的值是这块内存区域的首地址。

                4指针本身占据的内存区

                指针本身占了多大的内存?你只要用函数sizeof(指针的类型)测一下就知道了。在32位平台里,指            针本身占据了4个字节的长度。

              ( ps:*号在不同场景下有不同的作用,一种是在定义一个指针变量时区别普通变量;另一个是使用指针变量时在前面加*表示获取指针指向的数据,或者说表示的是指针指向的数据本身。)

        常见指针的定义:

        int *p;    p 可以指向 int 类型的数据,也可以指向类似 int arr[n] 的数组。

        int **p;    p 为二级指针,指向 int * 类型的数据。

        int *p[n];    p 为指针数组。[ ] 的优先级高于 *,所以应该理解为 int *(p[n]);        

        int (*p)[n];    p 为二维数组指针。

        int *p();    p 是一个函数,它的返回值类型为 int *。

        int (*p)();    p 是一个函数指针,指向原型为 int func() 的函数。

        int p; //这是一个普通的整型变量 

    常见指针类型的详解:

         int *p; //首先从P 处开始,先与*结合,所以说明P 是一个指针,然后再与int 结合,说明指针所指向的内容的                                                         类型为int 型.所以P是一个返回整型数据的指针     

     int p[3]; //首先从P 处开始,先与[]结合,说明P 是一个数组,然后与int 结合,说明数组里的元素是整型的,                所以P 是一个由整型数据组成的数组 

    int *p[3]; //首先从P 处开始,先与[]结合,因为其优先级比*高,所以P 是一个数组,然后再与*结合,说明数组里的元素是指针类型,然后再与int 结合,说明指针所指向的内容的类型是整型的,所以P 是一个由返回整型数据的指针所组成的数组 

    int (*p)[3]; //首先从P 处开始,先与*结合,说明P 是一个指针然后再与[]结合(与"()"这步可以忽略,只是为了改变优先级),说明指针所指向的内容是一个数组,然后再与int 结合,说明数组里的元素是整型的.所以P 是一个指向由整型数据组成的数组的指针 

    int **p; //首先从P 开始,先与*结合,说是P 是一个指针,然后再与*结合,说明指针所指向的元素是指针,然后再与int 结合,说明该指针所指向的元素是整型数据.由于二级指针以及更高级的指针极少用在复杂的类型中,所以后面更复杂的类型我们就不考虑多级指针了,最多只考虑一级指针. 

    int p(int); //从P 处起,先与()结合,说明P 是一个函数,然后进入()里分析,说明该函数有一个整型变量的参数,然后再与外面的int 结合,说明函数的返回值是一个整型数据 

    Int (*p)(int); //从P 处开始,先与指针结合,说明P 是一个指针,然后与()结合,说明指针指向的是一个函数,然后再与()里的int 结合,说明函数有一个int 型的参数,再与最外层的int 结合,说明函数的返回类型是整型,所以P 是一个指向有一个整型参数且返回类型为整型的函数的指针 

    int *(*p(int))[3]; //可以先跳过,不看这个类型,过于复杂从P 开始,先与()结合,说明P 是一个函数,然后进入()里面,与int 结合,说明函数有一个整型变量参数,然后再与外面的*结合,说明函数返回的是一个指针,,然后到最外面一层,先与[]结合,说明返回的指针指向的是一个数组,然后再与*结合,说明数组里的元素是指针,然后再与int 结合,说明指针指向的内容是整型数据.所以P 是一个参数为一个整数据且返回一个指向由整型指针变量组成的数组的指针变量的函数.

    相关文章

      网友评论

          本文标题:c语言初探

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