C语言笔记

1.程序
为解决特定问题而用计算机语言编写的有序指令序列的集合

2.计算机语言的发展
机器语言(二进制)–>汇编语言(用字母表示)–>高级语言(面向过程-c,面向对象)

3.C语言的起源
1973年贝尔实验室设计的,最初用来编写unix操作系统

4.C语言的特点
简洁,紧凑,灵活,使用方便,可以直接访问物理地址等特点

5.C语言的结构特点和书写形式
a.函数是C语言的基本单元
b.一个函数有2部分:函数名和函数体
c.一个C语言程必须有且只能有一个main函数,程序总数从main开始执行
d.函数名称后圆括号
e.函数体在{}内
f.一条语句结束位置有分号(?
注释:
//单行注释 /**/多行注释

6.C语言的执行过程
源文件(.c或.cpp)—>编译(生成.obj)—>连接(.exe)—>执行(执行就是.exe)

7.算法
解决问题的方法和步骤

8.算法的特点
输入/输出,有穷性,确定性,有效性
算法可以没有输入,但是一定要输出

9.算法的表示方式
自然语言,流程图,N-S流程,程序

10.数据结构
是指数据的组织形式,C语言的数据结构是以数据类型形式体现的
数据结构简称数据类型

11.符号集
12.标识符
程序中用于表示变量,常量,数组,函数等的名称
规则:
a.只能由字母,数字,下划线组成
b.只能以字母,下划线开头
c.区分大小写
d.不能关键字和保留字
f.尽量做到见名知义
g.标识符要遵循“先定义,后使用”的规则

关键字都小写

13.数据类型
1.基本类型:
整型:基本整型(int 默认),短整型(short),长整型(long)
字符型(char)
浮点型(实型):单精度(float),双精度(long)
枚举型
2.构造类型
数组类型(array)
结构体类型
共用体类型
3.指针类型
4.空类型(null)

  输出格式:
  printf(格式字符串,变量或值)
  
  格式字符串:     
  整型: %d
  字符型: %c
  字符串:%s
  浮点型: %f 

14.变量
在程序运行过程中,其值可以改变的量
每一个变量都有一种数据类型,每一种类型都有定义了变量的格式和行为
每个变量都有自己的名字,并在内存中占有存储空间,其中变量的大小取决于其类型

变量的定义形式:
1.数据类型 变量名称; (先定义,后赋值)
如:int a; a = 5;

2.数据类型 变量名称=变量值;(定义时,直接赋值)
如:int a = 5;

15.常量
程序运行中值不能改变的量,叫常量

字面常量:数值或字符(串)
符号常量:宏定义的常量,使用#define定义,
#define 常量名称 常量值 (宏定义,不占用内存)
如: #define PI 3.1415
#define MY_IP_ADDRESS 192.168.42.254

const常量:使用const定义的常量,
const 数据类型 常量名称 = 常量值;(占内存空间,有数据类型,减少错误)
如:const int A = 3;

常量名称大写;
如果常量名称比较长,多个单词中间使用下划线连接

16.整型数据
1.整型常量的表示
八进制整型常量:以0开头,后跟数字(0~7)。如:05,012,010
十进制整型常量:1,2,3,56
十六进制整型常量:以0x(或0X),后跟0~9,a-f(A-F)。如0x5,0X125,0x12c

 进制转换
 十进制转八进制:除8取余,直到0位置,(倒着读余数)	 
 十进制转十六进制:除16取余,直到0位置,(倒着读余数)	 

2.整型数据的类型:6种类型
有符号int整型:[signed] int,2字节(16bit),-32768~32767
无符号int整型:unsigned int,2字节(16bit), 0~65535
有符号short整型:[signed] short[int] ,2字节(16bit),-32768~32767
无符号short整型:unsigned short[int] ,2字节(16bit), 0~65535
有符号long整型: [signed] long[int] ,4字节(32bit)
无符号long整型:unsigned long[int] ,4字节(32bit)

3.整型数据在内存中存放形式
整型数据在内存中都是以二进制存放在内存中,其数值是以补码的形式进行表示的
1.一个正数的补码与其原码形式相同
2.一个负数的补码是将该数绝对值的二进制进行按位取反在加1
对于有符号整数,其在内存中存放的最左边的一位表示符号位,如果该位是0,表示正数,如果是1表示负数

4.整型常量的值若超过了整型数范围,会自动被认为是长整型常量;整型常量也可以后加‘L’,强制置为长整型,如:5L,100L 等。

5.求字节运算符sizeof()
sizeof(数据类型|数值|变量);

17.浮点类型
1.浮点类型常量
小数形式:1.2
指数形式:12.3E+003
规范化的指数形式:在小数点的左边有且只有一位非零的数字

2.浮点类型分类
单精度float: 4字节,有效位6~7位
双精度double:8字节,有效位15~16位
长双精度 long double :16字节,有效位18~19位

3.格式是%f

4.浮点类型默认是double类型,如果要表示float,则在后面加F或f
5.实型数据在内存中的存放形式:按照指数形式存储,分小数部分和指数部分,小数部分采用规范化的指数方式表示。

18.字符型
1.字符常量(0-127):单引号括起来的一个字符
2.字符数据在内存中的存放形式:以该字符对应ASCII码值的二进制进行存储的
2.字符变量

字符串常量
使用双引号括起来的若干个字符,如“hello”
字符串的实际长度即字符串中字符的个数,系统会在末尾添加一个’\0‘,代表字符串结束,在内存中占字节数:字符串的实际长度+’\0‘

字符常量和字符串常量的区别:
1.定界符不同(字符常量是单引号,字符串常量是双引号)
2.长度不同
3.存储方式不同

19.数据类型转换
在进行运算时,不同类型的数据要先转换成同一类型,然后进行运算
1.自动转换(小–>大),由编译器自动完成
char/short–>int–>long—>double <----float

2.强制转换:将低位数据类型强制转换成高位数据类型
语法: (要转换到的数据类型)变量,值,表达式;

 注:强制类型转换会有精度损失  

20.运算符
1.算术运算符:+,-,*,/,%(二元运算符,如果+,-是正负符号,则是一元运算符)
%只能用在整型,长整型,字符型数据,其他运算符可用在任意类型

注:1.运算中只要出现实数,结果的数据类型就为实数
	2.两个整型数据相除,结果为整型 

2.自增,自减运算符(一元运算符)
前++(或前–):先自己加1(或减1),然后再参与运算
后++(或后–):先参与运算,然后自己在加1(或减1)

注:自增自减运算符只能用于变量,不能用于常量和表达式  

3.数据类型转换(前一小节)

4.C语句的种类
控制语句,函数调用语句,空语句,复合语句,表达式语句

5.赋值运算符
+,+=,-=,*=,/=,%=

注意:赋值表达式中,等号左边必须是变量,不能死常量和表达式

6.逗号运算符(逗号运算符是最低级)
逗号表达式的一般形式:表达式1,表达式2
计算顺序:先计算表达式1的值,然后在计算表达式2的值,整个逗号表达式的结果是表达式2的值

表达式1,表达式2,...表达式n,结果就是表达式n的结果

典型事例:k=(2+5,1+2,5+7); k=12,因为有括号,先算括号内的逗号表达式
          k=2+5,1+2,5+7;   k=7,直接赋值	 

21.输入输出函数

  1. 输入和输出的概念
    输入和输出是相对于计算机来说的,向计算机写数据称为输入,从计算机向外写数据称为输出

2.输出函数printf
格式:printf(格式控制,输出列表);
格式控制:用双引号括起来的字符串,包含三种信息
格式说明:%修饰符(格式字符),指定输出格式
普通字符:原样输出
转义字符
输出表列:要输出的数据,可以是常量、变量或表达式,可以没有,多个时以“,”分隔

3.整型输出格式(%d)
%d:输出有符号十进制格式
%md格式:m指定输出数据的域宽。数据位数小于m,左端补空格,反之按实际输出
%-md格式:数据位数小于m,右端补空格(左对齐)
%m.nd格式:n指定输出数据的精度。对于整型数据,数据位小于n,则左端补0 (右对齐)

注:1.格式说明决定最终输出的格式
    2.格式说明应与输出列表项的个数相同,顺序一致
    3.格式说明通常用小写字母

4.字符型输出格式(%c)
用于输出一个字符

5.字符串输出格式(%s)

6.实型数据格式(%f)
%f:整数部分全部输出,小数部分输出6位
%m.nf格式:右对齐,总共m位(包括小数点),n位小数位,整数位(m-n-1),不足时在左边补空格
%-m.nf格式:左对齐,总共m位(包括小数点),n位小数位,整数位(m-n-1),不足时在右边补空格

7.输入函数:scanf()
scanf(格式控制,地址列表);
或scanf(格式字符串,&变量名称);

 &:表示变量的地址

  格式控制:用双引号括起来的字符串,包含三种信息
  格式说明:%修饰符(格式字符),指定输入格式
  普通字符:原样输入
  转义字符
  地址表列:可以是变量的地址,或字符串的首地址
  
  接收数值型数据注意事项:
	scanf("%d,%d",&m,&n);   //以这种格式进行输入,在输入多个数字时只能以逗号(,)分隔,不能使用空格,tab键或回车键
	scanf("%d%d",&m,&n);    //以这种格式进行输入,在输入多个数字时不能以逗号(,)分隔,能使用空格,tab键或回车键进行分隔
	scanf("m=%d,n=%d",&m,&n);  //如果在“格式控制字符串”中,除了格式声明以外还有其他字符,在输入时要在对应位置上输入这些原样字符
  
  接收字符数据注意事项:
	 scanf("%c%c",&c1,&c2); //在用%c格式说明控制输入字符时,空格字符和转义字符中的字符都作为有效字符输入 

8.字符输入\输出函数
getchar();从键盘接收一个字符,与scanf功能一样
putchar(字符|变量);输出一个字符 ,与printf功能一样,没有换行功能

22.关系(比较)运算符:
<,<=, >, >=, ==,!=

1. 优先级:
   <,<=, >, >=优先级相同(高)
   ==,!=优先级相同(低)
  
2. 算术运算符 > 关系运算符  > 赋值运算符 > 逗号运算符
  
3. 在关系运算符中,其返回值为“真”或“假”
   在C语言中,真用1表示,假用0表示   
   
4.使用关系运算符注意事项
  1.在进行关系比较时,若有字符型数据,则按其ASCII码进行比较
  2.注意区分“=”和“==”
  3.处理实数时,不能直接判断,需要使用fabs(x-y)<1e-6;  
  4.多个值进行判断时,不能连续判断  

23.逻辑运算符:&&,||,!
&&(逻辑与):a&&b ,两个表达式都为真,结果为真。如果表达式a的结果为假,则不执行表达式b,整个结果就为假
||(逻辑或): a||b, 两个表达式的结果都为假时,整个结果为假。如果表达式a的结果为真,则不执行表达式b,整个结果为真
!(非):真假相对

1.优先级:!> && >||
2. !(非) > 算术运算符 > 关系运算符> && 和 || > 赋值运算符 > 逗号运算符
3.逻辑上,真用1表示,假用0表示;
  判断一个值是否为真是,0表示假,而非0表示真  	

24.位运算:参与运算需要2个数据,是对其二进制进行(&,|,^)运算

按位运算符:
&(按位与),|(按位或),^(按位异或),~(取反),<<(左移运算符),>>(右移运算符)
1.~(取反)是一元运算符,其他都是二元运算符
2.按位运算符只能用在整型,字符型,不能用在实型

3.&(按位与):如果两个相应的二进制都为1,则该位结果为1,否则为0
0&0 = 0, 0&1=0, 1&0=0,1&1 =1

1.如果参与的是整数,则两个整数的二进制进行按位与运行
2.如果参与的是负数,则是该数的补码(该数绝对值的二进制取反加1)形式的二进制进行按位与运行,得到要的结果需要先减1,然后在取反,最后得到结果
3.作用:
  1.指定位清0
  2.保留指定位

4.|(按位或):两个相应的二进制中,只要有一个位1,则结果为1,否则为0
0|0 = 0,1|0 = 1,0|1 = 1,1|1 = 1,
作用:常用来对一个数据的某些位定值为1

5.^(按位异或):也称为XOR运算符,若参与运算的两个二进制位同号结果为0(假),异号结果为1(真)(相同为0,不同为1)
0^0 = 0, 0^1 = 1, 1^0=1, 1^1=0
作用:1.是特定位进行反转
2.与0相^,保留原值
3.交换两个数(a,b)的值,不用临时变量
1.获取两个数的相^的结果sum(a),sum(a) = a^b;
2.将b与和sum(a)相^,获取a的值,赋给b ,b = b ^ sum(a);
3.将和sum(a)与b相^,获取b的值,赋给a, a = sum(a) ^ b;

   综上所述: b = b^(a^b) = a^b^b;
              a = (a^b)^b^(a^b) = a^a^b^b^b;     
              
6.取反(~):即将1变0,0 变1

7.左移运算符(<<):将二进制位全部左移若干位,高位移出后如溢出,则舍弃,右补0
  注:1.如果该数左移时被溢出舍弃的高位中不包含1的情况,则左移1位,结果是该数乘以2,左移2位的结果是该数乘以4,以此类推。

8.右移运算符(>>):将二进制位全部右移若干位,移到右端的低位被舍弃。
  1.对于无符号数,高位补0
  2.对于有符号数,如果原来的符号位是0(整数),则左边也是移入0;如果符号位原来是1(负数),则左边移入0还是1,需要取决于所用计算机系统。
    如果移入0,叫逻辑移位,也称为简单移位,如果移入1,叫算术移位 
    
9.位运算赋值运算符:&=,|=,^=,<<=,>>=
10.不同长度的数据进行位运算
    如果两个数据长度不同(int b,longa),进行位运算时,系统会将二进制按右端对其,如果b为正数,则左侧16位补满0,若b为负数,
    左端应补满1;如果b为无符号整数型,则左侧添满0          

25.选择结构
25.1 if选择结构
1.if选择结构有三种表示形式:if结构,if…else,多重if
2.注意
1.如果只有一条语句的时候,可以省略大括号
2.if嵌套时,else总是与其上面最近的未配对的if进行配对

25.2 switch结构
1.switch语句可以处理多分支语句,有规律,可读性强
2.注意:1.switch语句检验的条件必须是一个整型表达式
2.case的值必须是整型常量,可以是整型常量,表达式或常量运算
3.case语句表示条件的后有一个冒号("")
4. default语句可省略
5.每一个switch结构只能有一个default语句
6.也可以省略break,实现多路开关

25.3 if和switch的区别 
    相同:都能实现分支结构
    不同:switch程序结构简单;适合多个分支的情况;只能用于整型值进行判断;不适合某一范围内的值;执行效率高
          if可实现较为复杂的逻辑判断;不仅适合等值判断,还适用于某一范围内的值;执行效率低 		

26.循环结构
1. while循环:当型循环。先判断条件是否成立,然后在执行循环体
while(条件表达式)
{
//循环体
}

特点:先判断,后执行。最少一次也不执行

执行过程:先判断条件表达式的值是否成立,如果条件表达式的值为真(非0),
则执行循环体,如果为假(0),则结束循环   

2.do-while循环:直到型循环。先执行一次循环体,然后在判断条件是否成立。
do
{
//循环体
}while(条件表达式);

特点:先执行,再判断,至少执行一次循环体
先执行一次循环体,然后在判断条件是否成立,如果成立,则继续执行循环体,如果不成立,则结束循环    

3.for循环
for(表达式1; 表达式2; 表达式3){
//循环体
}

for(初始表达式; 循环条件表达式; 更新循环变量表达式){
	//循环体
}    

先初始化表达式1,判断条件是否成立,如果成立则执行循环体,在更新循环变量,在判断条件表达式,如果成立,则继续执行,否则退出循环体

省略for循环的表达式:
1.如果省略表达式1,需要在使用前初始化
2.如果省略表达式2或表达式3,则出现死循环
3.如果省略三个表达式(for(;;)),则出现死循环
4.分号不能省略		 

4.break语句和continue语句
break:结束当前所在的循环
continue:结束本次循环,继续下一次循环

27.数组
数组:把同一类型的数据按照一定的形式有序地组织起来,这些有序的集合就是数组
或类型相同,数目固定的若干变量的有序集合

1.数组 = 数组名(自定义的标识符名称) +下标(数组中各个元素之间的相对位置)
2.数组分类:
  1.按照数组元素的类型分类
	  数组元素是组成数组的基本单元,必须具有相同的数据类型
	  整型数组,实型数组,字符型数组,浮点型数组,指针数组等
	  
  2.按照下标的个数进行分类:
	下标是唯一确定的
	 一维数组,二维数组和多维数组

3.一维数组
	数组中的元素为基本数据类型

	1.数组定义形式: 
	  类型说明符(基本数据类型)  数组名[常量表达式];

	2.数组的初始化
		2.1 一般形式:类型说明符 数组名称[常量表达式] = {值1,值2,...值n}; 

		2.2 给部分赋初始值,其余系统自动赋值0	
			int arr2[5] = {2,3,12};   
			虽然在数组中,可以只赋值一部分元素,但是赋值的个数绝对不能多于元素的个数

		2.3 如果不给数组赋初始值:系统给随机值
		2.5 设置数组中全部元素为0
			int a[10] = {0};  <==> int a[10] = {0,0,0,0,0,0,0,0,0,0};
			
			int a[3] = {10,10,10}; 不能写成 int a[3] = {10};
			 
		2.6 定义数组时,如果给数组元素全部赋初始值,可以省略长度(不推荐)
			int c[] = {1,2,3};  //根据元素的个数来定义长度
	   
	3.数组的存储方式:
	  定义一个数组后,会在内存中开辟一块连续的内存空间,存储数元素。数组名称,表示这一块连续内存空间的首地址,是一个常量地址
	  这一块连续内存空间的大小:数组元素的个数*sizeof(数据类型) 
	   
	4.数组的引用
	  数组的引用,通过下标使用     
	  下标是从0开始,最大下标是数组的length-1     	
		
4.二维数组:
	是一位数组的延伸和扩展
	就像是一个平面,可以表示出数据之间的二维的关系
	
	理解为:行*列的表格

	1.定义的方式:
	 类型说明符  数据名称[行长度][列长度];
	 
	 说明:1.行长度和列长度必须为常量表达式
		   2.行长度称为行下标,列长度称为列下标
		   
	2.二维数组的下标
	  下标都是从0开始
	   
	   若有a[m][n]的二维数组--->m*n的表格
	   行下标的取值范围:[0,m-1]
	   列下标的取值范围:[0,n-1]
	   最大的下标元素是:[m-1][n-1]

	3. 在 int b[4][3];    
	   b[0],b[1],b[2],b[3]表示一维数组
	   不能当做数组元素使用,只能当做数组名,因为他们不是单纯的数组元素了,如果要获取数组元素b[0][0]           
		   
	4.二维数组初始化  
	  1.给所有元素初始化
		 int c[2][3] = {{1,2,3},{4,5,6}};  //一行一行的赋值,推荐使用
	  2.给部分元素初始化,其余默认为0
		int d[2][3]= {{1,2},{5,6}};   
	  3. 给数组元素全部初始化为0
		int e[2][3] = {0};  
	  4.可以省略行下标,但是不能省略列下标
		int e1[][3] = {0};  //.<===> int e2[2][3];  
		
	  5.直接对数组元素赋值  
		  
	5.存储方式:在内存中开辟一个块连续的内存空间  
	6.数组元素的引用
	  不能引用整个二维数组,只能单个数组元素,在使用数组遍历的形式应用数组的每个元素 
	  方式:数组名称[行下标][列下标];    

5.字符数组 
一维字符数组
  1.一维字符数组定义方式:
	char 数组名称[常量表达式];
  
  2.初始化一维字符数组
	1.给字符数组全部赋值
	2.部分赋值,其余默认是\0
	3.省略长度,将有元素的个数决定数组的长度	
	
二维字符数组
  1.二维字符数组的定义方式
	char 数组名称[行长度][列长度];   
	
  2.二维字符数组的初始化
	1.给字符数组全部赋值:
	2.部分赋值,其余默认是\0 
	3.省略行长度,将有元素的个数决定数组的长度
	
  3.字符串:用双引号括起来的字符序列
	使用%s来表示字符串  	
	
  4.字符串的结束标志‘\0’
	1、"java"在内存中占5字节,但是只有4个字符,还有一个'\0'
	2、char a[100] = "abcd";
	   数组的长度有100个
	   实际长度只有4个,但是在内存中占5字节,还要一个‘\0’  
   
  5. 字符串的输入和输出
	 %s
	 scanf("%s",字符数组名称); 不用变量的地址
	 gets(字符数组名称); 输入函数
	 puts(字符数组名称); 输出函数
	 
	 特点:带有自动换行的功能

 字符串和字符串的结束标志’\0‘
  1.C语言规定,一个“字符串的结束标志",以字符\0代表
  2.'\0'占一个字节,有系统自动加上的
  3.字符串数组的长度要大于字符串的长度	
  
  %s和%c进行输入和输出注意事项:
  1.输出字符不包括结束符'\0'
  2.用%s输出时,输出的是数组名
  3.如果数组长度大于字符串实际长度,输出遇到'\0'结束
  4.若一个字符数组中包含一个以上'\0',则遇到第一个'\0'时结束输出   
  

字符串的处理函数
  1.strlen(字符数组):返回字符串的长度,不包含'\0'
  2.strlwr(字符数组):返回字符串的小写形式
  3.strupr(字符数组):返回字符串的大写形式
  4.strcmp(str1,str2):比较两个字符串的字典顺序
	比较的结果:
	如果str1=str2,则返回0
	如果str1 > str2,则返回正数
	如果str1 < str2,则返回负数
	
  5.strcat(字符数组1,字符数组2):将字符数组2拼接到字符数组1上
	注意:1.字符数组1必须足够大
		  2.拼接前每个字符串后面都有一个\0,但是拼接后的新字符串只在最后有一个\0    
	
  6.strcpy(字符数组1,字符串2):将字符串2赋值到字符数组1中 
   注意:字符数组1必须足够大
		 若字符数组1中有数据,则会被覆盖	 

28.函数
1.函数是C语言程序的基本单元
2.一个C程序是由一个main函数和若干子函数组成,main函数有且只有一个
3.main可以调用其他任意函数,子函数也可以相互调用,但是子函数不能调用main函数(main函数只能由操作系统调用)
4.函数都是平行的,即函数在定义时是相互独立的,不能嵌套

函数的分类
1.用户的角度:库函数(标准函数)和自定义函数
2.参数形式的角度:有参函数和无参数函数
3.返回值的角度:有返回值和无返回值

你可能感兴趣的:(C语言笔记)