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的打印,调试。

  • 相关阅读:
    Scrapy 概览笔记
    Python 依赖版本控制 (requirements.txt 文件生成和使用)
    Python 虚拟空间的使用
    macOS 所有版本 JDK 安装指南 (with Homebrew)
    鉴权那些事
    Java 位运算符和 int 类型的实现
    ASP.NET Core 入门教程 5、ASP.NET Core MVC 视图传值入门
    如何做好一次知识或技术分享
    ASP.NET Core 入门教程 4、ASP.NET Core MVC控制器入门
    ASP.NET Core 入门教程 3、ASP.NET Core MVC路由入门
  • 原文地址:https://www.cnblogs.com/-9-8/p/6665175.html
Copyright © 2011-2022 走看看