一、C语言部分
1、数据类型:
Int 整形 4字节Short 短整形 2字节Long 长整形 4字节Float 单精度浮点型 4字节Double 双精度浮点型 8字节Char 字符型 1字节
2、变量
- 全局变量:作用于全局的变量。即生命周期为程序的开始到程序的结束。
- 局部变量:作用于中指定区域的变量。main()函数中的局部变量生命周期等同于全局变量
- 当全局变量与局部变量的变量名相同时,局部变量优先使用
3、常用关键字
- static:用static修饰的变量不会因函数的结束而被释放。
- break:结束整个循环,当循环多层嵌套时,运用break只能结束一层循环;跳出switch语句,如果不用break,在运行完当前case语句后继续运行下一条case语句。
- continue:结束本次循环,即本次循环中continue后的语句不执行。
- sizeof:计算数据结构或类型所占空间大小。
4、if…else语句:
if(表达式)
{语句a;
}
else
{语句b;
}
如果表达式结果为真,则执行语句a,反之执行语句b。
5、switch…case语句:
switch(i)
{case a:语句1;break;
case b:语句2;break;
case c:语句3;break;
defluat:语句4;break;
}
如果i等于a,则执行语句1,等于b时,执行语句2,如果没有与i对应的case语句,就执行default语句。
6、while循环:
While(表达式)
{循环体;
}
While循环先判断表达式的结果真假,为真就执行循环体,直到条件表达式的结果为假时跳出循环。
7、do…while循环:
do
{循环体;
}while(表达式);
无条件先执行循环体,在进行表达式结果真假性判断。
8、for循环
for(表达式1;表达式2;表达式3)
{循环体;
}
先执行表达式1,只执行一次,再进行表达式2真假性判断,为真时执行循环体,接着执行表达式3,在对表达式2进行判断,当表达式2为假时跳出for循环。
9、goto语句:
//跳转标记:
//语句段;
//goto
//跳转标记;int c=0;
scanf("%d",&c);
aa:a=0;b=0;if(c>10)goto aa;
当执行到goto语句时,跳转到跳转标记处,开始执行跳转标记后的语句段。执行goto语句时无条件跳转,可跳出多层循环,这是break所不具备的。goto语句也可构成一个循环。
10、函数的参数
(1)实际参数(实参):
真实传给函数的参数,叫实参。实参可以是:常量、变量、表达式、函数等。无论实参是何种类型的量,在 进行函数调用时,它们都必须有确定的值,以便把这些值传送给形参。
(2)形式参数(形参):
形式参数是指函数名后括号中的变量,因为形式参数只有在函数被调用的过程中才实例化(分配内存单 元),所以叫形式参数。形式参数当函数调用完成之后就自动销毁了。
11、函数递归
(1)概念:
程序调用自身的编程技巧称为递归。
(2)递归的两个必要条件 :
存在限制条;每次递归调用之后越来越接近这个限制条件
12、数组
(1)一维数组
int arr[10];
数组是一组相同类型元素的集合。arr[10]数组从arr[0]开始到arr[9]共10个元素,没有arr[10]这个元素。数组是数组,不是指针,只是数组名具有指针的特性。
关于一维数组名的运用:
arr arr数组
arr+0 arr数组首元素
*arr arr数组首元素值
&arr arr数组的地址
&arr+1 下一个数组的地址(越界)
&arr[0] arr[0]的地址
&arr[0]+1 arr[1]的地址
(2)二维数组
int arr[3][4];
二维数组不要理解成3列4行的矩阵的样式,应该理解为有3组元素个数为4的一维数组的集合,例:
arr[3][4]={{0,1,2,3};{4,5,6,7};{8,9,10,11}
};
关于二维数组名的运用:
arr[0][0] arr数组首元素的值
arr[0] arr数组中第一个一维数组
arr[0]+1 arr数组中第二个一维数组
*(arr[0]+1) arr数组中第一个一维数组第二个元素的值
&arr[0]+1 arr数组中第二个一维数组的地址
(3)数组作为参数传参时传的是数组首元素的地址。
13、指针
指针是一个变量,存放着某一指定的变量单元的地址。例:
int a=10;
int *p=&a;
定义一个整形变量a,并初始化为10,在定义一个指向整形变量a的指针变量p,用于存放a的地址。因为存放着a的地址,故而可以通过指针p来访问a,对其解引用操作: printf(“%d”,*p);输出结果为10,。也可通过指针p来修改a的值,如:*p=12;printf(“%d”,a);输出结果为12。
指针的大小在32位平台的大小为4个字节,与其指向的数据类型无关。
指针的运算一般与数组相结合,指针加1表示指针向后移动其指向数据类型大小个字节。p+1就表示指针p向后移动4个字节。
14、结构体
Struct A
{int a;int b[10];char *arr;
};
结构体是一些变量的集合,可以是单个的变量,数组,指针,也可以是结构体,结构体传参一般传结构体的地址,效率是最高的。
(1)结构体内存对齐:
**
原因:
不是所有的硬件平台都能访问任意地址上的任意数据的;某些硬件平台只能在某些地址 处取某些特定类型的数据,否则抛出硬件异常。
数据结构(尤其是栈)应该尽可能地在自然边界上对齐。
原因在于,为了访问未对齐的内存,处理 器需要作两次内存访问;而对齐的内存访问仅需要一次访问。
规则:
第一个成员在与结构体变量偏移量为0的地址处。
其他成员变量要对齐到某个数字(对齐数)的整数倍的地址处。对齐数 = 编译器默认的一个对齐数 与 该成员大小的较小值。 VS中默认的值为8
结构体总大小为最大对齐数(每个成员变量都有一个对齐数)的整数倍。
如果嵌套了结构体的情况,嵌套的结构体对齐到自己的最大对齐数的整数倍处,结构体的整体大小就是
所有最大对齐数(含嵌套结构体的对齐数)的整数倍
(2)结构体数组
Struct A a[10];
定义一个结构体数组a[10],该数组每个元素都代表一个结构体变量,共10个元素。
15、枚举
enum Day
{ Mon,Tues,Wed, Thur, Fri, Sat, Sun
}
定义一个枚举类型Day,其内容为所有取值可能,也叫枚举常量,如果没有对枚举常量赋值,则第一个枚举常量的值默认为0,后面依次加1。
16、动态内存你分配
(1)void malloc (size_t size);*
这个函数向内存申请一块连续可用的空间,并返回指向这块空间的指针。如果开辟成功,则返回一个指向开辟好空间的指针。 如果开辟失败,则返回一个NULL指针,因此malloc的返回值一定要做检查。 返回值的类型是 void* ,所以malloc函数并不知道开辟空间的类型,具体在使用的时候使用者自己来决定。
如果参数 size 为0,malloc的行为是标准是未定义的,取决于编译器。
(2) void calloc (size_t num, size_t size);*
该函数的功能是为 num 个大小为 size
的元素开辟一块空间,并且把空间的每个字节初始化为0。 与函数
malloc 的区别只在于 calloc 会在返回地址之前把申请的空间的每个字节初始化为全0
(3)void realloc (void ptr, size_t size);**
ptr 是要调整的内存地址 size 调整之后新大小 返回值为调整之后的内存起始位置。
这个函数调整原内存空间大小的基础上,还会将原来内存中的数据移动到 新 的空间。
(4)void free (void ptr);*
free函数用来释放动态开辟的内存。 如果参数 ptr 指向的空间不是动态开辟的,那free函数的行为是未定义的。 如果参数 ptr 是NULL指针,则函数什么事都不做。
17、文件
(1)文件指针
缓冲文件系统中,关键的概念是“文件类型指针”,简称“文件指针”。
每个被使用的文件都在内存中开辟了一个相应的文件信息区,用来存放文件的相关信息(如文件的名字,文件状态
及文件当前的位置等)。这些信息是保存在一个结构体变量中的。该结构体类型是有系统声明的,取名FILE.
(2)打开、关闭一个文件
//打开文件
FILE* fopen ( const char * filename, const char * mode );
//关闭文件
int fclose ( FILE * stream );
(3)文件打开方式
“r” 只读
“w” 只写
“a” 向文本文件尾添加数据
“rb” 二进制形式读文件(只)
“wb” 二进制形式写文件
“ab” 向一个二进制文件尾添加数据
“r+” 为了读和写,打开一个文本文件
“w+” 为了读和写,建议一个新的文件
“a+” 在文件尾进行读写
“rb+” 为了读和写打开一个二进制文件
“wb+” 新建一个新的二进制文件读和写
“ab+” 打开一个二进制文件,在文件尾进行读和写
(4)sprintf(buf,”%d”,a);
把变量a以十进制的形式打印给字符型数组buf。
Sscanf(buf,“%c”,&a);
从字符型数组中获取一个字符并赋给a。
fprintf(fp,”%d”,a);
fp是指向一个文件的文件指针,该函数是将a以十进制形式写入fp指向的文件中。
fscanf(fp,”%d”,&a);
fp是一个指向文件的指针,该函数是从fp指向的文件中以十进制形式读取数据并赋给a。
二、数据结构
1、单链表
概念:
链表是一种物理存储结构上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链
接次序实现的。
Typedef struct List
{Int data;struct List *next;
}ListNode;
插入一个节点:
ListNode *tem=(ListNode*)malloc(sizeof(ListNode));
tem->data=data;
tem->next=head->next;
head->next=tem;
删除一个节点:
ListNode *tem=head;
for(;tem->next!=NULL;tem=tem->next)
{if(tem->data==data){tem->next=tem->next->next;break;
}
}
删除链表头:
ListNode *tem=(*head)->next;
Free(*head);
*head=tem;
2、栈
概念:
一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端
称为栈顶,另一端称为栈底。遵循先入后出的规则。
3、队列
概念:
只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表,队列具有先进先出入队列:进行插入操作的一端称为队尾
出队列:进行删除操作的一端称为队头。
4、二叉树
概念 :
一棵二叉树是结点的一个有限集合,该集合或者为空,或者是由一个根节点加上两棵别称为左子树和右子树
的二叉树组成。
二叉树的特点:
- 每个结点最多有两棵子树,即二叉树不存在度大于2的结点。
- 二叉树的子树有左右之分,其子树的次序不能颠倒。