C语言程序设计

李永宁 李志慧 王荣福 郭艳宏 蔡荣贵 王露 康高厉 夏雨 赵东琛

目录

  • 1 第一章 C语言概述
    • 1.1 教学材料
      • 1.1.1 课程纲要
      • 1.1.2 授课计划
      • 1.1.3 课内实训指导书
      • 1.1.4 教案
    • 1.2 C语言概述
      • 1.2.1 学习目标
      • 1.2.2 学习视频
      • 1.2.3 学习效果检测
      • 1.2.4 练习及作业
    • 1.3 C语言基本程序结构
    • 1.4 C程序的编辑、编译、连接和运行
    • 1.5 PPT
  • 2 第二章 C程序设计基础
    • 2.1 C语言数据类型
      • 2.1.1 数据类型
      • 2.1.2 学习视频
    • 2.2 运算符和表达式
      • 2.2.1 学习视频
    • 2.3 顺序结构程序设计
    • 2.4 数据的输入与输出
    • 2.5 上机实践
    • 2.6 章节测试
  • 3 第三章  选择结构程序设计
    • 3.1 关系运算符和关系表达式
    • 3.2 逻辑运算符和逻辑表达式
    • 3.3 if语句
      • 3.3.1 学习视频
    • 3.4 Switch语句
    • 3.5 上机实践
    • 3.6 PPT
  • 4 第四章   循环结构程序设计
    • 4.1 whiile语句和do while语句
      • 4.1.1 学习视频
    • 4.2 for语句循环结构
    • 4.3 break 、continue语句
    • 4.4 goto语句
    • 4.5 嵌套循环结构
    • 4.6 循环小结
    • 4.7 实训3-循环结构程序设计
    • 4.8 PPT
  • 5 第五章   数组
    • 5.1 一维数组
      • 5.1.1 微课视频-冒泡排序法
    • 5.2 二维数组与字符数组
      • 5.2.1 预习任务
    • 5.3 字符数组与字符串
    • 5.4 项目实训4-数组的应用
    • 5.5 PPT
    • 5.6 数组学习效果检测
  • 6 第六章  函数
    • 6.1 函数概述
      • 6.1.1 预习任务
      • 6.1.2 微课视频
      • 6.1.3 知识点思维导图
      • 6.1.4 课后作业
    • 6.2 函数的参数和返回值
      • 6.2.1 预习效果检测
      • 6.2.2 微课视频
      • 6.2.3 学习效果检测
    • 6.3 函数的调用
    • 6.4 函数的嵌套和递归调用
    • 6.5 数组作为函数的参数
    • 6.6 局部变量和全局变量
    • 6.7 内部函数和外部函数
    • 6.8 项目实训5
    • 6.9 PPT
  • 7 第7章 编译预处理
    • 7.1 宏定义
      • 7.1.1 不带参数的宏定义
      • 7.1.2 带参数的宏定义
    • 7.2 “文件包含”处理
    • 7.3 条 件 编 译
    • 7.4 电子课件
  • 8 第8章 指针
    • 8.1 指针的基本概念
      • 8.1.1 变量的地址
      • 8.1.2 指针变量的定义
      • 8.1.3 指针变量的引用
    • 8.2 指针与一维数组
      • 8.2.1 指向一维数组的指针变量
      • 8.2.2 通过指针引用一维数组元素
      • 8.2.3 指针使用的几个细节
    • 8.3 指针与字符串
      • 8.3.1 使用指针处理字符串
      • 8.3.2 字符型指针变量作函数参数
      • 8.3.3 字符指针变量与字符数组的区别
    • 8.4 指针与二维数组
      • 8.4.1 二维数组的指针
      • 8.4.2 行指针变量
      • 8.4.3 二维数组的指针作函数参数
    • 8.5 指针数组与多级指针
      • 8.5.1 指针数组
      • 8.5.2 多级指针的概念
    • 8.6 指针与函数
      • 8.6.1 指针变量作为函数的参数
      • 8.6.2 函数的指针
      • 8.6.3 返回指针值的函数
    • 8.7 main函数的参数
      • 8.7.1 main函数参数的概念
      • 8.7.2 main函数参数的处理
    • 8.8 程序设计举例
    • 8.9 课内实训
    • 8.10 PPT
    • 8.11 学习效果检测
  • 9 第9章 结构体与其他数据类型
  • 10 文件
  • 11 24级软件工程、网络工程、物联网工程等专业C语言课程设计
    • 11.1 实训指导书
    • 11.2 项目一 学生信息管理系统.PPT
    • 11.3 项目二 图书管理系统PPT
    • 11.4 实训报告电子版下载
  • 12 21级软件工程-C语言程序设计
    • 12.1 21级软件工程-C语言程序设计-实训预备项目指导书下载
    • 12.2 新建目录
    • 12.3 21级软件工程-C语言程序设计-实训指导书下载
    • 12.4 ​视频:C语言打造学生信息管理系统
    • 12.5 视频:学生成绩管理系统的设计
    • 12.6 视频:指针
    • 12.7 实训报告电子版
