C语言复习笔记

C快速复习,知识点总结

数据类型

基本数据类型

类型名称说明char字符类型存放字符的ASCII码int整型存放有符号整数short短整型存放有符号整数long长整型存放有符号整数long long存放有符号整数float单精度浮点型存放精度不高的小数double双精度浮点型存放精度较高的小数数组

  • 除了这些基本数据类型以外,还有一些复合类型,后面会慢慢讲到.
  • 表格中最经常使用到的四种类型是 char int float 和double.

类型介绍

根据存放类型的不一样,能够大体分为字符型,整型和浮点型微信

  1. 整型
  • 存放整数的类型 好比0 1 2 3 4这种天然数或者负数均可以用整型存放

类型大小范围说明函数

int4-231~231-1测试

short2-215~215设计

short(int) 短整型code

long4-231~231-1long (int) 长整型,规定范围不得低于intblog

long long8-263~263-1不低于long类型递归

  • 整型数据须要注意的是 整型数据之间的运算只会获得整型,也就是相似3除以4这种操做获得的不是0.75,而是0
  1. 字符类型
  • 字符类型是一种比较特殊的整型,本质上存放的仍然是整数,所以能够和整数同样参与各类计算

类型大小范围说明char1-1281270127每一个数字表明一个字符,可是不是全部的字符都是可打印字符游戏

  • ASCII码表,字符类型不须要记这个表格,须要的时候能够查表

img

  1. 浮点型/实型
  • 浮点型指的是小数类型,为何叫浮点型,参考浮点数二进制计算时候小数点的移动

类型大小范围说明float4-3.4e383.4e38**单精度浮点型,精确到小数点67位double8-1.7e3081.7e308**双精度浮点型,精确到小数点后面1617位图片

  • float内存占用更小,运算速度更高.double类型占用内存大,运算较慢,可是精度更高

变量定义和命名规范

  1. 变量和常量
  • C语言中将在代码中不能变的量称之为变量,不可变的量称之为常量
  • 好比圆周率这种就是常量,关注人数就是变量
  1. 定义变量
  • 类型规定了数据存放和使用的方式,如今有一个数据若是要存放的话,就须要用到变量
//定义变量的格式 类型 变量名;
     int a;
  • 上面代码定义了一个int类型的变量a 这个变量能够在后面赋值,计算,或者显示到屏幕上
  1. 命名规范
  • 只能由数字,下划线,字母,美圆符号组成
  • 不能够是数字开头
  • 不能够和关键字冲突

有一些名字拿去作其余做用,好比int 表明整型,这些就称之为关键字

  • 命名方式 驼峰命名法

每一个变量名由若干个单词组成,除了第一个单词以外,其他单词首字母所有大写.单词能够是缩写。好比 mciSendString

基本输入输出

  1. 输入输出函数
  • printf用于将指定的内容以特定格式输出到屏幕
  • scanf用于获取用户输入的内容
  1. 格式说明

格式占位符做用%d有符号10进制整型%c字符类型%f单精度浮点型%lf双精度浮点型%s字符数组类型%o无符号8进制整型%x无符号16进制整型

  1. 输出格式
  • printf("格式占位符",变量);
  1. 输入格式
  • scanf("格式占位符",&变量);

分支

分支语句

C语言的分支结构主要有if和switch

  1. if
  • 基本格式
if(条件) {
     //语句1
 } 
 else {
     //语句2;
 } 
 //若是条件知足 执行语句1,若是条件不知足 执行语句2
  • 须要注意的事情
  1. 条件能够用一个数字做为条件,判断真假按照 0为假以非0为真的规则
  2. 写条件的时候注意=和==是不一样的运算符 不要弄混
  3. 若是条件比较复杂 建议拆成多句,if里面的条件不宜太长,方便阅读
  4. 在if后面不要加分号
  5. else部分若是不须要能够不写
  6. 若是是if-else嵌套,好比
if(条件1){
      语句1;
 }
 else if(条件2) {
      语句2;
 }
 …
 else {
      语句n;
 }
    • 当第一个条件不成立的时候才判断条件2
    • if后面的{}中若是只有一个语句(用分号结尾的语句或者其余if语句均可以),那么能够省略掉{},else并非必要的,若是else的{}中没有内容 能够不要else
  1. switch
  • 基本格式
