🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥🔥
前言
在计算机考研中,C语言的重要性不可小觑。作为一种基础且强大的编程语言,C语言不仅是许多高校计算机专业本科生必修的课程之一,也是研究生入学考试中的重点考察内容。掌握C语言能够帮助考生深入理解程序设计的基本概念和原理,比如数据类型、控制结构、函数、指针等,并能培养良好的编程习惯与问题解决能力。此外,C语言还是学习操作系统、编译原理等高级课程的基础,这些课程的知识点往往会在研究生入学考试中出现。因此,具备扎实的C语言功底不>仅有助于提高考研成绩,也为将来从事计算机科学研究或工程实践打下坚实的基础。
第一章-初识C语言
什么是C语言
- 简介
C语言是一种较早的程序设计语言,诞生于1972年的贝尔实验室。1972 年,Dennis Ritchie 设计了C语言,它继承了B语言的许多思想,并加入了数据类型的概念及其他特性。 尽管C 语言是与 UNIX 操作系统一起被开发出来的,但它不只支持UNIX。
C是一种通用(广泛可用)的编程语言。
广泛应用于底层开发。C语言能以简易的方式编译、处理低级存储器。C语言是仅产生少量的机器语言以及不需要任何运行环境支持便能运行的高效率程序设计语言。尽管C语言提供了许多低级处理的功能,但仍然保持着跨平台的特性,以一个标准规格写出的C语言程序可在包括类似嵌入式处理器以及超级计算机等作业平台的许多计算机平台上进行编译。
- 计算机语言的发展
过程:低级>>>高级
二进制指令(10010)>>>汇编指令(助记符)>>>B语言>>>C语言(高级语言)
-
C语言的国际标准
- ANSI C
- C89
- C99
- C11
-
C语言编译器
- Clang
- GCC
- WIN-TC
- MSVC
- Turbo C
Hello World
+ 环境准备
编译器:Microsoft Visual Studio Community 2022 (64 位) - Current
版本 :17.11.1
编译程序快捷键:F5
数据类型
+ 前置扩展知识
计算机中的单位:bit(比特)>>byte(字节)>>KB(千字节)>>MB(兆字节)>>GB(千兆字节)>>TB(太字节)…
换算关系:
1 字节(byte) = 8 位(bits)
1 千字节(KB) = 1024 字节(bytes)
1 兆字节(MB) = 1024 千字节(KB)
1 千兆字节(GB) = 1024 兆字节(MB)
1 太字节(TB) = 1024 千兆字节(GB)
- sizeof()函数
变量、常量
变量:定义的值在程序中会发生变化的。如人的体重,薪资等。
常量:定义的值在程序中不会发生变化的。如人的身份证号、血型等。
建议:在定义变量时,都给变量进行初始化,因为如果定义了变量后没有给变量进行初始化,系统将会随机给变量赋一个随机值,这个随机值可能会影响到程序运行结果。
- 变量
变量又分为局部变量和全局变量
局部变量:在大括号{}的内部定义的变量
全局变量:在大括号{}的外部定义的变量
注意点:定义变量时,在同一范围内不能多次定义相同变量名的变量
- scanf()函数
- _CRT_SECURE_NO_WARNINGS 快速添加方式
1、在VsCode软件中,创建后缀为点C的文件,其中都是复制一个名为newc++file.cpp文件的来的。所以只要将需要的格式预处理警告格式写入在该文件中,下次在创建C语言文件时,VsCode就会自动生成。
2、文件添加内容为:#define _CRT_SECURE_NO_WARNINGS
3、注意:如果在添加完成后,保存存在权限问题,可以将该文件复制到某处,添加内容后,在将文件替换即解决。
变量的作用域和生命周期
+ 作用域
作用域(scope)时程序设计概念。一般来说,一段程序代码中所用到的名字并不总是有效/可用的,而限制这个名字的可用性的代码范围就是这个名字的作用域范围。
局部变量的作用域范围:时变量所在的局部范围
全局变量的作用域时整个工程
- 生命周期
变量的生命周期是指:变量的创建到变量的销毁之间的一个时间段
局部变量的生命周期:进入作用域生命周期开始,出作用域生命周期结束
全局变量的生命周期:整个程序的生命周期
常量
> C语言中的常量可分为: > > 字面常量 > > const修饰的常变量 > > #define定义的标识符变量 > > 枚举常量 >
- 枚举常量
- 字面常量
- const修饰的常变量
- #define定义的标识符变量
字符串
由双引号引起来的一串字符串称为字符串字面值,简称字符串。
注意:字符串的结束标志是一个0的转义字符,在计算字符串的时候0是结束标志,不算做字符串内容。
转义字符
- 打印占位符
- 例题
注释
单行注释格式:// 注释体
多行注释格式:/注释体/
操作符
算术操作符
减减乘除取余(只能是整数)
注意:整数除法结果为整数,浮点数除法结果为浮点数
移位操作符:
位操作符
& ^ |
赋值操作符
=
单目操作符(只有一个操作数的操作符)
! (0为false,非0为true)
- (负值)
++ (后置:,先使用在++;前置:先++,在使用)
–
(类型) 强转 如:int a = (int )3.11;
sizeof (变量占内存空间大小)
关系操作符
=
<=
!= 不等于
== 等于
=== 全等
逻辑操作符:
&& 逻辑与
|| 逻辑或
条件操作符(三目操作符):
expl? true:false
逗号表达式(从左向右以此计算):
,,(最后一个表达式结果,就是赋值)
常见关键字
![](https://www.bianchenghao6.com/uploads/202410/13/7843cc221123a02c.webp)
- typedef
简介:类型定义,理解为类型重命名
- static
作用:
修饰局部变量:static修饰局部变量时,变量不销毁
修饰全局变量::使用static修饰全局变量,全局变量不能被其他文件引用,(理解:作用域变小了)
修饰函数:被static修饰时,外部链接属性变为内部链接属性。
注意:函数本身具有外部链接属性
- register(寄存器)
寄存器集成在CPU上
扩展:
执行速度:寄存器》高速缓存》内存》硬盘
#define定义标识常量和宏
> 宏:有参数 >
指针
> 扩展: > > 内存:计算机中的程序都是在内存中运行的。 > > 内存会划分为一个个内存单元(一个单元是1字节),每个内存单元都有一个编号。 >
- 指针变量
- 指针变量的大小
指针变量的大小取决于电脑的位数:
32位:4字节
64位:8字节
结构体
> 结构体:定义多个类型的集合。 >
- ->符号
结构体指针变量->成员名
第二章-C语言初阶
什么是语句
C语言可以分为以下五类:
表达式语句
函数调用语句
控制语句
复合语句
空语句
扩展:
结构化分为:顺序结构、选择结构、循环结构
分支语句
if语句
格式:
if(表达式){
执行语句
}
注意:
if和else最近匹配。
- 练习:1到100的奇数
switch语句
格式:
switch(变量){
}
循环语句
break :退出循环
continue:跳出循环
while
格式:
while(表达式){
执行语句;
}
- getchar()
理解:通过键盘输入连续的字符,getchar()会一个一个字符读取,直到读取到回车结束。(通过循环实现)
循环结束条件:(ch = getchar()) != EOF
用于获取键盘输入的字符,
接收类型使用int
注意:
EOF为-1,可以结束键盘输入字符过程
- putchar()
打印键盘输出的字符
- 理解
for
语法:
for(变量;表达式;表达式){
执行语句;
}
- for循环的变形
do while
执行次数:至少执行一次
语法:
do
{
循环体;
}
while(表达式);
二分查找
字符替换练习
密码判断练习
GOTO语句
作用:主要用于跳出深层次循环体
语法:
标记:
语句;
goto 标记;
- 电脑关机案例
cmd:
60秒关机: shutdown -s -t 60取消关机:shutdown -a
函数
什么是函数
什么是函数:
由一个或多个语句块组成,它负责完成某项特定任务。
函数的分类:
库函数
自定义函数
语法:
返回类型 函数名(参数){
函数体;
return 返回值;
}
- 找最大值例子
函数调用
传值调用:形参为实参的真实值,对形参的修改不会影响实参
传址调佣:形参为实参的内存地址,形参可以直接修改实参的实际值
函数的嵌套调用和链式访问
嵌套调用
说明:一个函数中调用另一个函数:
实例语法:
int add1(int a ,int b){
return a+b;
}
int add2 (int a ,int b){
return add1(a,b); // 调佣调用add1函数,从而获取到a+b的和
}
链式访问
理解:把一个函数的返回值,作为另一个函数的参数
例如:
printf(“%d”,strlen(“333”)) ; // 求字符串的长度
函数的声明和定义
+ 声明
理解:
函数的声明一般出现在函数的使用之前, 要满足先声明后使用
场景:函数如果定义在main主函数之下的话,程序编译时会发出警告。
如果想要去掉警告,就可以提前声明函数。
例子:
int add(int num1,int num2);
int main(){
printf(“%d”.add(1,23));
return 0;
}
int add(int num1, int num2){
return num1+num2;
}
- 定义
函数定义:指函数的具体实现,交待函数的功能实现。
函数递归
程序调用自身的编程技巧
通解:函数自己调用自己
递归使用的必要条件:
存在限制条件,当满足这个限制条件的时候,暂停递归
每次递归之后越来越接近这个限制条件
- 例题1:接收一个整型值(无符号),按照顺序打印他的每一位。
- 例题2:编写不适用临时变量,求字符的长度
- 例题3:求n的阶乘法
- 例题4:求第n项的斐波那契数列
- 例题5:三个整数从小到大排序
- 例题6:求两个数的最大公约数
- 例题7:九九乘法表
函数练习
待完成
数组
> 简介:数组是一组相同类型元素的集合 >
- 数组的创建及初始化
例;
一维数组
+ 一维数组在内存中的存储
结论:数组在内存中是连续存放的。
二维数组
+ 二维数组的创建和初始化
注意点:在二维数组初始化时,可以省略行的个数,不能省略列的个数
选择排序
一维数组的数组名
数组名确实能表示首元素的地址
但是存在2个例外:
1 sizeof(数组名),这里的数组名表示整个数组,计算的是整个数组的大小,单位是字节
2 &数组名,这里的数组表示整个数组,取出来的是整个数组的地址。
扩展-数组传参:
数组作为参数将值传递给函数时,默认传递的是数组下标为0的内存地址。
- 例
二维数组的数组名
int arr [3][3] ;
arr表示: arr[0]的内存地址(想象为一维数组)
sizeof(arr)值为:36
计算二维数组的行列大小:
行:sizeof(arr)/sizeof(arr[0])
列:sizeof(arr[0]/sizeof(arr[0][0]))
案例-三子棋
+ 项目结构
- main.c文件
- game.h文件
- game.c文件
案例-扫雷
+ 项目结构
- main.c
- game.h
- game.c
操作符详解
算符操作符
加减乘除取余
注意点1:除法分为整数除法和浮点数除法
整数除法:1/1=1
浮点数除法:1/1.0 = 1.0
注意点2:%取模操作符的两端必须是整数
移位操作符
扩展:
存在内存中的是补码
<<
<<(左移:左边丢弃,右边补0):
例:7<<1 =14
0111==>1110
右移>>:
算术移位:右边丢弃,左边补原符号位
逻辑移位:右边丢弃,左边补0
注意:右移是算术移位还是逻辑移位,取决于编译器(大部分编译器使用算术移位)
位操作符
+ &
&:按位与(有0为0,全一为1)
案例:3 & -5
3的补码:0000 0000 0000 0000 0000 0000 0000 0011
-5的补码 1111 1111 1111 1111 1111 1111 1111 1011
&结果: 0000 0000 0000 0000 0000 0000 0000 0011
3 & -5 等于3
- |
|:按位或(有1为1,全0为0)
案例:3 | -5
3的补码:0000 0000 0000 0000 0000 0000 0000 0011
-5的补码 1111 1111 1111 1111 1111 1111 1111 1011
| 结果: 1111 1111 1111 1111 1111 1111 1111 1011(补码需要转原码:=》减一,取反)
3 | -5 等于-5
^:按位异或(相同为0,不同为1)
3 ^ -5 等于-8
- 异或案例:两个整数交换
赋值操作符
=
复合赋值符
+=
-=
*=
/=
%=
=
<<=
&=
|=
^=
单目操作符
> 单目:只有一个操作数 > > 注意:sizeof时操作符,在某些情况下可以省略括号 >
关系操作符
逻辑操作符
条件操作符
逗号表达式
下标操作符,函数操作符、结构体操作符
+ 下标操作符
[]
- 函数操作符
()
- 结构体操作符
表达式求值
表达式求值的顺序一部分是由操作符的优先级和结合性决定。
同样,有些表达式的操作符在求值的过程中可能需要转换为其他类型。
隐式类型转换
指针
什么是指针
- 指针是内存中一个最小单元的编号,也就是地址
总结:指针就是地址,口语中说的指针是指指针变量
- 指针变量是用来存放地址的,地址是唯一标识一块地址空间的,
- 指针的大小在32位平台上是4个字节,在64位平台上是8个字节
指针和指针类型
结论1:指针类型决定了指针在被解引用的时候访问了几个字节
如果是int*的指针,解引用访问了4个字节
如果是char*的指针,解引用访问了1个字节
结论2:指针类型决定了指针+1操作的时候,跳过几个字节
野指针
概述:野指针是指指针指向的位置是不可知的(随机的、不正确的,没有明确限制的)
野指针的成因:变量没有初始化
防止野指针的方法:
- 尽量初始化
- 实在不知道赋什么值,就写NULL
指针运算
+ 指针加减整数
- *p++等于地址加一
- 指针减指针
- 指针减指针:得到的绝对值是指针之间元素的个数
:::info
打印的结果为:-9
:::
二级指针
java基础学408
二级指针:二级指针变量是用来存放一级指针变量地址的。
扩展:
一级指针:解引用一次
二级指针:解引用二次
指针数组
简介:存放指针的数组
- 模拟二维数组
结构体
结构体定义和创建
结构体传参
传参的两种形式:
- 将自己传递到函数中
- 将自己的地址传递到函数中
注意:结构体传参的时候,参数是需要压栈的,如果传递的结构体对象过于大的话,建议传递结构体地址。
版权声明:
本文来源网络,所有图片文章版权属于原作者,如有侵权,联系删除。
本文网址:https://www.bianchenghao6.com/h6javajc/25726.html