C语言笔记(精简版)

第一章 C语言的组成
1.标识符(三类):
(1)保留字(关键字):字母,小写
(2)预定义标识符:库函数
(3)用户自定义标识符:①场合:变量名,数组名,函数名
②规则:字母数字下划线,必须以字母和下划线开始
2.数据类型(定义内存空间大小 ):
(1)基本类型:整型int、实型float、double、字符型char
(2)构造类型“:数组、struct、union、enum
(3)指针类型:*
(4)空类型:void
3.数据
(1)常量:
①整型常量:十进制、八进制‘0’、十六进制‘0x’
②实型常量:小数形式(7或.7或7.均可)
指数形式(e前后必须是数字,且后面必须是整数,前后不得有空格)
③字符型常量:‘A’、‘\n’转义、‘\ddd’最多有三位八进制、‘\xhh’最多有两位十六进制
‘A’等于’\101’等于’x41’
④字符串型常量:““系统见到双引号默认后面加一个\0
(2)变量
(3)表达式:①运算符——功能、结合性、优先级
②合法——唯一值
(4)函数 :可以做数据(如sqrt(7))
4.逗号运算符(顺序求值表达式):逗号表达式的值就是表达式n(最后一个表达式的值,求值顺序是从左到右依次求解)
5.强制类型转换(显式转换)(二级、从右向左)
格式:(类型名)表达式
功能:利用强制类型转换运算符可将一个表达式的值转换成指定的类型
注意:进行强制类型转换得到的是一个中间值,而原来的表达式或变量的类型未发生改变
变量值只能在赋值号左边或者++、–前后才能改变
第二章 顺序结构程序设计
1.顺序结构:从main()开始,由上往下一条一条执行
三大类语句:注释语句、定义语句、执行语句(五类)
2.执行语句:①控制语句(9条);②函数调用语句;③表达式语句;④空语句;
⑤复合语句{ }:算一条语句
3.库函数:printf(); 头文件名+函数的使用格式
双引号是字符串的标志,标志永远不会输出
注意:1.占位符以%开始,被替换,被输出列表的值替换,普通字符原模原样输出
2.输出值,先计算后输出
占位字符:1)d:带符号十进制整数
2)u:无符号十进制整数
3)o:无符号八进制整数
4)X或x:无符号的十六进制整数
5)c:输出一个字符,不输出单引号
6)s:输出一个字符串,输出时不输出双引号
7)f:输出一个实型数,隐含输出6个小数
8)E或e:输出指数形式的实型数
4.输入:scanf(“普通/占位符“,地址列表);
考点一:普通/占位符,输入时普通字符必须原样输入
考点二:占位符(没有普通字符)
输入格式:1)3空格7 回车 2)3回车7 回车
3)3 tab 7 回车 4)3空格tab回车7 回车
考点三:占位符:输入时一种输入
char ch1,ch2;
scanf(”%c%c”,&ch1,&ch2);
注意:①标志永远不输入
②%c读取光标自动下移,连续读取,空格视作空字符,回车视为换行
分析上要加单引号,输入时不能输入
考点四:%d能跳过不是数的找到下一个数,%c连续输入
考点五:地址列表,输入要加&
5.字符数据的输入输出:
(1)putchar(字符常量或字符变量):输出一个字符但不输出单引号
如:putchar(‘a’);
putchar(‘\n’);
putchar(100);(输出d) 如果是整型,将对应的ASCII字符输出
putchar(‘100’);(不合法)
(2)getchar():①没有任何参数,函数的返回值就是输入的字符,
②不管是空格或回车都可以接收
如: char a,b;
a=getchar();
B=getchar();
若输入为:1回车 则a的值为字符‘1’,变量b的值是回车符
第三章 选择结构程序设计
1.选择结构:从main()开始,由上往下有些语句执行,有些不执行
两类表达式:
(1)关系运算符(6,7,从左向右)
关系表达式的结果是逻辑值,0为假,非0为真
(2)逻辑表达式:&& (11级)和 ||(12级) 和 !(二级,从右向左)
逻辑与:全真为1,有0为0
逻辑或:全0为0.,有真为1
逻辑非(单目):真变假,假为真
短路有限考虑:①逻辑与短路:第一个表达式为0,表达式即为0
②逻辑或短路,第一个表达式为1,表达式即为1
表达式:1.先看合法性 2.短路优先 3.优先级,同级结合性
2.if语句(三种形式):
1)if(表达式)
语句序列1;
后继语句;
2)if(表达式)
语句序列1;
else
语句序列2;
后继语句;
注意:1.else和if必须要配对,与在上面,最近的,未配对的if
2.if else算一条语句,复合语句算一条语句
3)if(表达式1)
if(表达式2)
语句序列11;
else
语句序列12;
else
语句序列2;
结构:1.找配对(else要配对,花括号要配对,do要配对)
2.找控制(if要就近控制)
3.标语句
3.switch语句格式:
switch(表达式)
{
case 常量表达式1:子句1;
case 常量表达式2:子句2;
……
case 常量表达式n:子句n;
default: 子句n+1;
}
表达式若合法找到相应的case语句,执行对应的子句,并且无条件的执行下去,均不匹配时找default,并执行子句n+1,并执行后面的语句,如果没有default时程序直接跳出switch
考点:(1)switch后必须用小括号将表达式括起
(2)case后常量整型或字符型,不能有变量和逗号运算符,不可以有相同的值
(3)case 和default 只是一个入口标号,不起中断作用,它们的顺序可以任意颠倒
(4)case 和default 必须出现在switch语句中
第四章 循环结构程序设计
一、.循环结构:从main()开始,从上到下,使得某些语句重复执行
1)当型循环:while(表达式)
{
循环体语句序列;
}
后继语句;
说明:1.表达式求解,非零执行循环体,继续求表达式值,直到表达式为零,执行后继语句
2.while后面表达式必须加小括号
3.while 控制一条语句,while+控制语句算一条语句
4.复合语句算一条,有花括号,后继语句时花括号外的第一条语句,若没有花括号,则是while后面一条控制语句后面的是后继语句
2)直到型循环:do
{
循环体语句序列;
}while(表达式);
后继语句;
说明:1.表达式为真就继续循环,直至表达式为假,则退出循环
2.do就近控制一条语句,若多条,一定加花括号
3)for( 表达式1;表达式2 ; 表达式3 )
{
循环体语句;
}
后继语句;
说明:1.先执行表达式1,若满足表达式2,执行循环体,再执行表达式3,判断是否满足表达式2,若满足,继续执行循环体,直到表达式3不满足表达式2,退出循环,执行后继语句
2.表达式1只执行一次,起到初始化作用,表达式起到判断作用,表达式3为增量式
3.表达式2一直为真则为死循环
4.两次分号不能少
5.for(表达式1; ;表达式3)循环体
缺少表达式2,系统自动补1,永为真
二、两个控制语句——break和continue
1.格式:break; 跳出
功能:中止退出
范围:循环体中和switch体
循环体结束:①表达式二为假 (结束晚)②break;跳出(结束早)
2.格式:continue;
功能:结束一次循环继续(跳回)
在for中,跳回表达式3 ②在while/do…while中跳回表达式
范围:循环体中
第五章 数组
1.特点:同一数组中的所有元素都属于同一种数据类型(int、char、float),数组元素用数组名和相应的下标来确定
2.一个数组元素就是一个变量(可以称为带下标的变量)
3.格式:类型名 数组名[常量表达式];
注意:(1)数组名属于用户标识符,要遵守标识符命名规则
(2)定义一维数组时数组名后必须用一个方括号将常量表达式(不可以是变量!!!)括起来,常量表达式的值表示所定义共有多少个元素(数组长度或数组的大小)
(3)定义数组时方括号中的表达式不能含有变量,另外表达式的值必须要大于零且为正整数
(4)c语言每个数组在内存中分配空间时是连续分配的
4.一维数组元素的引用格式:数组名 [下标]
注意:(1)先定义数组后使用
(2)不能整体用数组名,要用只能用其中的元素
(3)引用时下标可以是表达式(可以是变量),数组元素下标值在0——N-1
5.一维数组的初始化
格式:类型名 数组名[常量表达式]={初始值1,初始值2,…};
注意:(1)定义一维数组时可以将各元素的初始值依次放在一对{ }中赋给数组
必须用一对花括号将初值括起,且初值之间用一个逗号分隔
(2)多则出错,少则补零
(3)定义赋初值的个数等于数组长度,则数组的长度可以省略
(4)一个也不给则是随机值
(5)只能在定义数组的同时用{ }给数组元素整体赋值
6.二维数组的定义格式(多行多列):
定义格式: 类型名 数组名[常量表达式1][常量表达式2];
注意:(1)数组名要遵守用户自定义标识符的命名规则
(2)定义二维数组第一个方括号常量表示行数,第二个方括号常量表示列数
(3)定义数组时方括号中的表达式不能含有变量,另外表达式的值必须要大于零的正整数
(4)c语言二维数组元素在内存中分配空间时是连续分配的,先行后列原则
7.二维数组元素的引用: 数组名[行下标][列下标]
注意:(1)先定义数组后使用
(2)不能整体用数组名,要用只能用其中的元素
(3)引用时下标可以是表达式(可以是变量),引用二维数组元素时,必须标明行下标和列下标两个下标,从0到n-1
8.二维数组的初始化:
方法一:将初值依序放在一对{ }中,与一维数组初始化格式相同(按列划分)
方法二:定义二维数组的同时,按行初始化每一行初值均用一对{ }括起,采用嵌套的{ }格式
注意:定义二维数组的同时给数组初始化,则可以省略行数,但列数不能省略
9.字符数组:c语言中没有字符串变量,如何存储?
方法一:字符数组来存放
方法二:字符型指针变量
①字符数组的初始化:char s[5]={‘a’,’b’,’c’,’d’,’e’};
与其他类型数组的初始化方式一样,只是其初始值是字符
②字符串:因为字符串最后都有一个字符串结束符‘\0’,所以用字符串数组来存放字符串时一定要有一个元素存放结束符‘\0’
10.字符串常量最后有一个‘\0’
如:“abcd”由五个字符组成,“abcd\0”有六个字符组成,“”等价于‘\0’,是一个空字符串
11.用字符串给一字符数组进行初始化有三种情况:
方法一:char a[ 5 ]=”abcd”;
同?char a[ 4 ]={‘a’,’b’,’c’,’d’}; 不同,这是一个一维字符数组
方法二:char a[ 5 ]={“abcd”}; ‘\0’是见了双引号加的,不是单引号
方法三:char a[ 5 ]={‘a’,’b’,’c’,’d’,’\0’}; 加了结束字符,成为一个字符串
12. 字符串存储(赋值)四种方法
方法一:
① scanf()键盘输入:char a[10]; scanf(“%s”,a);
注意:(1)用%s格式输入时,遇到空格或回车符则自动结束输入
(2)数组名a就是一个地址,所以不能加地址符&
(3)scanf(”%s,%s”,a,b);不能正确读取数据,连续%s%s,中间不能加逗号或空格
② printf();输出
注意:输出时则从当前地址开始直到遇到结束符‘\0’为止
方法二:
gets()键盘输入:gets(字符数组);//读取一个字符串赋给字符数组
注意:(1)用该函数输入字符时,只有遇到回车符系统才结束读取字符
(2)不论使用%s还是gets()在输入时均不需要输入双引号,若输入了双引号则双引号也作为字符串的有效字符
puts()输出:puts(字符数组或字符串常量);//在屏幕上输出字符数组中的字符
注意:(1)用该函数输出与%s格式一样,只是该函数将‘\0‘转成’\n’输出
方法三:字符串初始化
char a[ ]=”abcd”;//见到双引号自动加’\0’
char a[ ]={“abcd”};
char a[ ]={‘a’,’b’,’c’,’d’,’\0’};
方法四:strcpy()如: char a[10]; strcpy(a,”abcd”); //将abcd替换掉a中的元素
13.字符串函数(#include<string.h>)
①连接:strcat()
格式:strcat(字符数组1,字符数组2);
注意:(1)从第一个串第一个‘\0‘开始连入,第二串的’\0‘也连入
(2)返回的是第一个串的首地址
②复制:strcpy()
格式:strcpy(字符数组1,字符数组2);
功能:将第二个串中的字符串替换到第一个串,返回值是一个个串的首地址
注意:把第二个串包括‘\0‘开始拷贝在第一个串的第一个字符上
字符串比较:strcmp()
格式:strcmp(字符数组1,字符数组2);
功能:函数值返回相同位置不同字符的ASCII码差值
注意:(1)不能用关系运算符直接进行字符串大小或字符数组大小的比较
(2)返回值是一个整型数组:
(3) 零表示两个字符串相等,大于零表示前面字符串大于后面字符串,小于零表示前面字符串小于后面的字符串
字符串长度大小:strlen()
格式:strlen(字符数组)
功能:求出字符数组的实际长度(不包括结束符‘\0‘)
如: char a[ ]=”abc\018\0”;
(分析:实际长度是5位,\0可接三位八进制数,但是八进制数里不能含有比7大的数,因此只能和\01组成一个八进制数,遇到8之后的\0结束)
第六章 函数与预编译
1.c语言程序的框架有两种:
①单框架:一个main()
②复合框架:一个main()+多个子函数
注意:(1)一个源程序文件可由一个或多个函数组成(函数是c语言的基本单位)
(2)一个c语言程序可以由一个或多个源程序文件组成
(3)c程序执行总是从main()开始,结束main(),可以调用其他函数
(4)函数不能嵌套定义,但可以互相调用,不能调用main()
函数的分类:(1)有参函数和无参函数 (2)库函数和用户自定义函数+main()
2.函数定义:头+体
函数返回值类型 函数名(形参列表)
{
函数体;
}
说明:(1)函数体可以没有语句,但是不能没有花括号,函数名后必须有一对小括号
(2)形参列表中每个变量都要有属于自己的数据类型名,多个变量中间加逗号
(3)不能在定义函数式在函数首部小括号后直接跟分号
(4)函数返回值类型:两类
形式1(非void型):int fun(int x,int y)
{
return 表达式;
}
形式2(void型):void fun(int x)
{
一定不要加return语句;
void是一个空类型,没有预留一个存放返回值的空间
}
注意:return 表达式;功能:①计算表达式值 ②返回值
3.函数调用:两种方式
方式一:非void型:变量名=函数名(实参列表);
方式二:void型: 函数名(实参列表)
遇到函数调用就出门,单向传值(实参传给形参),遵循三一致(形参实参个数一样,类型一致,位置次序要相同)
4.函数使用:
方式一:#include<头文件>
方式二:声明的格式:函数类型 函数名(形参类型1 形参1 ,形参类型2 形参2…);
5.变量三属性:类型,作用范围(空间),存储类别(时间)
作用范围:
(1)局部变量(内部变量):在一个函数内部定义的变量为局部变量
局部变量只能子啊它所在的函数内有效
在不同的函数中可以出现同名的变量,它们分别属于不同的变量
复合语句中定义的变量只能在此复合语句中有效
所有形式参数都是局部变量
(2)全局变量(外部变量):在函数体外部定义的变量为外部变量
全局变量的有效范围实在本文将内从定义该变量的位置开始到本文件的结束
全局变量可以在它的有效范围内被每个函数引用
在同一文件若全局变量与局部变量同名,局部变量屏蔽全局变量
6.存储类别:
(1)auto类别变量:
①auto类别变量用完后释放所占用的空间
②局部变量默认为auto类别,无初始化时,值为随机值
③使用时间短,一般都为auto类别变量
(2)static类别变量
①static类别从定义到程序运行结束均占用存储空间,生命周期长
②全、局部变量默认为static类别,无初始化时,初值为0
③static类别变量只进行一次初始化
(3)register类别变量
①register类别只能时局部变量才能被说明
②一般不能直接使用
(4)extern类别变量
①extern类别变量可以加大变量的作用范围
7.预定义命令
文件包含:可以在a文件中上部加上#include<a1.c>或#include<a2.c>
实现多个文件共同使用
8.宏
一、无参宏定义(符号常量): #define 宏名 宏内容
功能:用一个指定的标识符(宏名)来代表一串字符(宏内容)
说明:无类型说明,无语法检查
注意:(1)宏名一般用大写字母表示,遵守用户自定义标识符命名规则
(2)#define可以在函数外定义也可以在函数内定义,但该命令应该在单独一行上
#undef命令可以提前种植宏名的作用域(所有井号必须单独占一行)
(3)在进行宏定义时,可以引用已经定义的宏名进行层层置换
(4)在进行宏替换时,必须先替换完所有的宏后再运行,替换过程中不能乱加括号
原模原样替换,不要乱加括号,先替换,再按优先级计算
二、带参宏定义: #define 宏名(参数列表) 宏内容
注意:(1)在定义有参宏时,参数列表必须用小括号括起且小括号和宏名之间不能有空格
(2)对有参宏进行替换时,需要将形参改为相应的实参,并且注意分清形参和实参的对应关系
第七章 指针
1.C语言中有两种变量:其中普通变量存储内容值,地址变量(指针变量)存储地址值
格式: 类型名 指针变量名
注意:(1)前类型后分号是定义语句,其余有份好的语句都是执行语句
(2)在定义指针变量时,指针变量前面的
号是一个标志,不是变量名的一部分
(3)内容变量存内容值,指针变量存地址,不能将一个整型值赋给指针变量
2.指针变量的引用:
①&取地址符:取出内容变量的地址(2级,从右向左)
②*:1)乘标志 (双目运算)
2)指针变量的标志(没有运算功能)
3)指针运算符,*可以去除指针变量所指向的突通变量的值(2级,从右向左)
内容变量画房子,指针变量得地址,得谁地址指向谁,有星为内容值,不是读就是写,放在赋值号左边是写,其他都是读!
3.c语言中指针定义且初始化后才能使用!!!!!(必须要指向后才能改值!)
4. int a=20,*p=&a;
(1) *p等价于a (2)p等价于&a
(3)&*p等价于p (4) *&a等价于a
(5)(*p)++ 等价于a++ 都是给变量a的值加1
(6)(*p)-- 等价于a-- 都是给变量a的值减1
(7) ++(*p) 等价于++a 等价于++p
(8)–(p)等价于 --a 等价于–p
5.所有的指针变量在内存中分配的字节数相同!永远占两个字节!
数据类型的不同是因为指针指向内容值的大小不同
6.&与
是互逆的,与[ ]是等价的,&与[ ]也是互逆的
若数组作为形参,则将数组名做指针变量处理
7.指向一维数组的指针变量:
(1)在以为数组中规定,数组名代表数组的首地址,而且是一个地址常量
p等价于a等价于&a[0]
(2)当指针变量指向数组中的某一个元素时,指针变量加1后指向数组的下一个元素,指针变量减1时指向数组中前一个元素(一个地址加减一个数还是一个数)
(3)地址三等价:p+i等价于a+i等价于&a[i]
元素四等价: (p+i) 等价于(a+i)等价于a[i]等价于p[i]
p++等价于(p++) 把旧地址值取出,地址再向下加
++p等价于(++p)先把地址向下加,取出新地址的值
(p)++ 内容值改变,地址没有发生变
++(p) 等价于++P 内容值改变,地址没有发生改变
(4)若两个指针变量指向同一个数组,则这两个指针变量可以进行大小比较
大地址-小地址=中间相隔元素个数
(5)在形参中的数组实际上是一个指针变量,并不是真正的数组,因为该“数组名”的值是可以改的,而真正的数组名的值是不能改变的 (所有的形参都是局部变量)
(6)若形参是数组或指针变量,则在函数中可以通过该形参改变实参的值
8.指向二维数组的指针变量:
int a[3][4];
(1)a+i是行指针,即指向的是一整行,若对它加1则指向下一行
(2)
(a+i)和a[i]一样,都是一个列指针即指向的是一个元素
(3)地址等价:
(a+i)+j等价于a[i]]+j等价于&a[i][j]
(4)元素等价:
(
(a+i)+j)等价于
(a[i]+j)等价于(
(a+i)+j)等价于a[i][j]

