zoukankan      html  css  js  c++  java
  • C语言---变量与函数

    一个C程序是由一个或多个程序模块组成的,每一个程序模块作为一个源程序文件,一个源程序文件是一个编译单元。

    源程序文件分为库函数和用户自己定义的函数,以及有参函数、无参函数。

    函数调用的过程:

    1) 定义函数时指定的形参,未出现函数调用时,并不占存储单元,发生函数调用时,形参被分配临时空间。

    2) 将实参对应的值传递给形参。

    3) 执行子函数时,形参已经有值,可以直接调用,

    4) 通过return将函数值返回给主函数。

    5) 调用结束,形参单元被释放。

    函数一般由两部分组成,声明部分和定义部分。声明放在主调函数的声明部分,定义部分是一个单独的模块。

    对函数做声明的写法:

    1) 函数类型  函数名(参数类型1 参数名1, 参数类型2 参数名2,...);

    2) 函数类型  函数名(参数类型1, 参数类型2,...)

    函数也可以调用本身,称为递归调用。

    变量由局部变量和全局变量之分,函数也有内部函数和外部函数之分,默认的函数都是外部函数,因为定义

    函数的目的就是被其他函数调用。

    内部函数,通过static声明一个内部函数,只能被本文件中的其他函数所调用。内部函数又被称为静态函数。

    通常把只需要被本文件使用的函数和变量,放在文件开头,外加static声明,来提高程序的可靠性。

    外部函数,在定义时,加extern声明,C中也可以忽略,默认为外部函数

    关于函数的作用域,通过函数原型的声明,可以扩展函数的作用域,通过编译系统,该函数在本文件或其他文件中有定义。

    扩展函数作用域的另一个主要的方式,#include<>

    变量的定义分为两种,一种是需要建立储存空间的(int a)的定义性声明;

                                一种是不需要建立存储空间的(extern )的引用性声明;

    从变量的作用域来看,变量分为全局变量和局部变量::

    变量的定义,可能会有三种情况:

    1) 在函数的开头定义;

    2) 在某个复合语句中定义;

    这两种定义方式定义的变量,称为局部变量。

    在main中定义的变量,也只在main的函数中有效,其他的子函数中并看不到。

    不同函数中可以使用相同的变量名,它们在内存中占用不同的单元。

    形式参数也是一种局部变量,

    3) 函数之外定义的变量,全局变量

    为了便于区分全局变量和局部变量,C语言中全局变量的首字母通常用大写来表示。

    #include <stdio.h>

    float Max=0, Min=0;   //全局变量

    int main{

    }

    从变量的生命周期来看,变量的存储方式也是不同,分为静态存储方式和动态存储方式。

    一段程序分为程序区和数据区,数据区又分为静态存储区和动态存储区。

    全局变量全部存放在静态存放区,非static的变量,函数形参都是动态存储方式。

    每一个函数或者变量都有两个特性: 类型和存储方式

    存储方式包括四大类:自动的auto,静态的static,寄存器的register,外部的extern

    1)程序中的局部变量,不声明为static类型的,都是auto类型的,程序中多数变量属于此类。

      auto int b,c;    //显示声明变量的存储类型为auto类型,也可以忽略

                           //函数调用时,使用,函数执行结束后,释放空间

    2)静态变量,在函数执行结束后,不会释放该空间,变量的值仍然存在。

      static int c;  //变量地址在静态存储区

      如果定义的局部静态变量,没有赋值,编译时,自动赋值为0,或空字符"",只赋初值一次。

      静态局部变量在函数调用结束后,还存在,但是并不能被其他函数引用。

      static + 局部变量,变量分配到静态分配区,在整个程序执行过程中不释放,作用域只局限于当前函数

      static + 全局变量,变量的作用域只限于本文件模块中

    3)寄存器变量,不存储在内存中,而直接存放在CPU的寄存器中,不常用。

      register int d;

    4)extern主要用在将变量的作用域做扩展。本身全局变量的有效作用域,从定义处开始到文件结束,

      在定义点之前的函数是不能使用该全局变量,使用extern关键字,可以扩展全局变量的作用域到该声明处。

      1)从一个文件内扩展外部变量的作用域

         int main() {

            extern int A,B,C;  //类型名int可以写,也可以不写

         }

         int A,B,C;  //全局变量

      2)将外部变量的作用域扩展到其他文件

          file1.c 

          file A;   //全局变量

         int main() {

         }

          file2.c

          extern A;   //将file1中的变量扩展到本文件中。

          int power() {

         }

      extern变量的声明和定义通常是分开的。

      声明放在头文件.h中,extern int a;

      定义放在c文件中, int a = 0;

      3)将外部变量的作用域限制在本文件中。在全局变量前加static。声明只能用于本文件中的外部变量,静态外部变量

         file1.c                                     file2.c

         static int A;                             extern A;   //出错

         int main() {                             void fun() {}

         }

    按变量的存放位置,可以分为:

    1) 静态存储区,   静态局部变量(函数内部定义 static,变量一直存在,但是不能被其他函数访问)

                            静态外部变量(函数外定义 static,不能被其他的文件extern声明)

                            外部变量(函数外的全局变量,可以被其他函数extern声明)

    全局变量,分为静态外部变量和非静态的外部变量。

    2) 动态存储区,auto变量和形式参数

    符号变量与const常量:

    1)符号常量,通过编译预处理命令define定义,  #define  PI  3.1415

    2)const变量,程序运行过程中不能被改变,在定义的时候,必须被初始化。  const int Max=1000;

      符号变量在编译的时候,已经不存在,而const类型的变量是一直存在的,

      符号变量的作用域从定义的位置开始,到源文件结束为止,而const变量的生命周期是与变量一样的,auto或static类型。

    const类型的指针,

    指向变量的指针,const <数据类型> *<指针变量名>    保证变量的值不变,但是变量的地址可变;

      const  int  *p;   const  int  a=15;

      p = &a;   //可以修改p中的值(指向变量的地址)

      *p = 14;  //非法不可以修改p中的值(地址)中的数据

    指针常量,<数据类型> const *<指针变量名>   保证变量的地址不变,

      int *const p = &a;   

      *p = 15;    //合法。修改p所指向的变量的值

      p = &b;    //非法,不可以修改p中的值,即变量的地址不能变

    在C的调试中,有一些内部定义的宏变量,__FILE__,__FUNCTION__,__LINE__来方便print的打印,调试。

  • 相关阅读:
    (05)ElasticSearch 倒排索引
    (04)ElasticSearch 安装Kibana
    (03)ElasticSearch 安装ElasticSearch-Head插件
    (02)ElasticSearch 安装
    (004)Linux http命令curl访问url
    (01)ElasticSearch概述
    (16)mongodb mapReduce分布式统计示例遇到的一个未解问题,求平均值不对,希望哪位大神给指点一下
    (15)mongodb mapReduce的概念及用法
    (14)mongodb aggregate聚集框架
    CodeForces
  • 原文地址:https://www.cnblogs.com/-9-8/p/6665175.html
Copyright © 2011-2022 走看看