导图社区 c技能树
c技能树思维导图,分六天完成,c语言是结构化的语言,c语言是模块化的语言,c语言运算符丰富,代码效率高,一起来看每日分工吧。
编辑于2023-07-22 22:52:47 湖南c技能树
day1
c语言的特点
c语言是结构化的语言
可使程序层次清晰
c语言是模块化的语言
放在函数库中供其他函数调用,大大减少重复编程
程序可移植性好
c语言运算符丰富,代码效率高
c语言的历史
1983年,美国国家标准协会(ANSI)根据c语言问世以来各种版本对c的发展和扩充制定了新的标准,并于1989年颁布,被称为 ANSI C 或 C89
gcc的编译流程
1.预处理阶段
gcc -E 1.c -o 1.i gcc -E -o 1.i 1.c
选项“-E”可以使编译器在预处理结束时就停止编译
2.编译阶段
gcc -S 1.i -o 1.s gcc -S -o 1.s 1.i
选项“-S”可以使编译器在进行完编译之后时就停止
3.汇编阶段
gcc -c 1.s -o 1.o gcc -c -o 1.o 1.s
4.链接阶段
gcc 1.o -o a.out
链接静态库时:将.o文件与我们的引用库连接到可执行程序
(占用资源,无法更新)
链接共享库时:推迟到了运行阶段,一对多,增量更新
(运行可能失败)
标识符与关键字
标识符:字母,数字,下划线的有限长序列
(必须以大小写字母,下划线开头)
关键字:在c语言中预先定义好的标识符
(不能作常量名,变量名或其它标识符名称)
变量定义的基本形式
【限定符】数据类型 变量名 ;
函数基础
函数就是一个能完成特定功能的代码模块,其程序代码独立,可以给函数传递参数,也可以得到返回值
面向对象
倾向于思考
面向过程
倾向于实践
把一个规模较大的问题划分成若干个子问题,对每个子问题编写一个函数来解决问题
库函数:分为静态库和共享库,静态库的代码在编译时就已链接到开发人员开发的应用程序中,而共享库是在程序开始运行时被加载
静态库的后缀名为“.a”
共享库的后缀名由“.so”和版本号组成
day2
常量与变量
变量三要素:变量名+值+数据类型
定义:给变量分配内存,为变量赋初值
声明:用来告诉编译器变量的名称和类型,而不分配内存,不赋初值
(变量的声明和定义不分家,函数相反)
局部变量和全局变量
局部变量:
局部数据的初始值都是随机的
该类型变量的内存空间待模块结束后释放
作用在模块内
模块以左花括号开始,以右花括号结束
全局变量:
定义的本文件有效,本程序(项目)内任何文件有效,需extern引用*(外部声明)
作用域为源文件
存储模型
由作用域,存储期和链接组成
生存期和作用域是从时间和空间这两个不同的角度来描述变量的特性,这两者既有联系,又有区别一个变量的存储方式究竟属于哪一种存储方式,并不能仅仅从作用域来判断,还应有明确的存储模型说明
存储类别
自动变量(auto)
静态变量(static)
外部变量(extern)
寄存器(register)
c变量作用域
代码块作用域(block scope)
函数原型作用域(function prototype scope)
文件作用域(file scope)
内存管理
代码区
存放函数体的二进制代码,是只读的
数据段区
整个程序运行期间都不释放
栈区
释放和分配都是自动进行
堆区
程序员手动分配
指针地址与数组
指针地址
&:取变量的地址
每一个字节单元,都有一个编号,称为地址,只要是被定义了的变量就一定有地址
*:取地址空间对应的值
*号跟着变量名才是指针
指针的步长取决于这个指针的类型
例如sizeof(int)
指针变量:
这个变量的值是内存地址
指针常量:
事实上,在c语言中,指针常量只有唯一的一个NULL(空地址)
字符串常量:在c语言中,字符串常量在内存中存储时系统自动在字符串的末尾加一个“串结束标志”,
当一个字符串常量出现在一个表达式中时,表达式所引用的值是存储该字符串常量的内存首地址,而不是这些字符本身
用户可以把字符串常量赋值给一个字符类型的指针,用于指向该字符串在内存中的首地址
即ASCII码值为0的字符NULL,通常用“\0“表示
(c语言没有字符串的概念,以字符数组的形式实现字符串功能,以字符的ASCII值存储在内存,在c99标准,把字符类型归纳为整形类型的一种)
数组
注意:数组在创建的时候,如果想不到指定数组的确定的大小就得初始化,数组的元素个数根据初始化的内容来确定
arr不能++,是因为arr的类型相当于const int *,是个只读变量,类似常量,所以不能修改
day3
运算符和表达式
自增自减运算符
A++ 变量是A 表达式是A+1
++A 变量是A+1 表达式是A+1
(我的理解:A++是先赋值再运算,++A是先运算再赋值)
关系运算符
“==”为关系运算符,判断两个数值是否相等
“=”为赋值运算符
数据的输入
格式化输入函数scanf
从左往右逐个扫描
格式化字符串包含三种对象:
字符常量
格式控制符
转义字符
字符输入函数getchar
ch=getchar()把从输入读到的字符的ASCII值返回给ch
day4
IO原理
格式化输入
分隔符(space、tab、回车)
阻塞条件(input流无数据)
停止阻塞条件(扫描到非分隔符的回车了)
开始扫描条件(input流里面有数据)
停止扫描条件(“匹配上格式化字符串,输入流指向下一个格式化对象”和“不匹配格式化字符串”)
注意(对分隔符敏感,连续的分隔符视为一个)
1.键盘缓冲区
PC里接受键盘输入的一块内存区
2.C程序输入缓冲区
键盘缓冲区的数据会被映射到这里
会选择性的抛弃一些'脏'数据(多个空格,连续的分隔符视为—个)
3.C程序输入流(input流)
(我的理解:对应格式输入对应数据,分隔符最好是用“,”)
c语言控制语句
逻辑假---------0
逻辑真---------1
逻辑运算符与表达式:&&——有一个为逻辑假,表达式值为逻辑假;||——有一个为逻辑真,表达式值为逻辑真;
(参与运算左右值可以是表达式)
条件判断语句:
1.if语句
if(表达式){语句}
if(表达式){语句1 else 语句2}
if(表达式1){语句1} else if(表达式1){语句1} else if(表达式2){语句2}......else if(表达式m){语句m} else {语句n}
if(表达式){ if(表达式){语句1 else 语句2} (else) if(表达式){语句3 else 语句4} }
(嵌套使用)
2.switch语句
switch(表达式)case常量表达式1:语句序列1;case常量表达式2:语句序列2;......case常量表达式n:语句序列n;default:语句n+1;
(若想要跳出语句,在对应的语句后加”break;“即可)
循环语句:
1.while循环(可以嵌套)
while(条件表达式){语句}
2.for循环(可以嵌套)
for(表达式l;表达式2;表达式3){语句}
3.do while循环
do{语句}while(条件表达式)
day5
函数
函数名称是一个标识符,要求符合标识符的命名规则
函数的参数
1)形式参数:形式参数说明就是形式参数的列表,简称形参,形参可以是任意类型的变量人参数之间用号分隔。在进行函数调用时,调用函数将赋予这些形式参数实际的值(定义,声明时)
2)实际参数: 需要确切的数据,也可以是具有确定值的表达式。实参就是在使用函数时,调用函数传递给被调用函数的数据,完成所要求的任务(调用时)
函数的形参和实参具有以下特点:
1)形参变量只有在被调用时才分配内存单元,在调用结束时,即刻释放所分配的内存单元。因此,形参只有在函数内部有效。调用结束返回主调函数后则不能再使用该形参变量。
2)实参可以是常量、变量、表达式、函数等,无论实参是何种类型的量,在进行函数调用时,它们都必须具有确定的值,以便把这些值传送给形参。因此应先用赋值、输入等办法使实参获得确定值。
3)实参和形参在数量上、类型上、顺序上应严格一致,否则会发生“类型不匹配”的错误。
函数的传递:
1)值传递方式(传递一个副本)
2)地址传递方式(传递一个指针)
指针函数:是一个函数
在实现一个指针函数时,读者应该特别注意,指针函数返回的地址,在主调函数中,必须是有效的,是可以访问的内存。在上面程序中,str是函数内部的局部数组,局部变量分配在堆栈中,当函数执行完后,局部变量自动释放,在主调函数中,不能再访问,因此会有警告。
访问一段释放的内存,是非法操作,显示的是乱码,若修改非法内存中的值,程序的后果可能更严重,是不可预料的。(与内存管理有关)
函数指针:是一个指针
函数指针是专门用来存放函数地址的指针。函数地址是一个函数的入口地址,函数名代表了函数的入口地址。
当一个函数指针指向了一个函数,就可以通过这个指针来调用该函数,可以将函数作为参数传递给函数指针。
(&*在一起会发生湮灭)
回调函数:是一个函数
函数指针作为某个函数的参数
函数指针变量可以作为某个函数的参数来使用的,回调函数就是一个通过函数指针调用的函数。
(简单讲:回调函数是由别人的函数执行时调用你实现的函数。)
day6
二维数组
数组名:第一行元素的地址
&数组名:整个二维数组的地址
占用空间:数组中所有元素的地址都是连续的
所占内存=元素占内存* M (行) *N (列)
一般形式
类型说明符数组名[常量表达式1] [常量表达式2]
Int arr[M][N];
M:理解为行数,代表几组一维数组
N:理解为列数,每个一维数组内有多少个元素
访问方式:
1)下标访问法: arr[0][0] > 代表arr二维数组中的第一个一维数组内的第一个元素
2)指针访问方式:
(*(arr+i)+j)
arr+i :代表第i个一维数组的首地址
*(arr+i):代表获取第i个一维数组的首元素的值,
*(arr+i)+j:代表在第i个-维数组的首地址上偏移j个地址
* (*(arr+i)+j) :第i个一维数组里的第j个元素的值
注意:任何数组在内存中都是占用一段连续的空间
getchar()函数对回车敏感,可以用来清空缓冲区