局部变量和全局变量

一、变量的作用域

变量能够被访问的位置称为变量的作用域。

分为:

1.局部变量

2.全局变量

(一)局部变量

在一个函数内部定义的变量称为内部变量,它只能在本函数内部使用,而不能在函数以外的地方使用。

即它的作用范围只在函数内部。

局部变量主要包括:

  1. 自定义的局部变量

  2. 形参

  3. 复合语句中定义的变量


#include <stdio.h> 

void f1(int a) 

{    int b=3,c=4;   //a,b,c为局部变量,只能在f1()中引用 

     printf("a=%d,b=%d,c=%d\n",a,b,c); 

void f2(int x) 

{    int y=3,z=4; //x,y,z为局部变量,只能在f2()中引用 

     printf("x=%d,y=%d,z=%d\n",x,y,z); 

void f3(int a) //函数的形参int a可以与f1()的形参相同 

{    int b=8,c=9; //b,c与f1()中的变量名相同,但并不相互干扰 

     printf("a=%d,b=%d,c=%d\n",a,b,c); 

void main() 

{    int m=2,n=3; //m,n为局部变量,只在main()内部有效 

     f1(3);  f2(4);  f3(5); 

     printf("m=%d,n=%d\n",m,n);  

     {    int a=4,b=5; //a,b为局部变量,仅能用于本复合语句 

        printf("a=%d,b=%d\n",a,b);

   } 

     //printf("a=%d,b=%d\n",a,b);

   //报错,不能引用a,b 


(二)全局变量

在一个源程序文件中,在函数外部定义的变量为外部变量,也称为全局变量

全局变量可以被本文件中的函数使用,它的作用范围是从定义的位置开始直到本源文件结束。

可以使用全局变量作为函数之间传递数据的桥梁,在全局变量作用域内,任何函数都能引用该全局变量,所以可以让全局变量在函数之间传递数据。

#include <stdio.h> 

int m=1,n=2;   //m、n为全局变量,作用域直到最后 

void f1() 

{    printf("m=%d,n=%d\n",m,n); //全局变量m=1,n=2 

     printf("p=%d,q=%d\n",p,q); 

//出错,不能引用后边定义的p,q 

int p=9,q=10;    //p、q为全局变量,作用域直到最后 

void f2() 

{    int m=3,n=4; 

     printf("m=%d,n=%d\n",m,n);

//引用局部变量m=3,n=4 

     printf("p=%d,q=%d\n",p,q);//全局变量p=9,q=10

void main() 

{    int m=5,n=6; 

     printf("m=%d,n=%d\n",m,n);//引用局部变量m=5,n=6 

     {    int m=7,n=8; 

          printf("m=%d,n=%d\n",m,n);

//引用局部变量m=7,n=8 

     } 

     printf("m=%d,n=%d\n",m,n); //引用局部变量m=5,n=6 

     printf("p=%d,q=%d\n",p,q); //全局变量p=9,q=10

说明:

(1)全局变量在程序执行的整个过程中都占用内存,而不是仅在需要时才开辟内存单元。

(2)在编写程序时,应该尽量避免使用全局变量。

       因为如果函数过于依赖全局变量,函数的通用性就会降低。

所有函数都可以改变全局变量的值,因此难以判断每个瞬间变量的值。

       另外,全局变量过多,也会降低程序的可读性。


三、变量的存储类别和生存期

变量在程序执行过程中占用存储单元的时间称为变量的生存期。分为:

动态变量

静态变量

内存中可供用户使用的存储空间分为三部分

动态存储区

动态变量存储在动态存储区。

当函数被调用时,系统会为函数中定义的变量分配一个动态存储单元,函数调用结束,这些存储单元就会被释放。

动态变量包括函数形参和函数内部定义的变量。

静态存储区

静态变量存储在静态存储区。

其在程序运行之初就被分配了存储空间,程序执行完毕才会释放存储空间。

静态变量包括:全局变量和使用关键字static定义的局部变量。

静态存储变量默认的初值为0。

定义变量关键字

在定义变量时,可以使用以下关键字定义其存储方式:

auto

static

register

extern

局部变量的存储

1. 自动存储类型变量

自动存储类型变量的存储单元被分配在内存的动态存储区中。自动存储类型变量的声明形式如下:

                  auto 类型 变量名;

自动存储类型是系统默认的类型,因此,在函数内部,下面两种定义方式等效:

     int a ;            float b;                char c;

     auto int a;       auto float b;      auto char c;

函数或复合语句内不作特别声明的变量、以及函数的形参,都是自动存储类型,它们在系统执行函数或复合语句时才被分配内存单元,在该函数或复合语句运行期间一直存在,在函数或复合语句运行结束时自动释放这些内存单元。

自动存储类型变量的作用域和生存期是一致的,在其生存期内都是有效的、可见的。

函数内部的自动存储类型变量在每次调用函数时,系统都会在内存的动态存储区为它们重新分配内存单元,在该函数被多次调用过程中,函数内的某个自动存储类型变量的存储位置不是固定的。

auto类型变量

关键字auto指定局部变量为动态存储方式

当省略关键字auto时,局部变量默认是动态存储方式。


2. 寄存器存储类型变量

寄存器存储类型变量的存储单元被分配在寄存器中,这种变量的声明形式如下:

register 类型 变量名;

例如下面定义的变量n:

register int n;

寄存器存储类型变量的作用域、生存期与自动存储类型变量相同。由于寄存器的存取速度比内存的存取速度快,因此通常将频繁使用的变量放在寄存器中(如循环体中涉及到的内部变量),以提高程序的执行速度。

由于计算机中寄存器的个数有限,寄存器的数据位数也是有限的,所以,定义寄存器存储类型变量的个数不能太多,并且只有整型变量和字符型变量可以定义为寄存器存储类型变量。

通常,寄存器存储类型变量的定义是不必要的,如今优化的编译系统能够识别频繁使用的变量,并能够在不需要编程声明的情况下,就把这些变量存放在寄存器中。

register变量

将频繁使用的变量定义为register变量,该变量存放在CPU的寄存器中,因为寄存器的存取速度远高于内存,从而可以显著提高程序的运行效率。

3.静态存储类型变量

静态存储类型变量所需的存储单元被分配在内存空间的静态存储区中。

静态存储类型变量的声明形式如下:

         static  类型 变量名;  

静态存储类型变量在编译时被分配内存、赋初值,并且只被赋初值一次。对未赋值的静态存储类型变量,系统自动给其赋值为0(字符型为'\0')。   

在整个程序运行期间,静态存储类型变量占用静态存储区的固定的内存单元,即使它所在的函数调用结束,也不释放该存储单元,其值会继续保留。因此,下次再调用该函数时,静态存储类型变量仍然使用原来的存储单元,仍使用原来存储单元中的值。可以利用静态存储类型变量的这个特点,编写需要在被调用结束后仍保存局部变量值的函数。

静态存储类型的局部变量的作用域仍然是定义该变量的函数或复合语句内部。

虽然静态存储类型变量在整个程序运行期间都是存在的,但是在它的作用域外,它是不可见的,即不能被其它函数引用。

static声明静态局部变量

如果在定义局部变量时使用关键字static,则该变量为静态变量。

静态变量在程序执行期间会一直占用存储单元,它只能被初始化一次。

在每次调用其所在函数时,变量并不重新初始化,而是继续使用上次调用结束时保存的值。


全局变量的存储


1.全局变量的定义

全局变量存放在内存的静态存储区中。全局变量的生存期是整个程序的运行期。

全局变量分为程序级全局变量和文件级全局变量。程序级全局变量又称为全局存储类型的全局变量,文件级全局变量又称为静态存储类型的全局变量。

(1) 程序级全局变量

程序级全局变量在定义时不加任何存储类型的声明。程序级全局变量的作用域是整个程序。

一个C程序可以由多个文件组成,程序级全局变量是在程序的某个文件中定义的。

当程序级全局变量在程序的某个文件中定义后,程序的其它文件中若要使用它,只须用说明符extern声明,就可以在其它文件中使用。

 (2) 文件级全局变量 

定义时用说明符static进行声明的全局变量是文件级全局变量。

文件级全局变量的作用域是它所在的程序文件。虽然它在程序的运行期间一直存在,但它不能被程序中的其它文件所使用。用static声明的全局变量是为了限制它的作用域,达到信息隐蔽的目的。

在下面两种情况下,必须通过声明来扩展全局变量的作用域。

(1) 在同一个程序文件中,全局变量定义在后、使用在前。在使用前需要对其进行声明。如下所示:

#include <stdio.h>

int main()

{ int  a, b, c;

  extern int d;    /*全局变量声明*/

  d=b*b-4*a*c;

  printf("%d", d);

  return 0;

}

int d;      /*全局变量定义*/

2) 程序由多个文件组成,多个文件要用到同一个全局变量,这时可以在某个文件中定义该变量,而在其它文件中用extern对该全局变量进行声明。

    如下所示:

/*下面代码包含在文件file1.c中*/

# include <stdio.h>

int y=0;  /*定义全局变量*/

int main()

 { f1( );

   printf("%d\n ", y);

   return 0;

 }

/*下面代码包含在文件file2.c中*/

extern int y; /*声明全局变量*/

int f1( )

 {int x;

  scanf("%d", &x);

  y=2*x; 

}