C语言思维导图
暑假期间总结的,内容都比较基础,可用作基础复习!文章最下方有思维导图PDF版本下载链接!
再长的路,一步步也能走完,再短的路,不迈开双脚也无法到达。
01C语言数据类型
基本类型
-
数值类型
-
整型
-
短整型short
- 至少占16位,2个byte
-
整型int
- 不小于16位,4个byte
-
长整型long
- 至少占32位,4个byte
-
长长整形long long
- 至少占64位,8个byte
-
-
实浮点型
-
单精度型float
- 精确表示至少6位有效数字
-
双精度型double
- 能表示10位有效数字和更大的指数,8个byte
-
long double
- 存储浮点数的范围比double更大,能表示比double更多的有效数和更大的指数
-
-
布尔类型Bool
- ture-1
- false-0
-
无符号整型(智能表示零和正整数)
- unsigned int类型
- unsigned long类型
- unsigned short类型
-
-
字符类型char
- 表示一个字符要占用一个字节内存,1个byte
-
复数和虚数浮点数
-
复数
- float _Complex
- double _Complex
- long double _Complex
-
实数
- float _Imaginary
- double _Imaginary
- long double _Imaginary
-
构造类型
- 数组
- 结构体struct
- 共用体union
- 枚举类型enum
指针类型
空类型 void
02字符串和格式化输入/输出函数
sizeof函数
- sizeof(…)是运算符,在头文件中typedef为unsigned int,其值在编译时即计算好了,参数可以是数组、指针、类型、对象、函数等。
它的功能是:获得保证能容纳实现所建立的最大对象的字节大小。
strlen函数
- strlen(…)是函数,要在运行时才能计算。参数必须是字符型指针(char*)。当数组名作为参数传入时,实际上数组就退化成指针了。
它的功能是:返回字符串的长度。该字符串可能是自己定义的,也可能是内存中随机的,该函数实际完成的功能是从代表该字符串的第一个地址开始遍历,直到遇到结束符NULL。返回的长度大小不包括NULL。
printf()函数
-
%a
- 浮点数、十六进制数字和p-记数法 (C99)
-
%A
- 浮点数、十六进制数字和P-记数法 (C99)
-
%c
- 一个字符
-
%d
- 有符号十进制整数
-
%e
浮点数、e-记数法
-
%E
- 浮点数、E-记数法
-
%f
- 浮点数,十进制记数法
-
%g
- 根据数值不同自动选择%f或者%e。%e格式在指数小于-4或者大于等于精度时使用
-
%G
- 根据数值不同自动选择%f或者%E。%E格式在指数小于-4或者大于等于精度时使用
-
%i
- 有符号十进制整数 (与%d相同)
-
%o
- 无符号八进制整数
-
%p
- 指针(就是指地址)
-
%s
- 字符串
-
%u
- 无符号十进制整数
-
%x
- 使用十六进制数字0f的无符号十六进制整数
-
%%
- 打印一个百分号
scanf()函数
-
%c
- 把输入解释成一个字符
-
%d
- 把输入解释成一个有符号十进制整数
-
%e,%f,%g, %a
- 把输入解释成一个浮点数 (%a是C99标准)
-
%E,%F,%G,%A
- 把输入解释成一个浮点数 (%A是C99标准)
-
%i
- 把输入解释成一个有符号十进制整数
-
%o
- 把输入解释成一个有符号八进制数
-
%p
- 把输入解释成一个指针(地址)
-
%s
- 把输入解释成一个字符串;输入的内容以一个非空白字符作为开始,并且包含知道下一个空白字符的全部字符
-
%u
- 把输入解释成一个无符号十进制整数
-
%x,%X
- 把输入解释成一个有符号十六进制整数
03运算符
算数运算符
-
- 将其左侧的值与右侧的值相加
-
-
将其左侧的值减去右侧的值
-
-
-
作为一元运算符,改变其右侧值的符号
-
-
- 将其左侧的值乘以右侧的值
-
/
- 将其左侧的值除以右侧的值,如果两数都是整数,计算结果将被截断
-
%
- 将其左侧的值除以右侧的值时,取其余数(只能应用于整数)
-
++
-
a++
- 后缀模式,使用a的值之后,递增a
-
++a
- 前缀模式,使用a的值之前,递增a
-
- a--
- 后缀模式,使用a的值之后,递减a
- --a
- 前缀模式,使用a的值之前,递减a
其他运算符
-
sizeof()
- 获得其右侧运算对象的大小(以字节为单位),运算对象可以是一个被圆括号括起来的类型说明符,如sizeof(float)
-
(类型名)
- 强制类型转换运算符将其右侧的值转换成圆括号中指定的类型,如(float)9把整数9转换成浮点数9.0
关系运算符
-
<
- 小于
-
<=
- 小于或等于
-
==
- 等于
-
=
- 大于或等于
-
- 大于
-
!=
- 不等于
赋值运算符
-
+=
- 把右侧的值加到左侧的变量上
-
-=
- 从左侧的变量中减去右侧的值
-
*=
- 把左侧的变量乘以右侧的值
-
/=
- 把左侧的变量除以右侧的值
-
%=
- 左侧变量除以右侧值得到的余数
-
=
- 将其右侧的值赋给左侧的变量
逗号运算符
- 逗号运算符是指在C语言中,多个表达式可以用逗号分开,其中用逗号分开的表达式的值分别结算,但整个表达式的值是最后一个表达式的值。
条件运算符 ? :
-
expression1?expression2:expression3
- 如果expression1为真(非0),那么整个条件表达式的值与expression2的值相同;如果expression1为假(0),那么整个条件表达式的值与expression3的值相同
逻辑运算符
-
&&
- 与
-
||
- 或
-
!
- 非
-
^
- 异或
移位运算符
- 左移:<<
- 右移:>>
- 左移赋值:<<=
- 右移赋值:>>=
04C控制语句
循环
-
while循环
- while(expression)
statement
statement部分可以是以分号结尾的简单语句,也可以是花括号括起来的复合语句。
- while(expression)
-
for语句
- for( initialize ; test ; update )
statement
在test为假或0之前,重复执行statement部分
- for( initialize ; test ; update )
-
do while语句
- do
statement
while(expression)
do while循环在执行完循环后才执行测试条件,所以至少只执行循环体一次;而for循环或while循环都是在执行循环体之前先执行测试条件
- do
分支和跳转
-
if语句
- if(expression)
statement
如果对expression求值为真(非0),则执行statement;否则跳过statement.
- if(expression)
-
if else语句
- if(expression)
statement1
else
statement2
如果对expression求值为真(非0),则执行statement1;如果对expression求值为假(0),则执行statement2;
- if(expression)
-
多重选择else if语句
-
switch语句
- switch(表达式){
case 取值1: 执行语句; break;
case 取值2: 执行语句; break;
……
default: 执行语句; break;
}
- switch(表达式){
-
goto语句
- goto part2;
part2: printf();
无条件转移语句
- goto part2;
循环辅助
-
continue
- continue是结束本次循环,进行下次循环,使用continue还要继续进行循环
-
break
- 结束当前循环,使用break就已经不再循环了.
在switch case里,只能用break,而不能用continue
- 结束当前循环,使用break就已经不再循环了.
05函数
无参函数的定义
- 如果函数不接收用户传递的数据,那么定义时可以不带参数。
dataType functionName(){
//body
}
dataType 是返回值类型,它可以是C语言中的任意数据类型,例如 int、float、char 等。
functionName 是函数名,它是标识符的一种,命名规则和标识符相同。函数名后面的括号( )不能少。
body 是函数体,它是函数需要执行的代码,是函数的主体部分。即使只有一个语句,函数体也要由{ }包围。
如果有返回值,在函数体中使用 return 语句返回。return 出来的数据的类型要和 dataType 一样。
有参函数的定义
- 如果函数需要接收用户传递的数据,那么定义时就要带上参数。
dataType functionName( dataType1 param1, dataType2 param2 … ){
//body
}
dataType1 param1, dataType2 param2 …是参数列表。函数可以只有一个参数,也可以有多个,多个参数之间由,分隔。参数本质上也是变量,定义时要指明类型和名称。与无参函数的定义相比,有参函数的定义仅仅是多了一个参数列表。
实参和形参
- 函数定义时给出的参数称为形式参数,简称形参;函数调用时给出的参数(也就是传递的数据)称为实际参数,简称实参。函数调用时,将实参的值传递给形参,相当于一次赋值操作。
函数递归
-
定义
- 一个函数在它的函数体内直接或间接地调用自身称为函数的递归调用,而这种函数被称为递归函数。
直接调用:是指函数直接调用自己。
间接调用:是指函数在递归函数调用的下层再调用自己。
例:直接调用,Function1()->调用Function1()
间接调用,Function1()->调用Function2()->Function2()->调用Function1()
- 一个函数在它的函数体内直接或间接地调用自身称为函数的递归调用,而这种函数被称为递归函数。
-
优点
- 为某些编程问题提供了最简单的解决方案
-
缺点
- 一些递归算法会快速消耗计算机的内存资源
06数组
同一数组中存储的数必须满足以下两个条件
-
- 这些数的类型必须相同。
- 这些数在内存中必须是连续存储的。
一维数组
-
定义方式
- 类型说明符 数组名[常量表达式];
例如:int a[5];
int 型变量占 4 字节的内存空间,那么 5 个int型变量就占 20 字节的内存空间,而且它们的地址是连续分配的。数组中的下标是从 0 开始的(而不是 1)。
- 类型说明符 数组名[常量表达式];
-
初始化方式
-
完全初始化
-
定义数组时给所有元素赋初值
- int a[5] = {1, 2, 3, 4, 5};
-
-
不完全初始化
-
可以只给一部分元素赋值
- int a[5] = {1, 2};不完全初始化时,没有被初始化的元素自动为 0
-
-
不指定数组的长度
-
如果定义数组时就给数组中所有元素赋初值,那么就可以不指定数组的长度,因为此时元素的个数已经确定了。
- int a[] = {1, 2, 3, 4, 5};
-
-
-
数组元素引用
-
数组必须先定义,然后使用。C 语言规定,只能逐个引用数组元素,而不能一次引用整个数组。
- 数组名[下标]
-
二维数组
-
定义方式
- dataType arrayName[length1][length2];其中,dataType 为数据类型,arrayName 为数组名,length1 为第一维下标的长度,length2 为第二维下标的长度。
-
存储方式
-
二维数组在概念上是二维的,但在内存中是连续存放的;换句话说,二维数组的各个元素是相互挨着的,彼此之间没有缝隙。
- 如何在线性内存中存放二维数组呢?有两种方式:
一种是按行排列, 即放完一行之后再放入第二行;
另一种是按列排列, 即放完一列之后再放入第二列。
- 如何在线性内存中存放二维数组呢?有两种方式:
-
-
二维数组初始化
-
按行分段赋值
- int a[5][3]={ {80,75,92}, {61,65,71}, {59,63,70}, {85,87,90}, {76,77,85} };
-
按行连续赋值
- int a[5][3]={80, 75, 92, 61, 65, 71, 59, 63, 70, 85, 87, 90, 76, 77, 85};
-
07结构体
定义
-
将不同类型的数据存放在一起,作为一个整体进行处理。
- struct 结构名
{
类型 变量名;
类型 变量名;
…
} 结构变量;
结构名是结构的标识符不是变量名。
- struct 结构名
结构体定义初始化三种方式
-
最标准的方式(推荐)
- struct student //结构体类型的说明与定义分开。 声明
{
int age; /年龄/
float score; /分数/
char sex; /性别/
};
struct student a={ 20,79,‘f’}; //定义
- struct student //结构体类型的说明与定义分开。 声明
-
不环保的方式
- struct student /声明时直接定义/
{
int age; /年龄/
float score; /分数/
char sex; /性别/
/这种方式不环保,只能用一次/
} a={21,80,‘n’};
- struct student /声明时直接定义/
-
最奈何人的方式
- struct //直接定义结构体变量,没有结构体类型名。 这种方式最烂
{
int age;
float score;
char sex;
} t={21,79,‘f’};
- struct //直接定义结构体变量,没有结构体类型名。 这种方式最烂
结构体数组
-
结构体数组
- struct book library[MAXBKS];
把library声明为一个内含MAXBKS个元素的数组。数组的每个元素都是一个book类型的数组。因此,library[0]是第1个book类型的结构体变量,library[1]是第2个book类型的结构体变量。
- struct book library[MAXBKS];
结构体指针
08联合(共用体)
定义union
-
共用体有时也被称为联合或者联合体,这也是 Union 这个单词的本意。
- 定义格式为:
union 共用体名{
成员列表
};
- 定义格式为:
初始化
-
union Data {
int i;
char str[4];
} data;- 这段代码定义了一个名为data的union变量。它有什么属性呢?
- 这个变量在内存中占用4个字节的空间而不是8个;
- 有两个数据成员:int类型变量的i和char类型的数组str;
- 虽然有两个数据成员,但是这两个成员的存储空间是一样的
09枚举
定义
- 可以用枚举类型(enum)声明符号名称来表示整形常量。使用enum关键字,可以创建一个新"类型"并指定它可具有的值(实际上,enum常量是int类型,因此只要能使用int类型的地方就可以使用枚举类型)。枚举类型的目的是提高程序的可读性。
定义形式
-
枚举类型的定义形式为
-
enum typeName{ valueName1, valueName2, valueName3, … };
- enum是一个新的关键字,专门用来定义枚举类型,这也是它在C语言中的唯一用途;typeName是枚举类型的名字;valueName1, valueName2, valueName3, …是每个值对应的名字的列表。注意最后的;不能少。
-
举例
-
列出一个星期有几天:
- enum week{ Mon, Tues, Wed, Thurs, Fri, Sat, Sun };
可以看到,我们仅仅给出了名字,却没有给出名字对应的值,这是因为枚举值默认从 0 开始,往后逐个加 1(递增);也就是说,week 中的 Mon、Tues … Sun 对应的值分别为 0、1 … 6。
- enum week{ Mon, Tues, Wed, Thurs, Fri, Sat, Sun };
-
给每个名字都指定一个值
- enum week{ Mon = 1, Tues = 2, Wed = 3, Thurs = 4, Fri = 5, Sat = 6, Sun = 7 };
10指针
定义
- 指针是一种保存变量地址的变量。
指针运算符
-
地址运算符-&
-
后跟一个变量名,&给出该变量的地址
- 一元&运算符给出变量的存储地址。如果pooh式变量名,那么&pooh是变量的地址。可以把地址看作是变量在内存中的位置。
-
-
间接运算符-*
-
后跟一个指针名或地址时,*给出存储在指针指向地址上的值
- 假设已知ptr指向bah,如下所示:
ptr = &bah;
然后使用间接运算符*找出存储在bah中的值,该运算符有时也称为解引用运算符。
val=*ptr;//找出ptr指向的值
语句ptr=&bah;和val=*ptr;放在一起相当于下面的语句
val=bah
- 假设已知ptr指向bah,如下所示:
-
声明一个指针
- int *p; // 声明一个 int 类型的指针 p
char *p // 声明一个 char 类型的指针 p
int *arr[10] // 声明一个指针数组,该数组有10个元素,其中每个元素都是一个指向 int 类型对象的指针
int (*arr)[10] // 声明一个数组指针,该指针指向一个 int 类型的一维数组
int **p; // 声明一个指针 p ,该指针指向一个 int 类型的指针
指针与数组
-
指针数组
-
指针数组是一个数组,数组中的每一个元素都是指针。
- int *p[10]; // 声明一个指针数组,该数组有10个元素,其中每个元素都是一个指向int类型的指针
-
-
数组指针
-
数组指针是一个指针,它指向一个数组。
- int (*p)[10]; // 声明一个数组指针 p ,该指针指向一个数组
-
指针与结构体
指针与函数
-
函数指针
-
int * fun(int,int);
- 指针函数是返回指针的函数主题是函数,返回值是一个指针
-
-
指针函数
-
int (*fun)(int);
- 函数指针是指向函数的指针 主体是指针 指向的是一个函数的地址。
-
11存储类别
作用域-描述程序中可访问标识符的区域
-
块作用域
- 块是用一对花括号括起来的代码区域。虽然函数的形式参数声明在函数的左花括号,但是它们也具有块作用域,属于函数体这个块。
-
函数作用域
- 仅用于goto语句的标签。这意味着即使一个标签首次出现在函数的内层块中,它的作用域也延伸至整个函数。
-
函数原型作用或文件作用域
- 用于函数原型中的形参名(变量名),范围是从形参定义处到原型声明结束。
链接
-
外部链接
- “内部链接的文件作用域”简称为“文件作用域”
-
内部链接
- “外部链接的文件作用域”简称为“全局作用域”
-
无链接
- 具有块作用域、函数作用域或函数原型作用域的变量
存储器-描述了通过这些标识符访问的对象的生存期
- 静态存储器
- 线程存储器
- 自动存储期
- 动态分配存储期
自动变量
- 属于自动存储类别的变量具有自动存储期、块作用域且无链接
寄存器变量
-
块作用域的静态变量
- 静态变量-静态的意思是该变量在内存中原地不动,并不是说它的值不变,具有文件作用域的变量自动具有静态存储器。这种变量具有块作用域、无连接,但是具有静态存储期。
-
外部链接的静态变量
- 外部链接的静态变量具有文件作用域、外部链接和静态存储器。该类别有时称为外部存储类别,属于该类别的变量称为外部变量。可用关键字extren.
存储类别说明符
- auto
- register
- static
- extern
- _Thread_local
- typedef
百度网盘链接:
链接:https://pan.baidu.com/s/1f7g96RiZ-iO2-yr0Vv-6Eg
提取码:tjbh
(需要请自取)