switch(变量) 
 { 
     case 状况1:
     语句1;
     break 
     case 状况2:
     语句2;
     break;
     //... 
     default:
     break;
 }
  • 注意事项
  1. sw itch的case后面只能接整型或者字符型的常量表达式,不能够是小数或者字符

  2. sw itch每一个case后面都有一个break

  3. default语句若是不须要能够不要

  4. 对比

  • if适应于任何分支状况,三目运算符适合一些比较简单的分支,switch适合能够一一列举全部可能状况的时候
  • 若是是一个范围的话用if比较容易表示,可是若是是单个单个能列举的值,用switch比较简介,好比游戏操做的wasd方向键,菜单的几个功能均可以用switch

循环

img

循环做用

  • 屡次执行的语句就可使用循环

好比游戏的操做和贴图,这些都是要屡次执行的,就会用到循环

  • 分支只会执行一次,可是循环可能会执行屡次(会搭配使用)

三大循环语句

  • while循环
  1. 基本格式
while(条件) {
     语句; //循环{}中语句称之为循环体 
 } 
 //执行顺序 先判断条件 条件知足执行循环体,不知足直接退出
  1. 说明

当条件知足的时候执行循环体,执行以后再去判断条件,条件不知足的时候退出

//打印ASCII码表中的全部字符 
     int i=0; 
     while(i<128) { 
         printf("%c\t",i++);
     }
     //同一个代码能够有多种不一样的写法 熟练使用其中一个循环就行了
  1. 注意事项
  • w hile循环不要加分号

  • w hile循环体只有一句的时候能够省略{} 可是不要省略

  • 若是条件知足则会一直进行循环,不知足就会退出循环,因此w hile可能一次都不执行

  • for循环

  1. 基本格式
for(初始化1;条件2;自增自减3) { 
     循环体4; 
 } 
 //为了描述方便 给每一个语句都加了一个编号 
 //执行顺序 先执行初始化语句1,而后判断条件2,条件成立执行循环体4,不成立跳出循环. 
 //循环体执行完毕以后,执行自增语句3 而后判断条件 开始下一轮循环 
 //简记 1243 243 243
  1. 说明

for循环相似w hile循环 一样是先判断而后执行循环体的,不过for的语法比较简单而且相对于w hile更不易写错,因此能够先从for循环开始熟悉

  1. 注意事项
  • for循环中的两个分号必不可少,其他的部分均可以不要,可是分号必不可少

  • for循环外面不要加分号!!!! 画重点 if w hile for通常都不要加分号

  • do while循环

  1. 基本格式
do { 
     //循环体; 
 }while(条件); //;不能少
 //do while循环的特色是先执行循环体而后判断条件,若是条件成立进行下一轮循环 
 //do while的循环体一定会执行一次
  1. 说明

do w hile循环条件放在后面,先执行而后判断,若是条件不成立会退出,否则会继续循环

  • 特别说明

    • 条件一直为真的循环称之为死循环,经常使用的有w hile(1) 或者for(;😉
    • for和w hile之间能够相互转换,可是和do w hile不必定能够

跳转语句

跳转语句使用方式做用说明goto跳转到程序的任意位置使用不当会形成代码的可读性差,可维护性差,基本上不用breakbreak;跳出最近的一个循环或者switch若是是循环中的sw itch中的break只能跳出sw itch,若是是多层循环只能跳出最近的一个循环continuecontinue;跳过当前的一轮循环,进入下一轮循环只能和在循环中使用.跳过当前循环,进入下一轮循环returnreturn 返回值;或者return;跳出当前函数主函数中的return会跳出主函数(跳出主函数也就意味着程序结束),其他函数的return是跳出当前的函数.能够跳出多层循环

  • 说明
  1. break,continue这样的跳转语句通常和if搭配使用,知足特定条件才会退出循环或者跳过此次循环
  2. return后面要不要加一个返回值这个根据函数肯定,留到函数部分再具体讲解
  3. 以上的都是关键字,不须要加头文件,也不能够用做函数或者变量名
  • 跳转函数 exit的说明

exit做用 跳出整个程序,是stdlib.h里面的函数,使用的时候须要加上

经常使用写法

exit(0); //里面的数字0表示正常退出,其他数字表示异常退出,不影响代码

在任意地方使用均会跳出整个程序

数组

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dzN3NXey-1570415333052)(D:\微信公众号\Typora\素材\潭州vip\数组.png)]

数组

  • 数组做用

存放多个相同类型的元素,若是有多个相同类型的元素须要存放,那么可使用数组。