小技巧:
一维数组访问元素:一次或一次[ ]即可
二维数组访问地址:一次
或一次[ ]
二维数组访问元素:两次或两次[ ]或一次一次[ ]或一次[ ]一次*
9.指向多维数组元素的指针变量
①列指针(画单行单列)
②行指针(画多行多列的二维表)
10.指向由m个元素组成的一维数组的指针变量的格式:
类型 (*指针变量名)[列数]; //行指针变量
11.指向字符串的指针变量:
字符串常量:c语言对字符串常量是按首地址处理字符串常量(第一个字符地址)
12.指向函数的指针变量:函数名和数组名一样,是起始地址,而且是一个地址常量
格式: 类型名 (*指针变量名)();
注意:(1)在定义指向函数的指针变量时,要注意有两个小括号
(2)单独的函数名代表该函数的首地址(函数的入口地址)
(3)函数的指针变量只能指向函数的入口处(函数的首地址),不能指向函数中的某条指令。(另对指向函数的指针变量加1是没有意义的)
(4)给指向函数的指针变量赋值时,只写函数名即可,不必写参数
13.返回指针的函数:
类型 *函数名(形参列表)
{
return 地址值;
}
14.指针数组(地址数组):若一个数组的所有元素均为指针类型(地址)
格式: 类型名 *数组名[常量表达式]
注意:(1)要注意它与定义指向m个元素组成的以为数组的指针变量之间的区别
类型名 *数组名[常量表达式]; 类型名 (*指针名)[常量表达式]
(2)它的每一个元素都是一个指针类型(地址),即它的每个元素都相当于一个指针变量
15.指向指针的指针变量:用来存放指针变量地址的指针变量成为指向指针的指针变量
定义: 类型 **指针变量名;
16.空指针:指针变量可以有空值即指针变量不指向任何变量,不指向任何有用的存储单元
在系统中已将NULL定义为0,不能认为是指向了地址为0的存储单元,指向的房子不存在
注意:(1)当一个指针变量的值为空指针时,我们不能引用它所指向的存储单元
(2)若某指针(地址)的类型为void型,则有引用时应进行相应的强制转换
地址赋初值:①给一个变量的地址 ②赋NULL ③malloc
第八章 构造类型
一、.结构体类型:
1.构造结构体变量:
格式: struct 结构体类型名
{
成员1的定义;
成员2的定义;
成员n的定义;
};
注意:(1)定义成员的方式与定义普通变量的方式一样
(2)成员列表必须用一堆花括号括起
(3)结构体名可以省略
2.定义结构体变量:
①先构造结构体类型名再定义结构体变量
②再定义结构体类型的同时可以定义结构体变量
③类型、变量同时定义,类型名student省略(不建议,之后不能再定义该结构体新的变量)
注意:结构体变量在内存中占用字节数为各成员占字节数总和
3.结构变量的初始化及引用
(1)在定义结构体变量的同时可以将各成员的初值按顺序放在一对花括号中,来进行结构体变量的初始化,若初值个数多于成员个数则出错,若初值个数少于成员个数,则多余成员自动赋零。
(2)结构体遍量不能整体引用,只能引用它的成员。
引用结构体成员的方式:结构体变量名.成员名
4.指向结构体数据类型的指针:
(1)指向结构体变量的指针:可以用指针变量只想结构变量也可以用指针变量指向结构体变量中的成员,要注意指针变量的类型必须与它所指向变量的类型相同,当指针变量指向结构体变量时,对指针变量加一则跳过整个结构体而不是跳过一个成员。
(2)当指针变量p指向结构体变量aa时,引用aa中成员的方式有三种:
aa.num p->num aa.score (p).score p->score
(点/指向/星括号点)
注意:(1)可以用结构体变量的成员作为实参,它与普通变量作为实参的用法是一样的
(2)用结构体变量作为实参时,要求形参必须时同一结构体类型的指针变量或数组是地址传递,则可以通过形参来改变实参的值
(3)也可以用结构体类型的地址(指针变量或数组)作为实参,要求形参必须是同一结构体类型的指针变量或数组是地址传递,则可以通过形参来改变实参的值。
二、链表: 顺序存储是随机访问,链式存储是顺序访问
(1)链表是一种数据结构,它采用动态分配存储单元方式,它能够有效地节省存储空间(同数组相比)
(2)链表都有一个“头指针”变量,它用于指向链表中的第一个元素(即用于存放链表中第一个元素的地址),链表中的元素成为“结点”,链表中的所有结点都是结构体类型。且同一节点都是同一结构体类型,每个结点都应包括数据部分和地址两部分,链表的最后一个元素(结点)称为链表指向其他结点(即该结点的指针成员值为NULL)
(3)结构体中出现指向自身的指针
(4)动态存储分配函数(#include<stdlib.h>)
格式:malloc(size)作用是在内存中动态存储区中分配一个长度为size个字节的连续空间,函数返回值为一个指向分配域起始地址的指针,若分配失败,则指向NULL
(5)free(p);释放用malloc()分配的内存
三、共用体类型:共用体中的所有成员共用一段内存(所有成员的起始地址都是一样的)
1.格式: union 共用体类型名
{
成员列表;
};
注意:(1)成员列表为定义该共用体的成员,成员定义方式与普通变量一致
(2)成员列表必须用一堆花括号括起
(3)共用体名可以省略
2.共用体变量的定义
(1)先定义类型,再定义变量
(2)定义类型的同时,定义变量
(3)直接定义变量
注意:由于共用体类型变量的所有成员都共用同一段内存,所以共用体类型变量所占的字节数等于该共用体类型中的成员所占的字节数
3.共用体变量的引用
注意:
(1)不能整体引用共用体变量,只能引用其成员(格式:共用体变量名.成员名)
(2)同类型成员共享值
(3)在内存中整型数据的二进制数低8位占用前面一个字节,高8为占用后面一个字节
(高位放高地址,低位放低地址)
(4)共用体变量之间可以相互赋值,赋值后两个变量应使用同一成员
(5)共用体变量的地址与各成员的地址都相同
(6)在定义共用体时,可以对其及进行初始化,但只能有一个初值且必须用花括号将初值括起,相当于给第一个成员赋值。
(7)不能用共用体类型变量作为函数参数
(8)不能用共用体类型变量做为函数参数
四、typedef:定义新的类型名代替已有的类型名(取别名)
格式:typedef 已有类型名 新的类型名;
(1)typedef可用于定义各种类型名,但不能定义变量,即只要见到typedef则该语句最后的标识符必定是一个类型名而不是变量名
(2)typedef只能对已经存在的类型新增一个别名,而不是创造新类型,即在typedef后必须是一个已有类型
第九章 位运算与文件
一、位运算的操作对象只能是整型或字符型数据
1.按位与:全1为1,有0为0
作用:清零
2.按位或:有1为1,全0为0
作用:将特定位置1
3.按位异或:相异为1,相同为0
4.按位取反:对一个数按位取反得到的值为该数+1后再乘-1
5.按位左移运算:将二进制位按位依序左移n位
功能:对一个十进制数左移n位得到的值为该数乘以2^n的积
例:2<<4相当于2
2^4
6.按位右移运算:将二进制位按位依序右移n位
注意:若该数位一个负数并且不能被2^n整除则得到的数位商加-1
(判断变量是否合法:取余左右必须整型,位运算左右可以是整型也可以是字符型,赋值号左边必须是变量,强制转换必须要加括号,加加减减前后是变量)
二、文件
1.文件:记录再外部存储介质(外存)上的数据的集合
2.文件的分类:文本文件(ASCII码文件)—每个字符存储到文件中
二进制文件:以二进制存储
注意:c语言中对文件的存取是以字符(字节)为单位的
3.文件类型指针:
FILE就是文件类型名,它是一个结构体类型,对一个文件进行操作,通过文件指针进行的
定义: FILE *fp,*in,*out;
4.文件操作:
1)文件的打开—fopen()函数
格式:fopen(文件名,文件使用方式)
功能:按指定的“使用方式”打开文件,函数返回所打开文件的指针,该指针的基类型为文件类型,文件名和文件使用方式均为字符串
例如:FLFE *fp;
fp=fopen(“data.txt“,”r”);
文件使用方式:
(1)“r“:打开已存在文件,若不存在返回NULL
(2)“w“:若文件存在则刷新写,若文件不存在则创建文件写
(3)“a“:若文件存在则追加写,若文件不存在则创建文件写
(4)“+“:增强功能
注意:(1)在“文件使用方式“中若含有字母b,则打开的是一个二进制文件,若不含b则打开的是一个文本文件
(2)文件使用方式只能用小写字母,文件名用大写或小写字母均一样
(3)当fopen“打开“失败时,函数返回NULL
2)文件的关闭—fclose()函数
文件使用完后应该关闭该文件
例如:fclose(fp);
3)fputc()
格式:fputc(字符,文件指针)
功能:把一个字符写到文件指针所指的文件中,其中字符可以是字符常量也可以是字符变量,若输出成功则函数返回输出的字符,失败则返回EOF
4)fgetc()
格式;fgetc(文件指针)
功能:从文件指针所指文件中读取一个字符,若读取成功则函数返回读取的字符,失败(遇到文件结束)则返回EOF
5)fgets()
格式:fgets(str,n,fp)
功能:其中str表示一个字符指针,可以是字符数组名也可以是字符指针变量名,从fp所指文件中读取n-1个字符(不是n个字符),并在这些字符的最后加一个字符串结束符‘\0’后赋给str,函数返回str首地址
6)fputs()
格式:fputs(str,fp)
功能:向fp所指文件中写(输入)str中的字符串,str可以是字符串常量、字符数组或字符指针变量,在输出时字符串的结束符‘\0’不输出,若输出成功则返回0,失败则返回EOF
7)fread(),fwrite():用来读写一个连续的数据块
格式:fread(buffer,size,count,fp);
fwrite((buffer,size,count,fp);
buffer:数据地址
size:每次读写的字节数
count:表示让函数进行多少次的读写
fp:要进行读写的文件指针变量
注意:这两个函数按二进制方式进行读写
8)fprintf(),fscanf();
格式:fprintf(文件指针,格式说明符,输出列表)
fscanf(文件指针,格式说明符,输入列表)
功能:按格式说明符所指定的格式向文件中读写(输入输出)数据,其中格式说明符和输入(输出)列表的用法与scanf和printf函数相同
9)feof(文件指针):
测试文件的当前读写位置是否在文件末尾,若是则返回非零值,否则返回0值
10)rewind(文件指针)
功能:使当前的读写位置重新指向文件的开头,函数无返回值
11)fseek(文件指针,位移量,起始点)
功能:将当前的读写位置从“起始点“开始按”位移量“所指定的移动字节数向后移动
起始点有:SEEK_SET 0 (表示“文件的开始”)
SEEK_CUR 1 (表示“当前位置”)
SEEK_END 2 (表示文件末尾)
注意:位移量要在数值后加字母l或L
12)ftell(文件指针)
功能:返回当前文件的位置,用相对于文件头的位移量表示,若返回-1L表示出错

  • 17
    点赞
  • 114
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值