资源描述
.
程序设计基础(c语言)复习提纲
第一章 程序设计概述
1、C程序的组成和形式的基本特点
(1)C程序是由函数构成的,一个C源程序至少且仅包含一个main函数,也可以包含一个main函数和若干个其他函数。
(2)一个函数由两部分组成
① 函数的首部:即函数的第一行,包括函数类型、函数名(参数类型、参数名)
例:int max (int x, int y)
一个函数名后面必须跟一对圆括号,括号内写函数的参数类型、参数名。函数可以没有参数,如main()。
② 函数体:即函数首部下面的花括号内的部分。如果一个函数内有多个花括号,则最外层的一对花括号为函数体的范围。函数体一般包括:声明部分、执行部分
2、 运行C程序的步骤及每个步骤生成文件的类型及特点
C源程序(*.C)→预编译处理(*.C)→编译、优化程序(*.s、*.asm)→汇编程序(*.obj、*.o、*.a)→链接程序(*.lib、*.exe、*.elf、*.axf)。
3、 计算机程序设计语言从机器语言、汇编语言到高级语言。机器语言:用二进制代码表示的计算机能直接识别和执行的一种机器指令的集合。由0和1按一定规则排列组成的一个指令集。汇编语言:用助记符代替操作码和用地址符号或标号代替地址码。机器不能直接识别,需要翻译成机器语言。高级语言:更接近于自然语言。使用高级语言编写的程序不能直接运行,需要转换成机器语言才能运行,转换方式有解释和编译两种。
4、 一个程序应包括①数据结构即对数据的描述;②算法也就是操作步骤。著名计算机科学家沃思提出一个公式: 数据结构 + 算法 = 程序。计算机算法可分为两大类:数值运算算法和非数值运算算法。
5、 数据结构(Data Structure)是计算机存储、组织数据的方式。数据类型有整型、实型、字符型、数组类型、指针类型、结构体类型、共用体类型等。
6、 广义地说,为解决一个问题而采取的方法和步骤,就称为“算法”。算法是一系列解决问题的清晰指令。算法的特征:有穷性、确切性、可行性、输入、输出。算法的表示方法:自然语言表示法、流程图表示法、N-S图表示法、伪代码表示法。
7、 一个算法的基本结构:顺序结构、选择结构(选取结构或分支结构)、循环结构。
顺序结构:先执行A操作,再执行B操作。
选择结构:当p条件成立,执行A操作,当p条件不成立,执行B操作。
循环结构:循环结构分为当型循环和直到型循环
当型循环(while):当条件p成立时,反复执行A操作,直到p条件不成立为止。
直到型循环(until):先执行循环体A,直到条件p成立,循环终止。
8、 C语言一共有32个关键字,9种控制语句,34种运算符。结构化的控制语句有:(如if…else语句、while语句、do…while语句、switch语句、for语句)。C语言就是面向过程的程序设计语言;C++语言就是面向对象的程序设计语言。
9、 结构化程序设计的设计原则:自顶向下、逐步细化、模块化设计、结构化编码。
第二章 C语言基础与程序结构
1.C语言字符集:
字符是C语言的最基本的元素。C语言字符集由字母、数字、空格、标点和特殊字符组成。由字符集中的字符可以构成C语言(标示符、关键词、运算符等)。
1.字母:小写字母a~z共26个 大写字母A~Z共26个。
2.数字: 0~9共10个。
3.空白符:空格符、制表符、换行符等统称为空白符。
4.标点符号和特殊字符。
2、标识符的命名规则
标示符是一个名字,用来标识常量、变量、类型、语句、标号及函数的名称。C语言中标识符有三类:关键字、预定义标识符和用户定义标识符。C语言规定标识符只能由字母、数字和下划线3种字符组成,且第一个字符必须为字母或下划线,合法的标识符可以作为变量名。
已经被C系统所使用的标示符称为关键字。C语言的关键字共有32个,根据关键字的作用,可分其为数据类型关键字、控制语句关键字、存储类型关键字和其它关键字四类。
(1)数据类型关键字(12个):char, double, enum, float, int, long, short, signed, struct, union, unsigned, void
(2)控制语句关键字(12个):break, case, continue, default, do, else, for, goto, if, return, switch, while
(3)存储类型关键字(4个):auto, extern, register, static
(4)其它关键字(4个):const, sizeof, typedef, volatile
3、运算符
运算符可以由一个或者多个字符组成。运算符将常量、变量、函数连接起来组成表达式表示各种运算。运算符根据参与运算的操作数的个数分为:单目、双目、三目运算符。
1. 算术运算符:用于各类数值运算。包括加(+)、减(-)、乘(*)、除(/)、求余(或称模运算,%)、自增(++)、自减(--)共七种。
2. 关系运算符:用于比较运算。包括大于(>)、小于(<)、等于(==)、 大于等于(>=)、小于等于(<=)和不等于(!=)六种。
3. 逻辑运算符:用于逻辑运算。包括与(&&)、或(||)、非(!)三种。
4. 位操作运算符:参与运算的量,按二进制位进行运算。包括位与(&)、位或(|)、位非(~)、位异或(^)、左移(<<)、右移(>>)六种。
5. 赋值运算符:用于赋值运算,分为简单赋值(=)、复合算术赋值(+=,-=,*=,/=,%=)和复合位运算赋值(&=,|=,^=,>>=,<<=)三类共十一种。
6. 条件运算符:这是一个三目运算符,用于条件求值(?:)。
7. 逗号运算符:用于把若干表达式组合成一个表达式(,)。
8. 指针运算符:用于取内容(*)和取地址(&)二种运算。
9. 求字节数运算符:用于计算数据类型所占的字节数(sizeof)。
10. 特殊运算符:有括号(),下标[],成员(—>)等几种。
4、C语言的基本数据类型和构造数据类型
C数据类型
基本类型
构造类型
指针类型
空类型void
定义类型typedef
字符类型char
枚举类型enum
整型
实型
单精度型float
双精度型double
数组
结构体struct
共用体union
短整型short
整型int
长整型long
5、数据类型:
整型常量即整常数的3种表示方式:十进制整数;八进制整数(以0开头);十六进制整数(以0x开头)。
2进制
用两个阿拉伯数字:0、1;
8进制
用八个阿拉伯数字:0、1、2、3、4、5、6、7;
10进制
用十个阿拉伯数字:0到9;
16进制
0~9然后用A,B,D,E,F表示10,11,12,13,14,15
类型
符号
关键字
所占位数
数的表示范围
整型
有
(signed)int
16
-32768~32767
(signed)short
16
-32768~32767
(signed)long
32
-2147483648~2147483647
无
unsigned int
16
0~65535
unsigned short
16
0~65535
unsigned long
32
0~4294967295
实型
有
float
32
3.4e-38~3.4e38
有
double
64
1.7e-308~1.7e308
字符型
有
Char
8
-128~127
无
unsigned char
8
0~255
6、复合赋值运算符:a+=3;等价于a=a+3;
7、逗号运算符及其优先级、逗号表达式:
逗号表达式一般形式 表达式1,表达式2,┄,表达式N。表达式N的值作为整个逗号表达式的值。
赋值运算符的级别高于逗号运算符 a=3*5,a*4; a的值为15,表达式的值为60
10、强制类型转换打个括号:(double)a;(int)(x+y);
11、自增、自减运算i++或++i
1. 自增自减运算符只能用于变量,不能用于常量或表达式。
2. ++和—的结合方向是自右至左,例-i++合法,先输出-i再加一。例:i=3;a=i++;b=i++;c=i++;d=a+b+c;最终输出d=12。
12、C语言程序结构
预处理命令
全局变量的定义 //限制使用
函数声明
主函数main()
{ //函数体开始
声明部分
执行部分
} //函数体结束
其他函数
{
声明部分
执行部分
}
一个C程序总是从main()函数开始执行的,也是从main终止的,而不论main()函数在程序中的位置。
C语言的预处理功能主要包括:宏定义、文件包含、条件编译。分别用宏定义命令(#define)、文件包含命令(#include)、条件编译(#ifdef#else#endif)实现,为了与一般语句区别这些命令以“#”开头。
最基本的输入/输出函数包括:scanf/printf(格式输入/格式输出)、getchar/putchar(字符输入/字符输出)、gets/puts(字符串输入/字符串输出)等。
printf函数一般格式: printf(“格式控制字符串”,输出项列表);
printf(“Enter value of a\n”);在屏幕上打印出Enter value of a
printf(“sum is %d\n”,sum);在屏幕上打印出sum is 数值 //注释:(数值是sum的)
scanf函数一般格式:scanf(“格式控制字符串”,地址列表);
scanf(“%d”,&a);&与变量名a连用代表:a的内存地址,系统把用户输入的值存储在&a。
putchar()、getchar()函数
putchar函数(字符输出函数)作用是向终端输出一个字符。其一般形式为putchar(c)
putchar(‘\n’)作用是输出一个换行符,使输出的当前位置移到下一行的开头
getchar函数(字符输入函数)的作用是从终端输入一个字符,其一般形式为getchar()
例如char c;c=getchar();putchar(c);此时屏幕上将输出c的输入值。
转义字符 意义
格式占位符(%)
\n换新行起始符
%a,%A 读入一个浮点值(仅C99有效)
\r回车(到本行起始)
%c 读入一个字符
\b退格符
%d 读入十进制整数
\f换页符
%i 读入十进制,八进制,十六进制整数
\t横向制表符
%o 读入八进制整数
\v纵向制表符
%x,%X 读入十六进制整数
\\反斜杠
%s 读入一个字符串,遇空格、制表符或换行符结束。
\'单引号
%f,%F,%e,%E,%g,%G 用来输入实数,可以用小数形式或指数形式输入。
\"双引号
%p 读入一个指针
\?问号
%u 读入一个无符号十进制整数
\0空字符(NULL)
%n 至此已读入值的等价字符数
\ddd1到3为八进制数所代表的字符
l用于长整型整数,可加载个师傅d,o,x,u前面
\xhh1到2位十六进制树所代表的字符
m数据最小宽度
n对实数,表示输出n位小数,对字符串,表示截取的字符个数
-输出的数字或字符在域内向左靠
13、三种预处理包括:宏定义、文件包含、条件编译。
宏定义是用一个宏名(例如PI)表示一个字符串(例如:3.14)(字符串可以是常数、表达式、格式串等)。在宏展开时用该字符串取代程序中出现的宏名(宏名一般习惯用大写字母表示)。
1.不带参数的宏定义的一般形式:#define标识符 字符串 例如:#define PI 3.14
2.带参数的宏定义的一般形式: #define宏名(形参表)字符串 例如:#define S(a,b) a*b
文件包含命令的功能是把指定的“头文件”插入该命令行位置取代该命令行,从而把指定的“头文件”和当前的源程序文件连成一个源文件。
一般形式:
#include<头文件名>
/****
stdio.h
┄
┄
stdio.h
被包含
#include< stdio.h>
Void main()
{
┄
}
#include< stdio.h>
Void main()
{
┄
}
Void main()
{
┄
}
file.c
file.c
#include”头文件名”
条件编译命令的一般形式
第一种形式:
#ifdef标识符:
程序段1
#else
程序段2
#endif
它的功能是,如果标识符已被#define命令定义过,则对程序段1进行编译;否则对程序段2进行编译。
第二种形式:
#ifndef标识符:
程序段1
#else
程序段2
#endif
它的功能与第一种形式的功能是相反的,如果标示符未被#define命令定义过,则对程序段1进行编译,否则对程序段2编译。
第三种形式:
#if 常量表达式
程序段1
#else
程序段2
#endif
它的功能是,若常量表达式的值为真(非0),则对程序段1进行编译,否则语句段2编译。因此可以使程序在不同条件下,完成不同的功能。
14、位运算是指按二进制进行的运算。
操作符
优先级
作用
要求运算符的个数
结合方向
~ 取反
高
低
按位取反
单目
从右到左
<< 左移
>> 右移
左移、右移
双目
从左到右
& 按位与
按位与
双目
从左到右
^ 按位异或
按位异或
双目
从左到右
| 按位或
按位或
双目
从左到右
第三章 程序的控制结构
1、关系运算符及其优先次序
① < (小于)
② <= (小于等于)
③ > (大于)
④ >= (大于等于)
⑤ == (等于)
⑥ != (不等于)
== (等于)、!= (不等于)优先级相同低于< (小于)、<= (小于等于)、> (大于)、>=(大于等于)。
逻辑运算
(1)&& (逻辑与) 相当于其他语言中的AND
(2)|| (逻辑或) 相当于其他语言中的OR
(3)! (逻辑非) 相当于其他语言中的NOT
!(非)>&&()>||();逻辑运算符中的“&&”和“||”低于关系运算符,“!”高于算术运算符
2、控制语句 9种
If…else…/for…/while…/do…while/continue/break/switch/goto/return
(1) 单分支结构形式如下:
if(表达式)
语句;
例:if(x>y)
printf(“%d”,x);
(2) 双分支结构形式如下:
if(表达式)
语句1;
else
语句2;
例:if(x>y)
printf(“%d”,x);
else
printf(“%d”,y);
(3) 多分支结构
if(表达式1)
语句1;
else if(表达式2)
语句2;
else if(表达式3)
语句3;
……
else if(表达式n)
语句n;
else
语句n+1;
例:if(number>500)
cost=0.15;
else if(number>300)
cost=0.10;
else
cost=0;
(4) switch语句的基本格式:
switch(表达式)
{
case常量表达式1:语句组1;[break;]
case常量表达式2:语句组2;[break;]
…
case常量表达式n:语句组n;[break;]
[default:语句n+1]
}
(5) if语句的嵌套形式:
if(表达式1)
if(表达式2)语句1;
else语句2;
else
if(表达式3)语句3;
else语句4;
3、 C语言可实现循环结构的语句:用goto 和 if 构成循环;while 语句;do ~ while 语句;for 语句
(1) while(表达式)
语句;
先计算while后面表达式的值,如果其值为“真”(非0)则执行循环体。
例子:while(i<=100)
{
sum=sum+I;
i++;
}
(2) do
{
语句;
}while(表达式);
执行do后面的循环体语句,计算while后面表达式的值,如果其值为“真”(非0),则继续执行循环体,如果表达式的值为“假”(0),退出循环。
例子:do
{
sum=sum+I;
i++;
}while(i<=100);
printf(“%d\n”,a);
(3) for([表达式1];[表达式2];[表达式3])
循环体;
① 计算表达式1;
② 计算表达式2,若其值为真(非0,表示循环条件成立),则转③步。若其值为假(0,循环条件不成立),转⑤。
③ 执行循环体
④ 计算表达式3,则转②判断循环条件是否成立。
⑤ 结束循环,执行for循环之后的语句。
例子:for(;i<=100;)
{sum=sum+i;i++}
例子:for(i=1;i<=100;i++)
sum=sum+i;
4、break语句一般形式:break;
功能:在循环语句和switch语句中,终止并跳出循环体或开关体。break语句可以用来从循环体内跳出循环体,即提前结束循环,接着执行循环体下面的语句,不能用于循环语句和switch语句之外的任何其他语句中。
continue语句一般形式:continue;
功能:结束本次循环,跳过循环体中尚未执行的语句,进行下一次是否执行循环体的判断。
两者区别是continue语句只结束本次循环,而不是终止整个循环的执行。而break语句则是结束整个循环过程,不再判断执行循环的条件是否成立。
goto语句一般格式:goto 语句标号;
功能:无条件转移语句。
5、条件运算符格式: 表达式1?表达式2∶表达式3 例如:max=(a>b)?a∶b;
• 功能:判断表达式1的值,如果成立就执行表达式2,否则就执行表达式3
精选范本
第四章 数组
1、数组的定义方式、下标范围
一维数组的定义格式:类型说明符 数组名[常量表达式]
例:int a[3];
表示定义了一个整数数组,数组名为a,有3个元素(a[0]、a[1]、a[2])。注意,下标是从0开始的(可以是整型常量或整型表达式)。
2、数组元素的引用方式、数组的初始化
全赋初值
例如:int a[3]={1,2,3} 在全赋初值的前提下可以写成int a[]={1,2,3}
赋初值一部分
例如:int a[3]={1,2}
全部为0
例如:int a[3]={0}
3、二维数组
二维数组定义的一般格式:类型标识符 数组名[整型常量表达式][整型常量表达式];
例:float a[3][4],b[5][10];
定义a为3行4列的数组,b为5行10列的数组。
初始化:
① 分行给二维数组赋初值,例。int a[3][2]={{4,5}{9,8},{4,2}};
② 将所有数据写在一个花括号内,按数组排列顺序对个元素赋初值,例int a[3][2]={1,2,3,4,5,6,}
③ 对部分元素赋初值,例,int a[3][2]={{4},{},{7}}未赋值的元素自动为0
④ 第一维可以不指定,但第二维不能省略int a[][2]={1,2,5,6,8,9}系统会根据第二维的长度自动算出第一维
⑤ 还可以int a[][4]={{0,0,3},{},{0,10}};
二维数组int a[3][4]
第0列
第1列
第2列
第3列
第4列
第0行
a[0][0]
a[0][1]
a[0][2]
a[0][3]
a[0][4]
第1行
a[1][0]
a[1][1]
a[1][2]
a[1][3]
a[1][4]
第2行
a[2][0]
a[2][1]
a[2][2]
a[2][3]
a[2][4]
二维数组 int a[3][4]在内存中的存放形式如图
0
1
4
5
2
3
a[0][1]
a[0][2]
a[0][3]
a[1][0]
a[1][1]
a[0][0]
a[1][3]
a[2][0]
a[2][1]
a[2][2]
a[2][3]
a[1][2]
6
7
10
11
8
9
a[0]
a[1]
a[2]
4、字符数组及其初始化、字符数组的输入输出(P144)
同前面的定义方法类似char c[10]
字符型和整型是互相通用的,因此可以定义一个整型数组,用来存放字符型数据。
例:char c[10]; c[0]=’a’; char a[]={‘B’,’O’,’Y’};
初始化:char c[3]={‘B’,’O’,’Y’};如果括号内初值个数大于数组长度,按语法错误处理,如果初值个数小于数组长度,则只将这些字符赋给数组中前面那些元素,其余的元素自动定为空字符
字符串的输入输出:逐个输入输出,用格式符%c输入或输出;或将整个字符串一次性输入或输出,用%s格式符。
字符串结束标志:‘\0’
char c[]={“I am happy”}等同于char c[]=“I am happy”(以上两种字符串长度为11而不是10)效果等同于char c[]={‘I’,’ ’,’a’,’m’,’ ’,’h’,’a’,’p’,’p’,’y’}
char c[6]= “hello”等同于char c[6]={‘h’, ‘e’, ‘l’, ‘l’, ‘o’, ‘\0’}
例 “hello”共5个字符,在内存占6个字节,字符串长度5。
h e l l o \0
104 101 108 108 111 \0
5、字符串处理函数
puts(字符数组)作用是将一个字符串输出到终端,puts输出的字符串中可以包含转义字符。
例char str[]={“China\n Bei jing”};
puts(str);
gets(字符数组)作用是从终端输入一个字符串到字符数组,并且得到一个函数值。
例gets(str) 键盘输入Computer[回车]
注意:puts和gets函数只能输出或输入一个字符串,如puts(str1,str2)为错误
6、
(1) 字符串拷贝函数strncpy()
例如:
char c1[10],c2[]=“abcdef”;
strcpy(c1,c2,3);
(2) 字符串连接函数strcat
例如:
char str1[15]=“china ”,str2[]=“Bei jing”;
printf(“%s”,strcat(str1,str2));
输出
china Bei jing
(3) 字符串比较函数strcmp()
例如:
strcmp(“china”,“china”);//返回值为0,每个字符都相同
strcmp(“computer”,“compare”);//返回值为1,‘u’>‘a’
strcmp(“35+78”,“4”);//返回值为-1,‘3’<‘4’
(4) 测试字符串长度函数strlen()
例如:
Char str[20]=“china” ;
printf(“%d\n”,strlen(str));
输出结果不是20,也不是6,而是5。也可以直接测字符串常量的长度。
(5) 大小写转换函数strupr()、strlwr()
例如:
strupr(”abcD“)=“ABCD” ;
strlwr(”abcD“)=“abcd” ;
第五章 函数
1、函数的调用特点及其分类
特点:
① 一个源程序文件可以为多个C程序共用
② 一个源程序文件时一个编译单位,在程序编译时是以源程序文件为单位进行的,而不是以函数为单位进行编译的
③ C程序的执行时从main函数开始的
④ 所有函数都是平行的,即在定义函数时是分别进行的,是互相独立的。main函数只能由系统调用的,别的函数间可以互相调用,但不能调用main函数。函数间的调用关系:一个主函数可以调用多个被调函数,同一个函数也可以被一个或者多个函数调用任意多次。
分类:从用户使用角度看,分为标准函数和用户自己定义的函数
从函数的形式看,分为无参函数和有参函数
2、函数的定义方法(P156-157)
①无参函数定义的一般形式
类型标识符 函数名()
{
声明部分
语句部分
}
void main()
{
……….
}
②有参函数定义的一般形式
类型标识符 函数名(形式参数表列)
{
声明部分
语句部分
}
int max(int x,int y)
{
int z;
z=x>y?x:y;
return(z);
}
③空函数
类型说明符 函数名()
{ }
例如 void dummy()
{ }
3、函数的参数、实参和形参之间的数值传递、函数值
实际参数:调用函数时函数名后面括号中的值
形式参数:定义函数时函数名后面括号中的值
实参可以是常量、变量、表达式或函数调用。在进行函数调用时,实参必须具有确定的值,以便把这些值传递给形参。
简单变量作函数参数
只有在函数被调用时系统才会为形参分配内存单元, 在函数调用结束时,系统会立即释放形参所占用的内存单元。因此,形参只在函数内部有效,在函数调用过程中,形参的值发生改变,不会影响实参,函数调用结束返回主调函数后则不能使用该形参变量。
数组名作函数参数
数组是数组的首地址,所以数组做函数参数时,不能把实参数组的每一个元素都赋予形参数组的各个元素,而是把实参数组的首地址传给形参数组。所以实际上形参数组和实参数组拥有同一段内存空间,因此当形参数组发生变化时,实参数组也随之变化。
4、函数的嵌套调用
嵌套调用:主调函数调用被调函数,而在被调函数的执行过程中又调用另一个函数。
main( )
调用f1函数
Main函数结束
f1函数
f2函数
调用f2函数
f1函数结束
f2函数结束
5、函数的递归调用及应用
递归函数定义:函数直接或间接的调用自身叫函数的递归调用。
递归问题的解决包括两个部分:一是:递归的结束条件(即在此条件下可以直接求解问题);二是求解问题的递归方式(即有明确的递归定义规则,可将问题简化成较小规模的同类问题)
6、C语言中的变量有作用域和生存周期的概念,变量的作用域指出了变量在什么范围内有效。变量的生存周期决定了变量的存活期,从系统为变量分配内存空间开始,到系统收回内存空间为止。
按照作用域范围可以分为两种:局部变量和全局变量。
在函数内(或复合语句)定义的变量是局部变量,在函数之外定义的变量称为外部变量,外部变量是全局变量也称全程变量。全局变量可以为本文件中其他函数所共用。它的有效范围为从定义变量的位置开始到本源文件结束。
例如
int p=1,q=5;
float f1(int a)
{
int b,c;
…
}
char f2(intx,inty)
{
int x,int y
…
}
从变量 (生存周期)分动态与静态两种存储方式:
静态存储:程序运行期间分配固定存储空间,从程序开始执行到程序结束。
动态存储:程序运行期间根据需要动态分配存储空间,从包含该变量定义的函数开始执行至函数执行结束。
7、变量的分类及其存储类别
存储类别是指数据在内存中的存储方式,具体包含以下四种:
auto----自动型 static-----静态型
extern----外部型 register----寄存器型
局部
atuo:
在声明局部变量时,若不指定 static,默认均是 auto,这类变量都是动态分配存储空间的,数据存储在动态存储区中。离开函数,值就消失,内存单元释放。
static:
在声明局部变量时,使用关键字 static 将局部变量指定为“静态局部变量”,这样在函数调用结束后不消失而保留原值,即占用的存储单元不释放,在下一次函数调用时,该变量已有值就是上次函数调用结束时的值。
register:
在声明动态局部变量或者函数形参时,可将变量声明为register,这样编译系统就会为变量分配一个寄存器而不是内存空间,通过这种方式可提升对某些局部变量频繁调用的程序的性能。(寄存器运算速度远高于内存)离开函数,值就消失,寄存器释放.
全局
静态外部变量,只限本文件引用,分配固定的内存单元
extern:
用于扩展全局变量的作用域。
1) 比如函数想引用一个外部变量,但该外部变量在该函数后定义,那么这个函数需要使用 extern 来声明变量,这样才能使用在该函数后面定义的全局变量。
2) 此外,extern 还可以在多文件的程序中声明外部变量和外部函数。
8、内部函数和外部函数
如果一个函数只能被本文件中其它函数所调用,它称为内部函数。如果一个函数能被本文件中和其他文件中的函数调用,称为外部函数。外部函数不仅可以被定义它的源文件调用,而且可以被其他的文件中的函数调用,即其作用范围不只局限于源文件,而是整个程序的所有文件。
第六章 指针
1、变量的地址和变量的值
2、指针和指针变量
一个变量的地址称为该变量的“指针”。如果有一个变量专门来存放另一变量的地址(指针),则它称为“指针变量”。
3、指针变量的定义方式、引用方式
指针变量定义的一般形式为:类型标示符 * 指针变量名;
*表示这是定义一个指针变量。
例如:
int *p1; //表示p1是一个指向整型变量的指针变量
double *p2; //p2是指向双精度浮点型变量的指针变量
float *p3; //p3是指向单精度浮点型变量的指针变量
char ch,*p4; //p4是指向字符型变量的指针变量
指针变量通过地址运算“&”赋值。通过地址运算符“&”可以把一个变量的地址赋给指针变量。
例如:
int f,*p;
p=&f;
执行后把变量f的地址赋值给指针变量p,指针变量p就指向了变量f。
说明指针p指向f,f是p指向的对象,可以用*p来引用f,此时*p与f代表f的值,而p与&f都代表变量f的地址。
C语言提供了指针运算符“*”。指针运算符是单目运算符,运算对象只能是指针变量或地址,可以用“指针运算符”来存取相应的存储单元的数据。
例如:
f=6;和*p=6;等价。
scanf(“%d”,&f);和scanf(“%d”,p);等价。
p=&f;
*p=6;
4、指针变量作为函数参数(利用函数来改变实参的值)、实参和形参的值传递
指针作为函数参数
#include<stdio.h>
void main( )
{ int x1,x2;
scanf(“%d,%d”,&x1,&x2);
swap(&x1,&x2) ; //注意实参是变量x1和x2的地址
printf(“\nx1=%d,x2=%d\n”,x1,x2);
}
void swap(int *p,int *q) //由于传递的地址,相应的定义指针变量作形参
{ int temp;
temp=*p;
*p=*q;
*q=temp;
}
5、指向数组元素的指针
一个变量有地址,一个数组包含若干元素,每个数组元素都在内存中占用存储单元,它们都有相应的地址。指针变量既然可以指向变量,当然也可以指向数组元素(把某一元素的地址放到一个指针变量中)。所谓数组元素的指针就是数组元素的地址。
例如:
int a[10],*p; //定义a为包含10个整型数据的数组
int *p; //定义p为指向整型变量的指针变量
语句p=a;和p=&a[0];是等价的,都表示指针变量p指向a数组的首地址。数组首地址的值在c语言中是一个地址常量,是不能改变的。
例如:
int a[10],*pi=a;
float f[10],*pf=f;
则pi+1将指向a[1],pi+1和a+1的值都是a[1]的地址,pf+1将指向pf[1],pf+1和f+1的值都是f[1]的地址。
6、一维数组元素和地址的表示方法、利用指针处理数组元素
7、指向字符串的指针、利用它来处理字符串
字符串的指针是动态的,指向字符串的首地址。
第七章 结构体与共用体
本章主要考查类型定义符typedef、结构体(即“结构”)与共用体(即“联合”),包括类型定义符typedef,结构体和共用体类型数据的定义方法和引用方法,结构指针变量,结构数组,用指针和结构体构成链表,单向链表的建立、输出、删除与插入等知识点。通过对历年试卷内容的分析,本章考核内容约占5%,属于一般考查内容。由命题走势图13-1可知,本章部分所涉及考题分值有减少趋势。
13.1 类型定义符 13.1.1 考点1:typedef
C语言不仅提供了丰富的数据类型,而且还允许由用户自己定义类型说明符,也就是说,允许由用户为已存在的数据类型名定义一个“别名”。类型定义符typedef即可用来完成此功能。说明新类型名的语句一般形式为:
typedef 类型名 标识符;
这里的“类型名”必须是在此语句之前已有定义的类型标识符,可以是任何基本类型、结构或联合类型符号,也可以是typedef定义的类型名。“标识符”是一个用户定义标识符,用作新的类型名。例如:
typedef int INTEGER;
该语句把一个用户命名的标识符INTEGER说明成一个int类型的类型名。在此说明之后,就可以用INTEGER来代替i
展开阅读全文