//存放3个成绩
	//方式1 单独定义变量
	int grade1,grade2,grade3;
	//方式2 使用数组
	int grade[3];
  • 数组定义和使用方式
  1. 数组定义格式 类型 数组名[数组大小];
int arr[16];//定义一个数组 数组中能够存放16个int类型数据

若是你想要定义的时候就给里面的元素赋值的话,能够定义的时候直接用=

int arr[16]={1,2,33,2,4,5,6,1,6,7,7,7,8};
	//定义的时候给数组元素赋值 
	//数组元素个数是16,可是后面只有13个值,那么多余的就用0赋值
	//若是定义的时候给数组元素赋值,能够省略掉数组大小,用后面赋值的个数做为数组的大小	
	//int arr[]={1,2,3,4,5}; //此处数组大小是5
  1. 数组元素使用方式 数组名[下标]
//定义数组以后 至关于同时定义了多个变量,若是要使用这些变量,就用数组名加下标的形式去单独访问其中的元素
	// [ ] 下标运算符
	arr[2]=12; 	//表示给数组中第二个元素赋值(下标从0开始计算)
  • 注意
  1. 定义的时候int arr[16]表示对定义数组,除了定义以外的[]所有是下标运算符的意思,因此arr[16]不是数组的意思 而是数组中的一个元素
  2. 下标从0开始算,因此注意下数组的下标不能够超过数组的最大元素个数
  3. 下标可使用变量,因此数组能够和循环搭配使用

for(int i=0;i<16;++i) { printf("%d\t",arr[i]); }

二维数组和多维数组

  • 二维数组定义和使用

若是要定义几组数据就要用到二维数组,好比说地图,好比说一个学校有20个班级,每一个班级40个学生,这种用一维数组也能够存,不过用二维数组更加方便

定义格式 类型 数组名[ 行 ] [ 列 ] 使用方式 数组名i (使用时候注意,行列都是从0开始的)

//一维数组元素地址打印测试
	int arr[12]={1,2,3,4};
	for(int i=0;i<12;++i)
	{
		printf("%p\t",&arr[i]);
	}
  • 二维数组的初始化

和一维数组相似,二维数组初始化能够直接在定义的时候赋值

int douArr1[3][4]={{1,2,3,4},{2,2,3,4}};	//每一行单独赋值 
	int douArr2[3][4]={1,2,3,4};	//先存第一行,而后第二行 以此类推
	int douArr3[][4]={1,2,3,4}; 	//省略行 根据后面赋值判断有多少行

若是是定义的时候赋值,二维数组定义的时候能够省略掉行(不推荐省略)

  • 二维数组本质(只作了解)
//一维数组元素地址打印测试
int arr[12]={1,2,3,4};
for(int i=0;i<12;++i)
{
printf("%p\t",&arr[i]);
}
//二维数组元素地址打印测试
int douArr[3][4]={1,2,3,4};
for(int i=0;i<3;++i)
{
for(int j=0;j<4;++j)
{
printf("%p\t",&douArr[i][j]);//打印地址
}
printf("\n");
}
//%p用于打印地址的格式占位符 打印的是16进制形式

分析打印结果,发现这些元素地址都是相邻的. 相似一维数组,实质上二维数组的元素存放方式也是一个个相邻存放的,一行存完以后存下一行,从内存角度看,多维数组和一维数组其实没有什么太大的区别,使用的话,能够用以下方式

for(int i=0;i<12;++i)
	{
		printf("%d\t",douArr[0][i]);
	}

基本上二维数组以上的多维数组就用的不多了,规则和二维数组相似,因此掌握了二维数组,多维数组也是同样操做.

字符数组和函数

  • 字符数组和字符串

用双引号括起来的一串内容是字符串,字符串通常用字符数组存储

char str[20]="hello w orld";//定义字符数组存放一个字符串

字符串末尾都有一个'\0',表示的字符串的结尾,所以在进行和字符串相关的操做,都会用到'\0'

  • 因为字符串末尾有'\0',用字符数组存放字符串须要注意几个事项:
  1. 由于数组只有在定义的时候才能够用=赋值,其他状况下不能够直接用=赋值
  2. 字符数组能够用循环赋值,可是末尾须要记得加上一个\0
  3. 考虑到\0 数组大小不能够过小
  4. 字符串有一些经常使用函数,但凡是字符串(用\0结尾)均可以用这些函数
  • 字符串能够用的一些函数
  1. 字符串比较函数 strcmp
  2. 字符串拷贝函数 strcpy
  3. 字符串连接 strcat
  4. 测量字符串长度 strlen
  5. 判断一个字符串是不是另一个字符串的子串 strstr
  6. 判断字符串中是否包含一个字符 strch
  7. 字符串的输入输出 scanf printf
  8. 字符串的输入输出 gets puts

