C语言知识第8章1-王厚财
- 格式:doc
- 大小:51.50 KB
- 文档页数:4
复习:1.函数的定义与函数的调用2,函数说明3.函数的递归调用4.用户自定义标识符5.变量的数据类型讲授新课第六章变量与函数的作用域6.1局部变量与全局变量前面学习的各种变量是按照它的数据类型来分类的。
按照它们定义位置的不同,这些变量可以分为全局变量与局部变量。
6.1.1局部变量局部变量是指在函数的内部或复合语句体内定义的变量,包括函数的形式参数。
它只在本函数或复合语句内有效,即局部变量的作用范围是在定义它的函数体内或复合语句内,超出这个范围,这些变量不能使用。
举例说明说明:1.一个函数不能使用在另一个函数内定义的变量。
2.不同函数可以使用同名的变量,他们代表不同的存储单元,互不干扰。
6.1.2全局变量全局变量是指在函数体外定义的变量。
它们在程序的整个运行期间有效,即全局变量的作用范围从定义它开始,直到程序结束为止。
举例说明说明:1.在局部变量与全局变量同名时,全局变量全局有效,局部变量局部有效,他们的作用范围用一句话可以概括为“县官不如现管”。
2.函数的调用只能用return返回一个值,现在有了全局变量,可以通过全局变量返回多个变量的值。
3.全局变量的作用范围与其的定义位置有关。
6.2动态存储变量与动态存储变量从变量的作用域分,变量分为局部变量与全局变量。
从变量的生存时间的角度分为静态存储变量和动态存储变量。
静态存储变量包括全局变量(extern)与静态(static)的局部变量;动态存储变量包括自动型(auto)变量与寄存器(register)变量。
6.1数据存放在静态存储区和动态存储区中。
动态存储区用来保存函数调用时的返回地址,自动类别的局部变量等;静态存储区原来存放全局变量和静态类的局部变量。
在C语言中,每一个函数和变量有两个属性:数据类型和数据的存储类别。
数据类型前面已经学习过(int、float等),存储类别具体包括四种:自动的(auto)、寄存器的(register)、静态的(static)和外部的(extern)。
第8章预处理命令C程序中可以加入一些预处理命令,其目的是改进程序设计环境,提高编程效率。
这类命令主要包括:宏定义、文件包含和条件编译三种,为了区别一般的C语句,这类命令都以#开头。
8.1 宏定义8.1.1 不带参数的宏定义格式:#define 宏名宏体其中:宏名是一个标识符,宏体是一个表达式字符串。
功能:程序编译时,用宏体代替宏名。
例8.1。
说明:(1) 宏名一般习惯用大写字母表示,以便与变量名相区别。
但这并非规定,也可用小写字母。
(2) 使用宏名代替一个字符串,可以减少程序中重复书写某些字符串的工作量。
(3) 宏定义是用宏名代替一个字符串,也就是作简单的置换,不作正确性检查。
(4) 宏定义不是C语句,不必在行末加分号。
如果加了分号则会连分号一起进行置换。
(5) #define命令出现在程序中函数的外面,宏名的有效范围为定义命令之后到本源文件结束。
通常,#define命令写在文件开头,函数之前,作为文件一部分,在此文件范围内有效。
(6) 可以用#undef命令终止宏定义的作用域。
(7) 在进行宏定义时,可以引用已定义的宏名,可以层层置换。
(8) 对程序中用双括号括起来的字符串内的字符,即使与宏名相同,也不进行置换。
(9) 宏定义是专门用于预处理命令的一个专用名词,它与定义变量的含义不同,只作字符替换,不分配内存空间。
例8.2。
8.1.2 带参数的宏定义格式:#define 宏名(形参表)宏体其中:宏名是一个标识符,宏体是一个带有形参的表达式字符串。
功能:程序编译时,用实参代替形参,再用宏体代替宏名(形参表)。
例8.3。
说明:(1) 对带参数的宏的展开只是将语句中的宏名后面括号内的实参字符串代替#define命令行中的形参。
(2) 在宏定义时,在宏名与带参数的括弧之间不应加空格,否则将空格以后的字符都作为替代字符串的一部分。
8.1.3 带参数的宏与函数的区别(1) 函数调用时,先求出实参表达式的值,然后代入形参。
河北计算机c语言每章知识点总结河北计算机C语言每章知识点总结C语言是一门被广泛应用于计算机编程领域的高级编程语言,它具有表达能力强、灵活性高、执行效率高等特点,因而在计算机科学与技术专业中被广泛教授和使用。
河北省的计算机专业学生在学习C语言过程中,通常会按章节进行学习和总结知识点。
下面将按照河北省计算机C语言课程的章节顺序,对每个章节的主要知识点进行总结。
第一章:概述与预备知识本章主要介绍了计算机程序设计的基本概念和C语言的特点。
包括计算机程序设计的基本方法、程序的编译过程、C语言的特点和结构、C语言的编写规范等。
此外,还介绍了C语言编程环境的建立和使用,包括集成开发环境(IDE)的安装、配置和使用。
第二章:基本数据类型本章主要介绍了C语言中的基本数据类型,包括整型、浮点型和字符类型。
其中整型又分为有符号整型和无符号整型,详细介绍了各种数据类型的取值范围、存储方式以及相关的转换规则。
此外,还介绍了常量和变量的定义、声明和使用方法。
第三章:算术和逻辑运算本章主要介绍了C语言中的算术运算和逻辑运算。
包括基本的算术运算符(加、减、乘、除、取模)和逻辑运算符(与、或、非、异或)的使用方法,以及运算符的优先级和结合性。
同时,还介绍了C语言中的逻辑表达式和条件语句(if语句和switch语句)的使用方法。
第四章:控制结构本章主要介绍了C语言中的控制结构,包括顺序结构、选择结构和循环结构。
详细介绍了if语句、switch语句、while循环、do-while循环和for循环的使用方法和注意事项。
此外,还介绍了break语句和continue语句的作用和使用方法。
第五章:数组本章主要介绍了C语言中的数组。
包括一维数组和多维数组的定义、声明方法以及数组元素的访问和操作方法。
此外,还介绍了数组作为函数参数的传递方式,以及动态内存分配和释放中涉及到的相关知识。
第六章:字符数组和字符串本章主要介绍了C语言中的字符数组和字符串。
复习:1.局部变量与全局变量2.变量的作用域与生存期3.函数的存储类别讲授新课第7章数组把具有相同类型的若干变量的数据集合称为数组。
在C语言中,数组属于构造数据类型。
即它是由基本类型构造而得的一种数据类型。
本章主要介绍普通的一维和二维数组、字符数组以及字符串。
7.1 一维数组如果我们在程序中要用到多个变量,既然变量的类型相同,我们也只能一个一个地进行变量定义。
如果用到的变量太多的话,就会显得繁杂,而且使用起来也不方便。
C语言中采用数组来解决上述问题。
数组可以一次定义多个相同类型的变量。
7.1.1一维数组的定义与初始化数组是一组具有相同类型的数据的有序集合。
数组的中每个数据称为数组元素。
数组有两个特点:其一是类型相同,即组成数组的每个数组元素具有相同的数据类型;其二是有序,每个数组元素在数组的位置确定。
若数组元素在数组的位置通过一个序号(下标)就可以确定,我们称这样的数组为一维数组。
1.一维数组的定义在C语言中,定义一维数组的一般形式为:类型说明数组名[常量表达式] ,……;说明:(1)定义性说明整型数组a,a为数组名。
数组名的命名和变量一样,应符合用户标识符的命名规则。
(2)常量表达式的值表示数组元素的个数,该数组中有10个元素(相当于10个变量)。
且“[]”中的常量表达式中可以包含常量和符号常量,但不能包含变量。
(3)类型说明符的类型是数组元素的类型。
(4)定义了一个数组,实质上是定义一批同类型的变量。
这些变量在内存中的地址连续,如图7.1,系统为数组a开辟了10个地址连续的存储单元,数组名代表的是整个存储单元的首地址,也可以说a与数组元素a[0]的地址值相同。
(5)这一批变量的名字有如下形式:数组名[下标],下标为它在数组中的排序号(序号从0开始)。
(6)允许在同一个类型说明中,说明多个数组和多个变量。
2.一维数组的初始化当我们定义一个数组时,系统为其分配一串连续的存储单元,这些存储单元中并没有确定的值。
复习:1.一维数组的定义与数组元素的引用2.一维数组的初始化3.二维数组的定义与数组元素的引用4.二维数组的初始化讲授新课:7.3 字符型数组与字符串7.3.1一维字符数组与字符串1.一维字符数组用来存放字符类型数据的数组称为字符数组。
(1)一维字符数组的定义与初始化字符数组定义的形式与前面介绍的数值数组相同。
可以用给一维数组赋初值的方法给字符数组赋初值,①所赋初值的个数与字符元素的个数相同时②所赋初值的个数与字符元素的个数不相同时,后面元素自动赋‟\0‟③可以省略数组元素的个数,个数通过初值的个数来确定,(2)字符数组元素的引用与普通数组元素的引用一样,只是在输入和输出时格式字符用’\c’。
2.字符串C语言中,字符串是借助于字符型一维数组来存放的。
C语言规定:以字符’\0’作为字符串的结束标志。
’\0’占用存储空间,但不计入字符串的长度。
(1)字符串常量①C语言中,允许使用字符串常量。
用一对双引号引起来的合法字符为字符串常量。
在字符串常量中,不需要人为加字符串结束标志,系统自动加入字符串的结束标志’\0’。
②C语言中,字符串常量被隐含处理成一个以’\0’结尾的无名一维字符型数组,(2)用字符数组来存放字符串①字符数组来存放字符串与普通字符数组的区别普通字符数组的每个元素中可存放任意一个字符,并不限定最后一个字符是什么。
而字符串字符数组的最后一个字符必须是串结束标志’\0’。
在字符串中,我们关心的是有效字符串的长度而不是字符数组的长度。
②在给字符数组的字符串赋初值时直接赋字符串常量可以直接用字符串常量给一维字符数组赋初值。
注意:在定义时字符数组应有足够的空间来存放字符串(包括‟\0‟),否则,很有可能破坏了其它数据或程序代码。
7.3.2字符串的输入与输出字符数组和字符串都可以以单个字符的形式逐个输入和输出,也可以以整体的形式输入和输出。
1.用格式字符来控制字符串的输入和输出(1)用”%c”格式逐个输入和输出(2)用”%s”格式整体输入和输出注意:①”%s”格式输入时,scanf中的输入项应为一地址值,使用一维字符数组的数组名。
复习:1.关系运算符与逻辑运算符2.关系表达式与逻辑表达式的求值3.If……else语句构成的选择结构4.If……else语句的嵌套构成的多分支的选择结构讲授新课4.3.3 switch语句构成的选择结构在例4.6中,程序用if—else语句实现了多分支选择,但是,这样的程序结构易读性差,又不易跟踪。
为此,C语言为某些多分支情况(并非所有多分支情况)提供了开关语句,即switch语句。
1.switch语句格式switch(表达式){case 常量表达式1:语句1case 常量表达式2:语句2......case 常量表达式n:语句ndefault:语句n+1}说明:(1)switch、case、default均为switch语句的关键字。
(2)switch后面的表达式必须用小括号括起来,表达式只能是整型、字符型或枚举类型。
switch语句后面用{}括起来的部分称为switch语句体。
(3)case后面必须是常量表达式,其类型必须与switch后面的表达式的类型相同,case与后面的常量表达式必须用空格分开。
(4)default代表case语句标号之外的标号,default可以出现在语句体中任何位置,语句体中也可以没有default标号。
(5)case语句标号后的语句可以是一条语句,也可以是多条语句,也可以省略不写。
2.switch语句的执行过程(1)首先计算switch后面“表达式”的值,然后寻找与该值相等的某个case后面标号,若找到,就执行该case标号后面的各语句,包括其后的所有case与default中的语句,直到整个switch语句体结束。
(2)如果没有任何一个case后面的“常量表达式”的值,与“表达式”的值匹配,则执行default后面的各语句,直到整个switch语句体结束。
若没有default标号,则跳过switch语句体,直接执行switch语句的后继语句。
3.switch结构的注意事项(1)switch后表达式的类型,一般为整型、字符型或枚举类型。
目录全国计算机等级考试——二级公共基础知识辅导讲义.................. 错误!未定义书签。
第一章数据结构与算法 0第二章程序设计基础 (6)第三章软件工程基础 (8)第四章数据库设计基础 (15)第一章数据结构与算法1.1 算法1描述。
*:算法不等于程序,也不等于计算方法。
程序的编制不可能优于算法的设计。
2、算法的基本特征(1)可行性。
针对实际问题而设计的算法,执行后能够得到满意的结果。
(2)确定性。
每一条指令的含义明确,无二义性。
并且在任何条件下,算法只有唯一的一条执行路径,即相同的输入只能得出相同的输出。
(3)有穷性。
算法必须在有限的时间内完成。
有两重含义,一是算法中的操作步骤为有限个,二是每个步骤都能在有限时间内完成。
(4)拥有足够的情报。
算法中各种运算总是要施加到各个运算对象上,而这些运算对象又可能具有某种初始状态,这就是算法执行的起点或依据。
因此,一个算法执行的结果总是与输入的初始数据有关,不同的输入将会有不同的结果输出。
当输入不够或输入错误时,算法将无法执行或执行有错。
一般说来,当算法拥有足够的情报时,此算法才是有效的;而当提供的情报不够时,算法可能无效。
*:综上所述,所谓算法,是一组严谨地定义运算顺序的规则,并且每一个规则都是有效的,且是明确的,此顺序将在有限的次数下终止。
3、算法复杂度主要包括时间复杂度和空间复杂度。
(1)算法时间复杂度是指执行算法所需要的计算工作量,可以用执行算法的过程中所需基12、数据结构主要研究和讨论以下三个方面的问题:(1)数据集合中各数据元素之间所固有的逻辑关系,即数据的逻辑结构。
数据的逻辑结构包含:1)表示数据元素的信息;2)表示各数据元素之间的前后件关系。
(2)在对数据进行处理时,各数据元素在计算机中的存储关系,即数据的存储结构。
数据的存储结构有顺序、链接、索引等。
1)顺序存储。
它是把逻辑上相邻的结点存储在物理位置相邻的存储单元里,结点间的逻辑关系由存储单元的邻接关系来体现。
复习:1,函数的定义2.函数的调用3.函数说明4.函数的递归调用讲授新课5.5函数应用举例编写(定义)函数时,要完成两方面任务:1.确定函数的首部。
确定该函数有没有返回值,返回值的类型如何;有哪些参数需要由主调函数来控制,类型如何;并为该函数取一个见名知意的函数名。
2.通过编写函数体,完成函数主体功能。
例5.7编写函数isprime(int x),判断x是否为素数,如果是,返回1,否则,返回0。
#include“math.h”int isprime(int x){int i;for(i=2;i<=sqrt((double)x);i++)if(x%i==0)return0;/*x一旦不能被某个数整除,即不是素数,返回0*/return1;/*x不能被2到x平方根之间的任何数整除,即为素数,返回1*/}main(){int a;printf(“enter a:”);scanf(“%d”,&a);if(isprime(a))printf(“%d is a prime\n”,a);elseprintf(“%d is not a prime\n”,a);}例5.8编写函数,将输入的一行字符中的数字字符转换成整数返回。
例如输入的字符为:a2h d34hu56(CR),应转换为整数2356。
#include"stdio.h"long invert()82{char ch;long a=0;while((ch=getchar())!='\n')if('0'<=ch&&ch<='9')a=a*10+ch-48;return a;}main(){long a;a=invert();printf("the result is:%ld\n",a);}例5.9编程打印如图5.7所示图形void print1(int l,int m){int i,j;for(j=1;j<=l;j++){for(i=j;i<m;i++)printf("");for(i=1;i<=2*j-1;i++)printf("*");printf("\n");}}void print2(int n,int m){int i,j;for(i=1;i<=n;i++){for (j=1;j<m;j++)printf("");printf("*\n");}}main(){int l1,l2,m,n;/*l1、l2、n 分别为图形树的三部分所占行数,m 表示图形树中心所在列数*/printf("enter the height of the tree to l1,l2,n:");scanf("%d%d%d",&l1,&l2,&n);printf("enter the position of the tree to m:");scanf("%d",&m);printf("\n\n");print1(l1,m);print1(l2,m);print2(n,m);}*****************************图5.783本章小结本章的主要知识点1.C语言中通过函数来实现模块化的程序结构2.一个完整的函数定义应包括函数首部与函数体两部分。
复习:
1.数值型数组与字符型数组的定义
2.数值型数组的赋初值与字符型数组的赋初值以及字符串的赋值
3.对于数值型数组的操作
4.对于字符串的操作及函数
5.排序
讲授新课:
第8章 指 针
指针是C语言中广泛使用的一种数据类型。
8.1 地址与指针
8.1.1数据在内存中的存储
计算机的内存是以字节为单位的一片连续的存储空间,每一个字节都有一个确定的编号,这个编号就是内存地址。
a x
见图8.1所示,内存的编号从0开始,连续进行编号。
在实际处理中,地址通常采用十六进制数形式。
8.1.2 变量的地址
在C程序中定义了一个变量,C编译系统就会根据定义中变量的类型,为其分配一定字节数的内存空间,所分配存储空间的首地址称为此变量的地址。
所分配存储空间中的数据就是这个变量的值,也就是存储单元的内容。
8.1.3 变量的存取方式
1.直接存取
一般情况下,我们在C程序中只需指出变量名就可以对变量进行存取操作,实际上也是对某个地址的存储单元进行操作。
这种直接按变量的地址存取变量值的方式称为“直接存取”方式。
2.间接存取
与“直接存取”方式相对应的是“间接存取”方式。
在C语言中,我们通过定义一种特殊的变量(即指针变量,一会我们将详细叙述;同时,为了叙述方便,我们将前面章节中定义的变量称为普通变量。
)用于存放内存单元的地址,然后根据这种特殊的变量的内容(里面存放的是地址值)去访问相应的存储单元。
这种方式称为“间接存取”方式。
“--- ”只是一种示意,形似“指针”。
用来存放地址值的变量称为指针变量,“变量p指向了变量a”的含义是指针变量p中存放了变量a的地址。
8.1.4 指针变量
如果一个变量中存放是地址值,那么称这个变量为指针变量。
常把指针变量简称为指针。
定义指针的目的是为了通过指针去访问内存单元。
8.2 指针变量的定义与简单操作
8.2.1指针变量的定义与指针变量的基类型
1. 指针变量的定义
C语言规定所有变量在使用前必须定义,指定其类型,并按此分配内存单元。
指针变量不同于普通变量,它是专门用来存放地址的。
定义指针变量的一般形式为:
类型说明符*指针变量名;
应该注意的是:虽然pa,pb和px三个指针变量分别指向不同类型的变量,但是pa,pb和px这三个变量本身在内存中所占的字节数是一样的。
2. 指针变量的基类型
既然指针变量都是用来存放地址值的,一个指针变量中存放的是一个存储单元的地址值。
而一个存储单元可能包括多个字节(整型2个字节,长整型4个字节,双精度型8个字节等),这多个字节的首地址作为整个存储单元的地址。
我们还要讲到指针的移动,也就是要对地址进行增减运算,此时指针移动的最小单位是一个存储单元而不是一个字节。
因此,对于基类型不同的指针变量,其增1、减1的字节数也是不一样的。
所以指针变量必须区分基类型。
3.指向指针的指针
指针变量同普通变量一样,也要在内存中分配存储单元,这个存储单元也要有地址值,我们可以定义一个指针变量来存放此地址值,这个指针变量就称为指向指针的指针变量。
8.2.2指针变量的赋值
指针变量同普通变量一样,使用之前不仅要定义说明,而且必须赋予具体的值。
指针变量的赋值只能赋予地址
一个指针变量可以有多种赋值方法:
1. 通过求地址运算来获得地址值
C语言中提供了地址运算符&来求一个内存单元的地址,&是一个单目运算符,我们可以利用求地址运算把一个变量的地址赋给指针变量。
求地址运算符&是用于求内存单元的地址,求地址运算符&应该放在变量的左边。
2. 指针变量间赋值
我们可以把一个指针变量的值赋予基类型相同的另一个指针变量,使这两个指针变量指向同一地址。
注意:当指针变量间赋值时,应保证赋值号两边的指针变量的基类型相同。
3. 给指针变量赋空值
定义一个指针变量后,若没有初始化或赋值,它的值是不确定的。
注意:不能说该指针变量没有值,如果使用没有初始化或赋值的指针变量,可能产生不可预料的结果。
为避免这种问题,可以给指针变量赋“空值”。
p=NULL;
NULL是在头文件stdio.h中有定义的预定义符,因此在使用NULL时,应该在程序的前面出现预定义命令行:#include “stdio.h”。
NULL的代码值为0,所以,以上语句等价于:
p=’\0’;p=0;
4.指针变量的其它赋值方法
指针变量里面存放的是地址值,只要是地址值,我们都可以赋给指针变量。
这包括后面将要学到的动态分配函数得到的地址值、数组的地址、函数的地址等等。
小结:
1.指针的定义
2.指针的意义及基类型
3.指向指针的指针
4.指针的赋值
作业:课后习题。