结构体指针
-
一个指向结构体变量的指针,指向结构体变量的起始地址
-
定义:结构体类型 *指针名 struct student *p
-
访问结构体成员:(*p).name 或p->name
-
指针变量->成员名 :结构体变量中成员的值
-
指针变量->成员名++:结构体变量中成员的值,使用后再加1
-
++指针变量->成员名:结构体变量中成员的值加1,计算后再进行使用
-
指向结构体数组的结构体指针变量的值结构体数组的首地址
-
结构体,结构体指针,结构体成员作为函数参数
链表 -
添加元素时,存储的个数会随之改变,这种存储方式就是链表
-
链表中有一个头指针,指向一个变量,这个变量称为元素。链表中每个元素都包含数据部分和指针部分,数据部分存放元素包含的数据,指针部分指向下一个元素,最后一个元素的指针指向NULL.
-
动态分配空间的函数
-
malloc:在内存中动态分配一块size大小的内存空间 ,返回一个指针,该指针指向分配的内存空间,若出错,返回NULL
void *malloc(unsigned int size) -
calloc:在内存中动态分配n个长度为size的连续内存空间,返回一个指针,该指针指向动态分配的连续内存的首地址,若出错,返回NULL
void *(unsigned n,unsigned size) -
free函数:释放指针指向的内存区,使该部分内存能被其他变量使用。无返回值
void *free(void *ptr) ptr为最近一次调用calloc malloc返回的指针
共用体 -
使集中不同类型的变量存放在同一个内存单元中,在某一时刻只能有一个值,共同体的大小等于最大成员的大小
-
定义: union 共同体名
-
{
-
成员列表
-
} 变量列表
-
引用方式:共同体变量.成员名,不能在输出语句中直接引用共用体变量。如 printf(“%d”,共同体变量)
-
共同体变量初始化:只需要初始化一个值即可,类型必须和共同体第一个成员类型一致。
-
共同体类型的特点
同一内存虽然可用来存放不同类型的成员,但每次只能存放一种类型,而不能同时存放所有类型,即,共同体中只有一个成员能起作用,其他成员不起作用。
共同体变量中,起作用的永远是最后存放的成员,存入新成员后,原有的成员将失去作用
共同体变量的地址和它的各成员地址是一样的
不能对共同体变量名赋值,页不能企图引用变量名来得到一个值
位段
-
一种特殊的结构体类型,所有成员的长度均以二进制为单位进行定义,结构体中的成员称为段位。每个段位必须是int 、unsigned或signed中的一种。
-
定义:
struct 结构体名
{
类型 变量名:长度;}
预处理 -
包含宏定义,条件编译。
-
宏定义:预处理命令的一种,提供一种可以替换源代码中字符串的机制。宏定义指令#define用来定义一个标识符和一个字符串,以这个标识符代替这个字符串,相当于给指定字符串起了一个别名
-
作用范围:#define出现的位置到所在源文件的结束,或到响应的#undef预处理指令处。 可以定义在函数内。
-
不带参数的宏定义:#define 宏名 字符串 如 #define PI 3.1415
字符串中出现红名,则不进行替换
字符串超过一行,行末用反斜杠“\”进行续行
#define命令出现函数外时,宏名的有效范围为定义命令之后到此源文件结束
#undef命令终止宏定义作用域
宏定义是一种预处理命令,不同于变量定义,只能做字符替换,不能分配内存空间 -
带参数的宏定义 不仅要进行字符串的替换,还要进行参数的替换
#define 宏名((a),(b)) 字符串
宏替换代替实在的函数,提高代码速度(不存在函数调用),代价是由于重复编码,增加程序的长度
宏定义时,参数要加括号,若不加括号,结果可能错误因为参数可能是表达式
对带参数的宏的展开,只是用宏名后括号内的实参字符串代替#define命令中的形参
宏定义时,宏名和带参数的括号之间不能加空格,否则会将空格以后的字符都作为替换字符串的一部分
在带参宏定义中,形式参数不分配内存单元,因此不必做类型定义
#include命令 -
使用#include命令可将其他源文件的内容包含进来,即将其他文件包含到本文件之中。被读入的源文件必须用索引号或尖括号括起来。
#include “stdio.h” :系统先在用户当前目录中寻找要包含的文件,若找不到,再到存放C库函数头文件所在的目录中寻找要包含的文件
#include <stdio.h>:标准形式,系统会直接到存放C库函数头文件所在的目录中寻找要包含的文件。
通常情况下:包含库函数,使用尖括号节省查找时间,包含用户自定义文件时,使用双引号比较快捷。用户自己编写的文件通常保存在当前目录中,若文件不在当前目录中,双引号还可以给出文件路径
将恩建直接嵌入#include命令内也是可行的。这种方式称为嵌套的嵌入文件 -
经常用在文件头部的被包含文件称为标题文件或头文件,一般以.h结尾。包含内容
宏定义
结构,联合,枚举的声明
typedef声明
外部函数声明
全局变量声明 -
文件包含:
为程序修改提供方便
一个#include命令只能指定一个被包含的文件
文件包含可以嵌套的,一个被包含文件中还可以包含另一个被包含文件
若age.c中包含文件age.h,则编译后两者会成为一个文件。如age.h中有全部静态变量,该全部变量在age.c中有效,这时不需要使用extern声明
条件编译 -
#if命令 常数表达式 (判断表达式的真假)
语句段
#elif
语句段
#else
语句段
#endif -
#ifdef 宏替换名 (如有定义)
-
语句
-
#else
-
语句
-
#endif
-
#ifndef 宏替换名 (如未定义)
-
语句
-
#else
-
语句
-
#endif
-
#undef 命令:删除事先定义好的宏定义,可将宏名限制在特定的代码段中
#undef 宏替换名, -
#line命令:显示当前编译行的行号(LINE),当前编译文件名号(FILE)
#line 行号[“文件名”]
如: #line 100"137.c" -
#pragma命令:用于设定编译器状态,或指示编译器完成一些特定动作
#pragma 参数
messag参数:在编译信息窗口中输出的相应信息
code_seg参数:设置程序中函数代码存放的代码段
once参数:保证头文件被编译一次
文件
-
文件结构体有系统定义 FILE
-
定义文件指针:FILE *P 不能通过定义文件变量来操作文件,File型数据对象的位置由库函数确定,C语言只能通过FILE类型的指针来操作文件
-
打开文件:FILE *fp fp= fopen(文件名,使用文件方式)成功返回FILE类型指针,失败返回NULL
-
文件关闭:fclose(文件指针) 成功返回0,失败返回eof
-
程序关闭之前应关闭所有文件,目的是防止因为没有关闭文件而造成数据丢失
-
fputc(ch,fp): ch(一个常量或变量),fp(文件指针变量) 把一个字符写到磁盘文件(fp所指向的文件),成功返回写入的字符,失败返回EOF
-
ch=fgetc(fp):从指定的文件读取一个字符赋予ch
-
文件以读或读写的方式打开,当遇到文件结束时,返回文件结束标志EOF
-
fputs(字符串,文件指针):向指定的文件写入一个字符串。字符串:字符串常量,字符数组名,指针,变量
-
fgets(字符串,n,文件指针):从指定的文件中读取一个字符串到字符数组中。n表示读取的字符串中字符的个数(包含“\0”)
-
fprintf(文件类型指针,格式字符串,输出列表):格式化输出到磁盘文件
-
fscanf(文件类型指针,格式字符串,输入列表): 格式化读取磁盘文件
-
fread(buffer,size,count,fp):从fp指向的文件读取count次,每次读size字节,读取的信息保存在buffer地址中。
-
fwrite(buffer,size,count,fp):将buffer地址开始的信息输出count次,每次写size字节到fp指向的文件中。buffer,一个指针
-
文件的定位:
fseek(文件类型指针,位移量,起始点):移动文件内部的位置指针,一般用于二进制文件,在文本文件使用时,需要进行转换,计算的位置会出现错误。
文件类型指针:被移动的文件
位移量:移动的字节数,一般为long型数据,以保证文件长度大于64KB不会出错,
起始点:从何处开始计算位移量,一般是文件首,文件当前位置和文件尾
文件首:表示符号:seek-set ;数字表示:0
文件当前位置:seec-cur ;数字表示:1
文件尾:seek-end;数字表示:2 -
rewind函数:将位置指针重返文件开头,没有返回值 形式:int rewind(文件类型指针)
-
ftell函数:得到流式文件中的当前位置,使用相对于文件头的位移量表示。 形式:long ftell(文件指针类型), 返回-1L,表示出错
存储管理 -
计算机程序一般被组织成4个逻辑段:可执行代码,静态数据,动态数据(堆)和栈
-
可执行代码和静态数据存储在固定的内存位置
-
动态数据需要系统动态分配内存,一般存放在堆区的内存池中
-
局部数据对象,函数参数,以及调用函数和被调用函数的关系,存在在栈区的内存池中。
-
堆:内存的全局存储空间中,程序可以动态分配和释放的内存块称为自由存储空间,也称为堆
-
C程序中,用malloc 和free函数从堆中动态地分配和释放内存
-
malloc( size):在内存中动态分配一块size大小的内存空间
-
calloc(n,size):动态分配n个长度为size的连续内存空间
-
realloc(*ptr,size):将ptr指针指向的内存空间的大小改为size
-
free(*ptr):释放指针ptr指向的内存区域。若不释放,会造成内存泄漏