C语言
类型定义
整型:int,long(例:int a =1;);
浮点型:float,double(例:float=3.1);
字符型:char(例:char=‘a’);
常量:const(和前面三种搭配使用 例:const 类型);
类型转换时,从高精度->低精度,会产生精度损失;
宏
强制转换
>int a ;
>char q;
>a = (int) q;
>q= (char) a;
枚举(enum)
>enum DAY
>{
> MON = 1, THE, WED, THU, FRI, SAT,SUN
>};//从1开始1,2,3,4...给变量赋值;
类型别名 typedef
typedef type newType;
typedef int intx;
intx a = 1;//与 int a = 1; 含义相同;
共用体和结构体
union aa {
int a;
char b;
cong c;
};
struct ABC{
int a ;
char b;
long c;
}ABC;
结构体会给所有类型分配内存;
共用体只给占用内存最长的类型分配内存,共用体中类型公用一块内存,会产生覆盖。
运算符
float a = 10%3; //a = 1
float b = 10/3; //b = 3
在出现 %,/ 时,通常使用浮点型定义。
a = 1;
b = a++;
c = ++a;
注意b,c 的值,即a++ ,++a的区别
算法
算法与程序的区别
算法的特性
又穷性、确定型、可行性、有输入、有输出
算法的评价标准
正确性、可读性、健壮性(鲁棒性)、高效率与低存储需求
算法的表示
流程图、N-S结构流程图、结构图、伪代码、PAD图
结构化程序设计方法
自顶向下、模块化、使用goto语句
程序的基本结构
顺序结构
选择结构
循环结构
当型循环,直到循环
顺序结构程序设计
表达式语句
空语句
函数调用语句:系统自带语句、自定义语句
复合语句:由花括号括起来的语句
控制语句:判断语句、循环语句、转移语句(continue、break)
数据的输入与输出
#include<stdio.h>
字符数据的输入与输出
c语言:putchar()、getchar()、getch()、getche()等,用来单个字符的输入和输出;gets()、puts()用于字符串的输入与输出。
回显、不回显(密码)
getch不回显、getche回显
getchar与getch、getche的区别
getchar需要按一次回车;gethe和getche只能接收一次输入
字符串的输入与输出
gets()、puts():以回车为结束,回车不属于字符串,puts将字符串数据显示在屏幕上并换行,gets返回指针。
格式的输入与输出
scanf()、printf():输入输出数据,并返回实际输出的字符数,出错返回负数。
C语言程序的上机步骤及基本调试技术
.c->.obj->.exe
条件
二路分支——if语句
if语句的一般形式
if
if-else
if-else if
if语句的嵌套
else总是与在它前面的距离他最近的尚未配对的if配对
多路分支——switch语句
default、break、continue
switch语句的嵌套
循环
循环语句
while 当循环
do while 直到循环
for 直到循环
goto语句
无条件转换语句
goto语句强制中断执行本语句后面的语句,跳转到语句标号标识的语句继续执行程序。
循环的嵌套
循环结束语句
continue:终止本次循环的执行,即跳过当前这次循环中continue语句呼呼尚未执行的语句,接着进行下一次循环语句的判断。
break:强行结束循环的执行,转向循环语句下面的语句。break语句世界树整个循环过程,不再判断执行循环的条件是否成立。
指针
直接访问和间接访问
直接访问:直接用变量名从对应的地址存取变量的值
间接访问:用指针类型的变量来存放地址,根据变量地址取变量的值
指针的概念
通过另一变量中存储的地址能找到所需的变量,可以认为该地址 指向 目标变量,C语言中称为指针;变量的指针就是变量的地址,指针类型就是地址类型,二村防止真的另一变量就是指针类型的变量。
指针运算符
地址运算符&
取值运算符*
& * 和 * & 的区别
指针变量的定义
基类型名 * 指针变量名(=&变量名)
定义时的初始化:用“=&变量名”来初始化
若没有给指针变量赋初值,则指针的初值不定,而某些系统默认为“空指针”(地址字节值为0)
指针变量的引用
数组
数组的定义和初始化
下表一律从0开始
一位数组的元素引用
二维数组的定义和初始化
字符数组
使用字符数组来表示字符串
char a[8] = {'G','o','o','d'};
char x[] = {'I',' ','a','m',' ','a',' ','s','t,'u','d','e','n','t','.'};
char x[20] = {"I am a student."};
char x[20] = "I am a student.";
char x[] = "i am a student.";
一位字符数组的定义和引用
定义格式
若初始化时元素初值列表给出的字符数小于定义的元素数,则后面自动补ASCII码为1的字符‘\0’,在字符串处理中‘\0’作为字符串结束符;字符数大于数组元素数的话,编译错误;等于的话,不会自动补‘\0’。
字符数组的输入与输出
可以用scanf()和printf()来输入和输出
%c—逐个元素输出和输入
%s—整体一次输入和输出
只有字符数组可以进行整体的输入与输出
输入或输出带空格的字符串需要用gets、puts
字符串处理函数
strlen(字符串)求长度,不包括\0
gets(字符数组)输入
puts(字符串)输出
strcat(字符数组,字符串)将字符串连接在字符数组中的串后面,返回字符数组的首地址
strcpy(字符数组,字符串)复制字符串到字符数组,返回字符数组的首地址
strcmp(字符串,字符串)两个字符串作比较,返回比较结果
strlwr(字符串)将大写转换为小写,返回该串的首地址
strupr(字符串)将小写转换为大写,返回该串的首地址
二维字符数组
指针与数组
指向数组的指针,+1-1指数组内元素的+1-1
两个同类型指针可以相减,得到一个整数,是二者之间性差的元素个数,不可以相加,相乘,相除
连个同类型指针可以进行比较运算,运算时用他们的地址值进行比较
空指针NULL,可指向任何类型的变量,可以和任何类型的指针进行等于或不等于的比较
b[j] = *b(+j) //[]称为变址运算符
int b[30], *p = b; *(p+j) = *(b+j)
指针也可带下标,即 b[j] = p[j]
字符指针、字符数组和字符串
地址越界问题
引用数组时,下标不能超过上下界
指针数组
数组元素为指针类型,元素类型为指向基类型指针变量的指针类型
基类型名 * 数组名[数组长度]【 = {地址初值列表} 】
二级指针,指向指针的指针
int **p;
多维数组和指向分数组的指针(可以忽略)
多维数组即大于等于二维的数组
动态数组
malloc函数
调用形式:
(类型说明符 *) malloc (unsigned int size);
例:
int *pc = (int *)malloc (5 *sizeof(int));
表示分配5个int类型大小的内存空间,并强制转换为字符指针类型
calloc函数
调用形式:
(类型说明符 *) calloc (n,size);
在内存动态存储区中分配n块长度为“size”字节的连续区域
calloc函数与malloc区别仅在于一次可以分配n块区域
free函数
free(void *ptr);
释放ptr所指向的一块内存空间
重点
- 字符串常量、字符数组、字符串的区别
- scanf和gets、printf和puts的区别
- 指针与数组的关系
- 静态数组和动态数组
函数
对于函数的说明
- 一个C源程序可以由一个或多个源文件构成,一个源文件又可以由一个或多个函数构成
- 一个C语言原程序中的所有函数都是相互独立的,各个函数间可以相互调用,但任何函数数均不能调用main函数
- 一个源程序总是从main函数开始执行,直到main函数结束。
函数的定义
类型名函数名(形参类型说明表)
{
说明语句
执行语句
}
函数的调用和返回值
数组作为函数参数
数组元素就是变量,与普通变量无区别
用数组名做函数参数与用数组元素或普通变量做参数有几点不同:
- 类型一致、数组说明一致
- 数组名时,共同占用一段空间
引用传递
形参与实参的区别,在进行值传递时的细节
值传递和地址传递的区别
对用户定义的被调函数的声明。当被调函数在主调函数之后定义,其数据类型不是int型或char型时,则一定要在主调函数之前或主调函数的说明部分对被调函数进行声明。
函数的递归调用
自己调用自己
变量的作用域
局部变量
函数内部的变量
全局变量
所有函数(包括main函数)外定义的变量基为全局变量,存放在静态存储区
静态存储方式:在编译时就分配了存储空间
动态存储方式
静态局部变量
用static定义的局部变量是静态局部变量,存放在内存的静态存储区中
例:
static int a = 1;
与全局变量一样,只在编译时赋初值一次,若未赋值,则默认赋值为0
虽然静态局部变量在函数调用结束后仍然存在,但仅能为定义他们的函数所使用的,其他函数不能使用
自动变量
局部变量中,不用关键字static声明存储类别,就是自动变量,放在动态存储区中
也可使用auto进行自动类型说明
例:
auto int a;
全局变量不能是自动变量
寄存器变量
用关键字register作存储类型说明
例:register int a;
调用更快
静态全局变量和非静态全局变量
静态全局变量:将全局变量用static来声明,以禁止在其他文件中访问
非静态全局变量:没有用static来限定的全局变量可以在其他文件中访问
外部变量:在其他文件中对非静态全局变量访问时,必须在其他文件的访问语句之前,用外部变量声明语句对已定异国的非静态全局变量进行外部引用声明,将其转化为外部变量。例:extern int a;
存储类型
- 从变量的作用范围:局部变量、全局变量
- 生存期:动态存储、静态存储
- 存储介质:内存变量、寄存器变量
内部函数和外部函数(了解即可)
函数使用的范围不同
指针与函数
返回指针的函数
结构体和共用体
结构体类型的定义
结构体类型定义格式:
struct <结构标记>
{
成员1;
成员2;
...
};
结构体变量
结构体变量的定义
结构体类型在编译时并不为其分配存储空间,遵循先定义后引用原则
结构体类型定义(方法一):
struct student
{
成员1;
成员2;
...
};
struct student stu1,stu2;//定义结构体变量stu1和stu2
结构体类型定义(方法二):
struct student
{
成员1;
成员2;
...
}stu1,stu2;
//定义结构体同时定义变量stu1和stu2
结构体类型定义(方法三):
struct
{
成员1;
成员2;
...
}stu1,stu2;//不定义构体类型名,直接定义变量
结构体变量的使用
结构体变量的初始化
结构体变量的初始化即对结构体成员变量赋初值,格式如下:
结构体类型名 结构体变量 = (初始值表);
- 对于整数和浮点数,默认值为零
- 对于字符和字符串,默认值为‘\0’
- 只能在定义结构体变量时使用该初始化格式
结构体变量成员的引用
格式如下:
结构体变量名 . 成员名
结构体变量命 . 成员结构体变量名 . 成员名
对结构体变量整体的引用
- 可作为函数的形参、实参或函数返回值等进行函数的数据传递
- 当两个结构体变量类型相同时,可以相互整体赋值
- 结构体变量不可以进行逻辑操作
数组和结构体都是构造数据,但数组元素必须时同一类型,结构体成员可以使任何类型
结构体数组
结构体类型定义(方法一):
struct student
{
成员1;
成员2;
...
};
struct student stu[3];//定义结构体数组stu1
结构体类型定义(方法二):
struct student
{
成员1;
成员2;
...
}stu1[3];
//定义结构体同时定义结构体数组stu1
结构体类型定义(方法三):
struct
{
成员1;
成员2;
...
}stu1[3];//不定义构体类型名,直接定义结构体数组
连续存放
初始化与结构体相同
结构体核函数(不是很重要)
共用体
允许不同类型的数据使用同一段内存,即让不同类型的变量存放在起始地址相同的内存当中,虽然他们占用的字节数可能不同,但其实地址相同。
共用体类型的定义
使用union声明
union <共用体标记>
{
成员1;
成员2;
...
}
共用体成员共享同一段内存,结构体成员有各自的存储空间
共用体变量
与结构体变量引用相同
共用体标记 . 变量名
共用体变量占内存空间的长度等于各成员中存储空间最长的成员的长度
每次只能赋一种值,新值会覆盖旧值
枚举类型
enum是枚举类型的关键字,enum与枚举标记共同组成枚举类型名。
enum weekday
{sun,mon,tue,wed,thu,fri,sat};
//定义类一个枚举类型名 enum weekday 和该类型可取的7个枚举值
其中,enum是枚举类型定义的关键字,enum与美剧标记共同组成枚举类型名
每个枚举长廊都是用合法标识符表示的整型常量,要求不能重名,也不能与其他标识符重名
这些标识符代表该类型可取的枚举常量值,因此称为枚举常量或枚举值
typedef语句(取别名)
typedef语句的定义格式
定义格式
typedef <已定义类型名> <新的类型名>
例:
typedef int INTEGER; //即int与INTEGER等价
typedef struct student
{
int id;
char name[20];
int score[3];
float aver;
}STUDENT, *STU;
//STUDENT和STU都是类型名
STUDENT stu1和struct student stu1等价,STU stu2与struct student * stu2等价
tupedef与#define的区别
相似之处
#define STRING char
typedef char STRING;
STRING str;
此定义中
作用相同,但宏定义是代替原有字符,而类型定义的含义是定义了一个char类型的变量str
区别之处
#define INTEGER int*
typedef int* INTEGER;
INTEGER a, b;
此定义中
宏定义可理解为 int * a , b; 表明声明了一个整型指针变量a和一个整型变量b
类型定义可理解为int * a , * b; 表示声明了两个整型指针变量a和b
指针与链表
编译预处理、位运算及混合编程
文件包含处理——#include
使用双引号
#include "文件名"
系统首先在当前目录下查找被包含文件,并将其内容复制到#include命令出现的位置上,时期全部内容称为源程序清单的一部分
使用尖括号
#include <文件名>
直接到系统指定的“包含文件目录”去查找
一般的,如果是要包含系统库函数所在的头文件,则用尖括号,以节省查找时间
如果要包含用户自己写的文件(这种文件一般都在当前目录中),一般用双引号
宏定义——#define
不带参数的宏
#define 标识符 字符串 //字符串可以是常量、表达式、格式串等,一般由大写字母组成
带参数的宏
#define 宏名(实参表)字符串
引用时使用 宏名(实参表)
位运算符和位运算
&与; |或; ^异或; ~取反; <<左移; >>右移
文件
文件概述
数据流
程序传到文档的流
文件
存放在外部存储介质的数据集合
当打开一个文件或创建一个新文件时,一个数据流和一个外部文件(或一个物理设备)相关联
每个未见必须有一个文件名作为访问文件的标志
文件名【.扩展名】
交互方法有两种
以文件为单位将数据写到外存中
从外存中根据文件名读取文件中的数据
文件的操作流程
建立/打开文件
从文件中读数据或者向文件中写数据
关闭文件
文件类型的指针
调用一个文件,一般需要该文件的一些信息,如文件当前的读写位置、与该文件对应的内存缓冲区地址、缓冲区中未被处理的字符串、文件操作方式等
缓冲文件系统会为每一个文件系统开辟这样一个“文件信息区”,包含在头文件stdio.h中,被定义为FILE类型数据
typedef stuct
{
short level; //缓冲区满或空的程度
unsigned flags; //文件状态标志
char fd; //文件描述符
unsigned char hold; //如无缓冲区不读取字符
short bsize; //缓冲区的大小
unsigned char *baffer; //缓冲区的读写位置
unsigned char *curp; //指针指向的当前文件的读写位置
unsigned istemp; //临时文件,指示器
short token; //用于有效性检查
}FILE; //结构体被取别名为FILE
FILE *fp; //fp是一个指向FILE结构体类型的指针变量。
标准输入输出函数
打开文件
fopen函数原型
FILE *fopen(char *filename, char *mode); //用mode模式打开指定的filename文件
若打开成功,返回一个FILE类型的指针;打开失败,返回NULL
例如:
FILE *fp;
fp = fopen ("test.txt" , "r" ); //打开一个可执行文件在相同路径下的文本文件tset.txt
FILE *fp;
fp = fopen ("e:\\code\\tese.txt" , "rt" ); //打开一个E盘下code文件夹下的文本文件test.txt
FILE *fp;
fp = fopen ("e:/code/tese.txt" , "rt" ); //打开一个E盘下code文件夹下的文本文件test.txt
文件访问模式
文件使用方式 | 意义 |
---|---|
“rt” | 只读打开一个文本文件 |
“wt” | 只写打开或建立一个文本文件 |
“at” | 追加打开一个文本文件,并在文件末尾写数据 |
… | … |
关闭文件
fclose函数的原型如下
int fclose (FILE *fp);
fclose (fp); //将文件指针fp所指的文件关闭
关闭成功,返回0;返回非0值表示有错误发生
获取文件属性
文件的顺序读写
单字符读写函数:fgetc()和fputc()
字符串读写函数:fgets()和fputs()
格式化字符串读写函数:fscan()f和fprintf()
数据块读写函数:fread()和fwrite()
获取文件大小:fileno()filelength()
fileno函数原型
int fileno(FILE *fp);
//返回锁打开文件指针fp对应的文件描述字(handle_no);打开成功后,操作系统会自动赋予一个号码,此号码用来代表锁打开的文件;所在头文件为stdlib.h
long filelength(int handle_no);
//返回文件描述字(handle_no)对应的文件大小,以字节为单位;所在头文件为io.h;
关于符号常量EOF:对ASCII码文件进行读入操作时,如果遇到文件尾,则读操作函数返回一个文件结束标志EOF,气质在头文件stdio.h中已被定义为-1;对于二进制文件进行读入操作时,必须使用库函数feof()来判断是否遇到文件尾
文件的随机读写
rewind函数
void rewind (FILE *fp); // 将文件内部的位置指针移动到文件开始位置
fseek函数
int fseek (FILE *fp, long offset, int whence); //文件指针由whence地址移动到offset地址
ftell函数
i = ftell(fp);
if (i == -1L) printf("ERROR!\n");
//得到流式文件的当前位置,用相对于文件开头的唯一量来表示
//若返回值为-1L,表示出错