C语言基础知识小结
第一章
编译语言:c语言 c++
脚本语言:python
C语言诞生于贝尔实验室。
C程序的后缀是 .c .h
Python的后缀是 .py
1.屏幕截图快捷键
prt sc(关机键左侧) 屏幕截图快捷键 打开画图板,ctrl+v即可保存。
cpu 控制处理单元
cu 控制
pu 处理
编译器:将c语言翻译成cpu可识别的语言(机械指令)。
编译器4步骤:预处理-编译-汇编-链接 完整的2进制机械指令程序。
gcc 文件.c 编译器 生成可执行程序 a.out
gcc 文件.c -o 文件名 文件编译为文件名,不使用默认的名称“a.out” object(
2.补全文件快捷键 tab
tab 命令行中,自动补全文件名
stdio.h standard input
void main() 无返回值
注释
在C语言中添加注释是一个好的编程习惯,可以增强程序的可读性。
// 行注释
/*
*/
#if 0
#endif
第二章 变量和数据类型
1.基础
项目-文件-函数-语句-变量、常量 –表达式
数据类型:
1.基本类型:
char(字符型),int(整型),short(短整型),long(长整型),float(单精度浮点型) double(双精度浮点型)
1字节 占8位 32位
2.构造类型:数组、指针、结构体
ASC码:
0 48
a 97
A 65
转义字符:
\n 换行
\t 水平制表符
\b 退格
格式符:
%d 整型 数字
%c 字符 汉字、英文字母
%f 浮点型 小数
%x 十六进制
%o 八进制
进制前缀
进制 前缀
2.浮点型常量e
表示方法:
(1)12.56 0.23 1.45
(2)12e-1 5e-3
E左边必须有数据,e右边必须有整型数据
格式符: %f %lf
2.变量
C语言变量命名规则
1.数字、字母、下划线都可以为变量命名
2.作为变量名的开头不能为数字 3a_是错的 a_3 或 _a3是对的
3.变量名不能为关键字 像if else printf 等等都不能
蓝色的不可以做变量名
(1)声明变量
声明变量:Datatype variablename
1.变量声明
2.变量初始化 给变量赋值
3.使用变量
(2)输入输出函数
& 取址(地址)符
printf 输入函数
scanf 输出函数
scanf中不能加换行
(1)printf加强功能:宽度管理
实际用于开发时表格的打印
a.整数宽度:
右对齐占8个位置, 例如:printf(“%8d %8d”,32,n);
左对齐占8个位置, printf(“%-8d%-8d”,32,n);
左对齐填充0无效、右对齐有效、占8个位置, printf(“%-08d%08d”,32,n)
%08x 16进制数填充0,占8个位置 printf(“0x&08x 0x%08x”,32,n);
b.字符串
右对齐占10个字符 printf(“你的姓名是:%10s”,s);
左对齐 printf(“你的姓名是:%-10s”,s)
c.浮点数
右对齐,3个小数位 printf(“工资:%16.3f”,8001.5);
左对齐,3个小数位 printf(“工资:%-16.3f”,8001.5);
printf 输入函数
printf(“格式,格式”,变量,变量)
scanf(“格式格式”,&变量,&变量)
(3)一元运算算术符
运算符优先级
“+” >”=”
(4)类型转换
1…getchar 字符输入
getchar()函数只能输入一个字符型的值,而scanf()函数除了字符型,还可以输入多种数据类型的值,包括整型、浮点型等
2…putchar 字符输出
putchar函数只能用于单个字符的输出,且一次只能输出一个字符
字符型转换成整型基本没什么问题,但反过来就可能zd会出问题了。因为在C语言中,整型一般是两个字节(int型回两个,long型4个,short int型一个),字符型为一个字节(无符号的为两个),一个字节转两个没问题,两个转一个就可能出现溢出问题。比如答 char a=255,就会溢出,因为a表达的范围只是-128~127
(5)static作用:
被static修饰的全局变量,extern无法从外部找到
1、修饰函数的局部变量:
特点:有默认值0,只执行一次,运行一开始就开辟了内存,内存放在全局
2、修饰全局函数和全局变量:
特点:只能在本源文件使用
3、修饰类里面的成员变量:
特点:和1差不多,定义多个static y,但只有一个y,不进入类的大小计算,不依赖于类对象的存在而存在(可直接调用,要进行外置声明)
4、修饰类的成员函数:
特点:f():括号里无this指针,只能调用他的本类静态函数和他的静态变量,即是用static修饰过的不依赖于类对象的存在而存在(可不进行外置声明,直接调用)
(6)变量的三大属性
1.作用域
全局变量:函数外部定义的变量
局部变量:函数内部定义的变量
定义:变量的使用范围
分类:文件作用域、函数作用域、代码块作用域、原型作用域
全局变量、局部变量、 局部变量、 函数参数形式
2.链接属性(针对文件来说)
内部链接属性:不同模块间同名的变量是不同实体 (不同文件的同名变量是两个变量)extern
外部链接属性:不同文件的同名变量是同一变量 static
4.存储属性
静态存储(全局变量):变量定义时候申请的空间 extern, static
动态存储(栈):用的时候申请,不用的时候就释放的空间。 局部变量
(7)错题集
第三章 运算符
(2)赋值运算符
最简单的运算符 =
*复合赋值运算符
运算顺序:自右向左
(3)关系运算符
== 等于 != 不等于
大于 >= 大于等于
< 小于 <= 小于等于
(4)条件结构
只有一条语句的时候,“{}”可以省略不写
(5)逻辑运算符
与:一假则假,
或:一真则真,两假则假
(6)sizeof运算符(单目运算符)
*2逗号运算符(优先级最低)
结果为8
(7)运算符优先级
(8)特殊运算符
(1)位运算符号:
a)<< 左移运算符:i << n的结果是i*2的n次方
b)>> 右移运算符:i >> n的结果是i/2的n次方
(2)逗号运算符
逗号运算符的特点是:
a)从左向右依次运算,b)最终结果采取最右边的结果;
(3)位运算:
& 按位与:相同位的两个数字都为1,则为1;若有一个不为1,则为0。
(两个数字按位与运算,当没有重叠位时结果是0 )
| 按位或:相同位的两个数字都为0,则为0;若有一个不为0,则为1。
(两个数字按位或运算,当没有重叠时就是加法)
~ 按位取反:单目运算,将一个数字所有二进制位0变1,1变0。
(无符号时相当于最大值减自己,有符号相当于乘-1,正变负时绝对+1,负变正绝对值-1)
^ 按位异或:双目运算,当相同位的两个数字相同时为0,不同时为1。
(两次次跟同一个数字^运算结果,恢复原来之前数值)
(4)位运算的实际应用:
| 用来将一些标志量组合在一起,如果没有有重叠会加入该标志,已经有重叠的标志量会忽略;
& 用来判断一些组合后的标志混合变量中,是否包含指定的标志量;或者用来清理大部分位为0
~ (&)用来删除一个标志混合变量中的某个属性;
附录:符号优先级
1级优先级 左结合
() 圆括号 []下标运算符 ->指向结构体成员运算符 .结构体成员运算符
2级优先级 右结合
! 逻辑非运算符 ~ 按位取反运算符 ++ 自增运算符 – 自减运算符 - 负号运算符 (类型) 类型转换运算符 * 指针运算符 & 地址与运算符 sizeof 长度运算符
3级优先级 左结合
* 乘法运算符 / 除法运算符 % 取余运算符
4级优先级 左结合
+ 加法运算符 - 减法运算符
5级优先级 左结合
<< 左移运算符 >> 右移运算符
6级优先级 左结合
<、<=、>、>= 关系运算符
7级优先级 左结合
== 等于运算符 != 不等于运算符
8级优先级 左结合
& 按位与运算符
9级优先级 左结合
^ 按位异或运算符
10级优先级 左结合
| 按位或运算符
11级优先级 左结合
&& 逻辑与运算符
12级优先级 左结合
|| 逻辑或运算符
13级优先级 右结合
? : 条件运算符
14级优先级 右结合
+= -= *= /= %= = >>= <<= &= ^= |=
全为赋值运算符
15级优先级 左结合
, 逗号运算符
(5)前++和后++(–)的区别:
a)前++(–)等价于在当前语句执行之前先执行自增(自减)运算;
例如:printf("++i=%d\n",++i);
等价于:i += 1;
printf("++i=%d\n", i);
b)后++(–)等价于在当前语句执行之后再执行自增(自减)运算;
例如:printf(“i++=%d\n”,i++);
printf(“i++=%d\n”, i);
i += 1;
(6)附录、右移运算的注意事项:
a)对于有符号变量:
当最高位为1时,高位移动剩余位置填充1;
当最高位为0时,高位移动剩余位置填充0;
b)对于无符号变量:
高位移动剩余位置统一填充0;
(9)综合示例
(10)作业
第四章.条件结构
(1)多重条件结构
(2)多重if结构
(3)嵌套if函数
(4)switch
(5)作业
g重量,
(6)pow函数
2的5次方
第五章.循环
1.while循环(while后无符号)
(1)工作原理
(2)while循环两大规则
(3)示例
2.do-while循环(while后有“;”)
(1)工作原理
(2)示例
(3)比较while和do-while循环的工作原理
3.for循环(循环中两个分号不能丢)
for循环表达式
乘法表示例
continue语句(笔试题中经常出现)
第六章.数组
(1)一维数组
数组:定义多个相同类型的变量
int a[100];
a 数组名
int 数组元素类型
100 变量个数
数组类型:数组元素类型和数组元素个数
int a[100]、int b[99]、char c[100]均为不同类型数组。
int a[5] 等同于 int a,b,c,d,e;
int a[5] 地址相连 int a,b,c,d,e地址不相连
数组元素表示方法:
1.下标法:
2.地址法 取址符& 取值符*
数组名 == 数组首元素地址
数组地址== &数组名
数组首元素地址== *数组地址
a = &a[0] a=&a[0]=a[0]
a+1=&a[1]
a+2=&a[2]
数组地址+1 是下一个数组地址
数组首元素地址+1 是下一个元素地址
(2)二维数组
int a[4][2];
4 由4个相同的一维数组组成的
数组名 == 数组首元素地址
数组地址== &数组名
数组首元素地址== *数组地址
*a=&a[0][0]
**a=a[0][0]
a[0][0] a[0][1]
a[1][0] a[1][1]
a[2][0] a[2][1]
a[3][0] a[3][1]
第七章.指针
指针:保存地址的变量
常用数据类型对应字节数
可用如sizeof(char),sizeof(char*)等得出
32位编译器:
char :1个字节
char*(即指针变量): 4个字节(32位的寻址空间是2^32, 即32个bit,也就是4个字节。同理64位编译器)
short int : 2个字节
int: 4个字节
unsigned int : 4个字节
float: 4个字节
double: 8个字节
long: 4个字节
long long: 8个字节
unsigned long: 4个字节
64位编译器:
char :1个字节
char*(即指针变量): 8个字节
short int : 2个字节
int: 4个字节
unsigned int : 4个字节
float: 4个字节
double: 8个字节
long: 8个字节
long long: 8个字节
unsigned long: 8个字节
指针法和下标法
第八章.字符串
1.字符串常量
字符串:只有字符串类型的常量,没有字符串类型的变量
char c[10]=”123”
char c[10]={‘1’,‘2’,‘3’,‘\0’} \0隐形
字符串格式符 %s
Scanf(“%s”,数组首地址) 不能加空格
3.字符数组和字符串
1.字符串常量
字符串常量是双引号括起的任意字符序列
字符串常量中可以包括转义序列 \”
字符串常量中可以包括字符串结束符
4.字符串处理函数(面试题源代码)
1.字符串长度函数
strlen(首地址) 返回值为字符串的长度。
2.不受限的字符串函数
(1)复制字符 strcpy(字符组1,字符串)
Strcpy(首地址,首地址)
(2)字符串链接 strcat
(3)字符串比较大小
3.受限的字符串函数
strncat(首地址,首地址,前几个字符)
第九章.函数
1.内置函数 string.h
2.自定义函数
1.函数三要素:返回值、函数名、参数
返回值可以给函数调用位置提供一个信息的反馈。
函数名是区分两个函数的唯一标准。
(1)函数的实现
数据类型 函数名(参数1, 参数2, …)
{
//函数体
}
Datatype functionName(argument1, argument2, …)
{
//code
}
(2)函数的调用
函数名(参数1,参数2);
(3)函数的声明
数据类型 函数名(参数1,参数2,……);
1.2形参与实参
形参和实参仅仅是数值上相等,是两个独立的变量。
通过传递地址,不一定可以间接修改变量的值。
函数声明与函数实现的参数列表,叫做形参
函数调用中的参数,叫做实参
在调用时,首先会将实参赋值给形参
1.3传值传址
==传值: 不希望函数内部对参数进行改变
传址: 希望在函数内部对参数进行改变
3.函数中传递数组 使用传递地址的方式实现
4.函数-吕鑫老师
一)认识函数:
a)让代码更加容易维护,就如同文章中有各个不同段落。
b)让代码重用性高 ,可以对同一个函数多次调用,不用多次写该代码。
c)如果把main函数比作公司的经理,那么其他函数经理下面的员工。
d)不能让main函数做几千几万行代码,要建立不同的函数分工处理任务。
二)函数的定义:
定义包括:函数头和函数体
函数头:函数大括号上的第一行
函数体:函数大括号内的多行代码内容。
函数头包括:返回值类型 函数名(参数列表)
三)参数原理:
a)参数就是下属的小本子,记录经理传递来的数字,根据这些数据进行计算;
b)每次进入被调函数,都会重新分配内存空间给形式参数和临时变量;
四)返回值原理:
a)当返回值的类型不大于4个字节,通过EAX作为暂存空间;
b)被调函数return的数据放在EAX寄存器中,
c)回到主调函数中之后,主调函数从EAX寄存器中取出被调函数的返回值;
d)当返回值的类型大于4个字节,32位寄存器存储不下,
可能是放在主调函数中的一个内存空间;
五)函数的声明:
一般情况下,当被调函数在主调函数代码的上方才能够被调用,否则编译时就不能通过,这叫做“代码的可见性”。
a)使用函数声明,就可以让不可见的函数被主调函数调用。
b)函数声明,就是将被调函数的函数头放在被主调函数的上方,加个分号即可。
c)在一个代码量很大的C语言源文件中,通常在这个源文件的头部把所有函数都声明一遍。就如同一本书的开头首先是目录,以便于方便的浏览这本书籍的每个章节。
d)函数声明如果与函数定义在名称或者参数类型稍有不同,就出现连接错误。
e)函数声明只是一种样式,参数类型只要与函数定义一致即可,可以去掉声明中的变量名;
f)有了函数声明之后,函数的定义可以转移到其他原文件中去,也就是跨文件访问函数;
内存分区:栈、堆、全局区、字符串常量区 (代码区)
Stack :栈
第十章.结构体的字节对齐
结构体的字节对齐
为提高结构体的读取效率,通常默认4字节对齐