函数

对于一些常常会使用到的(屡次 重复使用)的代码能够将它封装成一个函数,C语言程序的基本组成单位就是函数.

函数1

  • 函数使用方式

调用方式 函数名(参数)

  1. 调用函数须要先知道函数名,好比getchar scanf这种
  2. 若是函数没有参数,那么直接加()便可调用 好比getchar()
  3. 若是函数有参数,那么须要在()里面写上参数,好比printf("Hello w orld")
  4. 通常函数都是为了执行某项功能,一些常常用到的功能能够写成函数以供调用,调用函数不须要知道函数具体的实现方式(知道他的功能就行)
  • 返回值
  1. 对于一些函数会返回一个结果,好比printf他返回打印的元素个数
  2. 不一样函数的返回值有不一样的做用
  • 函数定义方式
  1. 函数定义须要包含全部函数的组成部分
  2. 须要肯定函数做用,参数和返回值,定义函数以后方能使用
  3. 函数体根据函数做用书写 写函数的时候须要先设计,最好写注释
  • 函数声明
  1. 在调用函数以前定义函数的话就没用任何问题,可是通常状况会将函数定义放在调用函数的后面,这种状况就须要写函数声明
  2. 函数声明的做用是告诉编译器去后面找这个函数的定义,也就是他只是刷一下存在感
  3. 函数声明须要函数返回值类型 函数名和参数类型,也就是说参数的名字能够省略
int fun(int ,int); //函数声明
int main()
{
	fun(3,4); //函数调用
	getchar();
	return 0;
}
int fun(int x,int y) //函数定义
{
	return x>y?x:y;
}
  • 形参和实参
  • 形参意义
  1. 形参指的是调用函数的时候须要从外部引入的参数
  2. 其余函数中的值能够经过传参的方式传给被调用的函数
  3. 形参说明了被调用函数中须要哪些外部变量
  • 实参意义
  1. 实参是调用函数的时候传递的参数,实参传递给形参,就是从函数中传递值给被调用的函数
  2. 实参必须是有一个确切的值才能传递给其余函数
  • 概括总结
  1. 函数声明和定义时候的参数称之为函数的形参
  2. 函数调用时候的参数称之为实参
  3. 调用就是用实参给形参赋值而后执行函数体
int fun(int ,int); //函数声明 形参
int main()
{
	fun(3,4); //函数调用 实参
	getchar();
	return 0;
}
int fun(int x,int y) //函数定义 形参
{
	return x>y?x:y;
}

函数2

  • 做用域

变量要先定义而后才能使用,可是 变量定义位置会影响到使用的范围

  1. 局部变量

在函数或者{}里面定义的变量,出了{}就不能继续使用

  1. 全局变量

在函数外部定义的变量,定义以后整个程序中均可以使用

变量的做用域不同的话,名字能够相同,使用的时候依据就近原则(最近定义的那个变量).

  • 函数传参

问题1 若是要传递一个数组进去,那么形参和实参要怎么写 问题2 若是想要在函数里面修改实参的值 能不能作到

函数实参实参写法函数形参备注int xxint x基本数据类型直接写就行int arr[128]arrint arr[]一维数组传参的时候数组大小是不写的,须要另外传递进去int douArr[3] [4]douArrint douArr[] [4]二维数组传递参数实参直接写数组名,形参省略行号,可是列不能省略

形参名和实参名能够不同,这里只是做为示例,不是意味着须要名字相同

  • 递归

函数直接或者间接调用本身叫作递归,循环均可以用递归实现

递归只是一种解决问题的方式,关键在于找到递归公式

//示例 求阶乘
//思考 n!=1*2*3*4*.....*(n-1)*n
//能够获得递归公式 n!=n*(n-1)
//当n==1的时候 n!=1
int Fn(int n) //求n的阶乘
{
	if(n>1)
	{
		return Fn(n-1)*n;
	}
	else
	{
		return 1;
	}
}
相关文章
相关标签/搜索