导图社区 C语言
C语言是一门面向过程的、抽象化的通用程序设计语言,广泛应用于底层开发。本图总结了一些基础关键知识。
编辑于2022-07-01 16:11:33C语言
基础知识
C语言执行过程
C语言是一种高级语言,高级语言编写的程序叫做源程序。
由C语言编写的源程序的扩展名为 .c。
通过编译生成目标文件的扩展名为 .obj,再经过链接后生成可执行文件 .exe。
C语言的执行过程分为编译和链接。
结构化程序设计语言
高级语言
面向过程语言
面向对象语言
C语言
顺序结构
选择结构
循环结构
C语言特点
一个C程序是由若干函数组成,函数是组成C程序的基本单位。
C程序有且只有一个主函数,主函数的位置可以任意。
C程序由主函数开始执行并且结束于主函数。
每条C语句是以分号结束,一行可以写多条语句。
初识C程序
标识符
标识符可以简单的理解为C程序里面的名字,由用户定义。
命名规则
标识符由阿拉伯数字,英文字母和下划线组成
开头不能是数字
区分大小写
Eg:NUM和num在C语言里面是两种不同的标识符
不能采用关键字作为标识符
关键字(保留字)
C语言关键字有32个且都为小写英文字母
数据类型
常量
在程序运行过程中其值不可以改变的量。
变量
在程序运行过程中其值可以改变的量。
定义变量
数据类型 变量名;
数据类型
不同的数据在计算机内部的存储方式不同。
简单数据类型
整型
实型
小数
字符型
字母/数字
整型
在计算机中以补码形式存储。
整型常量
C语言中能表示三种不同的进制数
十进制(默认)
八进制
八进制前导加数字0,最大数字为7
十六进制
前导加0x或0X(0为数字不是字母),最大数字为f
整型变量
不同类型的整型变量所占内存不一样,即表示的整数的范围不同。
基本整型:int
TC下占2个字节(16位),VC下占4个字节(32位)
TC下,int型变量能表示的范围为 -32768~32767
短整型:short
长整型:long
占4个字节
无符号型:unsigned
无符号数只能表示非负数,不能表示负数
unsigned需和其他数据类型配合使用
TC下unsigned int型变量能表示的范围为:0~65535
实型
实型常量
小数
Eg:1.5,.2(0.2),-2.5
指数
由e或E组成
E的左右两边都必须有数字
E的右侧数字必须为整型,不能是小数
Eg:2E+2等价于2×10²,1.5E-3等价于1.5×10ˉ³
实型变量
单精度浮点
float占4个字节
双精度浮点
double占8个字节
字符型
计算机是以ASCII码的形式存储,ASCII码采用8位二进制表示,1个字符占1个字节
字符常量
用单引号括起来的一个字符
Eg:‘a’,‘b’,‘5’,‘#’都是合法的字符常量
特点
必须用单引号括起来,不能用双引号或其他括号括起来。Eg:“a”错误
字符常量只能用单个字符,而不能是多个字符。Eg:'ab' 错误
转义字符
一种特殊的字符常量,以反斜杠“\”开头
字符串常量
由一对双引号括起来的字符序列,Eg:“china”,“1234”
字符串末尾处会自动添加一个‘\0’作为字符串结束标志
Eg:
‘A’字符常量,“A”字符串常量
“ABCD”这个字符串占5个字节
“1234\178\n\t\''”这个字符串占10个字节
“abc\xfh\0123\t\b”这个字符串占10个字节
字符变量
定义字符变量用char这个关键字
不同数据类型的混合运算
强制类型转换
(数据类型)表达式
Eg:
运算符
C语言运算符的优先级和结合性
算术运算符
+,-,×,/,%(求余)
Eg:b²-4ac —〉 b*b-4*a*c
双目运算符
优先级(结合的次序)
*,/,% 高于+,-
结合性(结合的方向)
自左向右
除法运算符 /
a/b
a,b都为整型,结果为整型
Eg:1/2=0;3/2=1;'A'/2=32;
a,b其中一个为实型,或a,b均为实型,结果为实型
Eg:1.0/2=0.5;1/2.0=0.5;1.0/2.0=0.5;
求余运算符 %
运算对象必须为整数
运算结果的正负和%左边数字的正负保持一致
Eg:
5%2=1;7%3=1;3%7=3;
'A'%2=1
-7%3=-1;7%-3=1;
应用
判断奇偶
n%2==0.......n为偶数
n%2==1.......n为奇数
判断整除
n%k==0......n能被k所整除
获取位数
int a=123;
a%10=3......个位数
a/10%10=2......十位数
a/100=1......百位数
赋值运算符 =
变量名=表达式;
左边不能为表达式或常量
Eg:
a+1=2;错误
3=a;错误
区分
初始化
int a=2;
赋值
int a;a=2;
不允许连续初始化
int a=b=2;错误
int a,b;a=b=2;正确
单目运算符
结合性
自右向左
Eg:
复合赋值运算符
+=,-=,*=,%=
优先级
倒数第2,仅高于“逗号”运算符
Eg:
a+=2 —〉 a=a+2
自加自减运算符
++,--
优先级
14,第2高
作用
使变量的值加1或减1
注:++,--的运算对象不允许为常量和表达式
Eg:5++,(a+1)++错误
位置
++,-- 在前
先把变量的值加1或减1,然后再使用变量的值
++,-- 在后
先用变量的值,再把变量的值加1或减1
逗号运算符 ,
表达式1,表达式2,......,表达式n
优先级
最低
结合性
自左向右
自左向右顺序执行每一个表达式,将最后一个表达式n的值作为整体逗号表达式的值。
Eg:
int a=3,b=2; 则表达式a++,a+b,a*2的值为? 8
关系运算符
>,>=,<,<=(10级)==,!=(9级)
结合性:自左向右
表达的值
真(成立)1
假(不成立)0
Eg:
printf("%d\n",2<3)
1
表达式 5>=4-3 的值为?
1
表达式 2<=3!=5 的值为?
1
表达式 5>4>3 的值为?
0
逻辑运算符
&&(与),||(或),!(非)
与0得0;或1得1
优先级
!(14级)>&&(5级)>||(4级)
结合性
&&,|| 自左向右 ,! 自右向左
表达的值
真 1
假 0
Eg:
表达式 !5&&2+1 的值为?
0
表达式 3>2||3+2==3 的值为?
1
表达式 '0' &&1.5 的值为?
1
'0' 为字符常量0,值为48
写出对应的C语言表达式
2<x<3
x>2&&x<3
整数n是一个能被3整除的3位数
n%3==0&&n>=100&&n<=999
整数m是小于整数n的偶数
m<n&&m%2==0
exp!=0 等价于 exp
exp==0 等价于 !exp
exp为C语言中任意表达式
短路运算
Eg:
设有定义语句 int a=1,b=2,c=3; 执行完语句(a>b) && (c=2);后,c的值为?
3
&& 运算,a>b为假,则c=2被短路,不执行
设有定义语句 int a=1,b=2,c=3; 执行完语句(a<b) || (c=2);后,c的值为?
3
|| 运算,a<b为真,则c=2被短路,不执行
int i=-1; i++&&i++&&i++; printf("%d\n",i);
1
int a=0; a||(a=1)||(a=2)||(a=3); printf("%d\n",a);
1
int a,b,c; ++b&&++a||++c; printf("%d,%d,%d\n",a,b,c);
-1,0,0
int a,b,c; a=b=c=-1; ++a||++b&&c++;//优先级高看作一个整体 printf("%d,%d,%d\n",a,b,c);
0,0,-1
条件运算符 ?:
条件?表达式1:表达式2
条件为真执行表达式1,条件为假执行表达式2
优先级
3,仅高于赋值和逗号运算符
结合性
自右向左
Eg:
用C语言描述函数: y=x,x>=0;y=-x,x<0
设定义语句 int a=1,b=2,c=3,d=4; 则表达式 a>b?a:c<d?b:c 的值为?
2
位运算符
位运算的运算对象只能是整型或字符型数据,不能是实型数据
按位与运算 &
0&0=0,0&1=0,1&0=0,1&1=1
与0得0
Eg:
01011100 &11010110 = 01010100
-3
原码:10000011 反码:11111100 补码:11111101
-5
原码:10000101 反码:11111010 补码:11111011
-3&-5=-7
11111101 &11111011 11111001(补码)
补码:11111001 反码:11111000 原码:10000111
&0=清零,&1=保持不变
将高4位清零,低4位保持不变
-2
原码:10000010 反码:11111101 补码:11111110
0xf
补码:00001111
-2&0xf=14
11111110 &00001111 00001110(正数的补码即原码)
判断奇偶
获取数据最后一位,其余清零
按位或运算 |
0|0=0,0|1=1,1|0=1,1|1=1
或1得1
Eg:
a=060=00110000
b=017=00001111
a|b=00111111=63
|1为置1操作,|0保持不变
将低4位置1,高4位保持不变
a=0xf4=11110100
0xf=00001111
b=a|0xf=-1
11110100 | 00001111 11111111(补码)
补码:11111111 反码:11111110 原码:10000001
按位异或运算 ^
0^0=0,0^1=1,1^0=1,1^1=0
Eg:
a=0xa=00001010
b=0x5=00000101
a^b=000011111=15
^0结果不变,^1结果取反
两个相同的数异或运算,结果为0
将变量取反
0xf0=11110000
0xff=11111111
0xf0^0xff=00001111=15
将变量中间取反,其余位保持不变
0x37=00110111
0x3c=00111100
0x37^0x3c=00001011=11
交换两个变量的值
按位取反运算 ~
a=00000101
~a=11111010
b=-6
补码:11111010 反码:11111001 原码:10000110
-3
原码:10000011 反码:11111100 补码:11111101
4=00000100
~4=11111011
~4&-3
11111101 &11111011 11111001(补码)
补码:11111001 反码:11111000 原码:10000111
左移运算 <<
将一个数的各二进制位全部左移若干位
注
对于无符号数左移后右补0;高位左移后溢出,舍弃
Eg:
00000011 3 <<1 00000110 6 <<2 00001100 12
左移1位,扩大2倍
b
00000110 6 <<2 00011000 24
a^b<<2= 00011011=27
右移运算 >>
将一个数的各二进制位全部右移若干位
注
对于无符号数右移后左补0
Eg:
00000100 4 >>2 00000001 1
00000011 3 >>2 00000000 0
00000100 4 >>1 00000010 2 >>2 00000001 1
右移1位,除以2
数据的输入/输出
C语言里面没有输入/输出语句,而是采用输入/输出函数来实现输入/输出功能,基本输入/输出函数定义在头文件stdio.h(函数库)中。
输出函数
printf,putchar(输出字符),puts(输出字符串)
格式化输出函数:printf
Eg:
整型数据输出
%d
int a=123;
指定<原有 原样输出
printf(“a=%2d\n”,a);
a=123
指定>原有 补空格
正的左补
printf(“a=%4d\n”,a);
a=空格123
负的右补
printf(“a=%-4d\n”,a);
a=123空格
实型数据输出
%m.nf
m为总宽度
n为保留到n位小数
float a=12.3456;
默认
printf(“a=%f\n”,a);
a=12.345600 //默认保留6位小数
四舍五入
printf(“a=%9.2f\n”,a);
a=空格空格空格空格12.35 //四舍五入,小数点也占一位
补0
printf(“a=%10.5f\n”,a);
a=空格空格12.34560
字符型数据输出
%c
char ch='A';
printf(“ch=%c\n”,ch);
ch=A
printf(“ch=%d\n”,ch);
ch=65
字符输出函数:putchar
输入函数
scanf,getchar,gets
格式化输入函数:scanf
标准格式输入
输入方式
2空格3<回车>
2<回车> 3<回车>
2空格空格3<回车>
间隔开即可
非标准格式输入
从键盘输入时一定与输入格式保持一致
Eg:
int a,b; scanf("%d,%d",&a,&b); 使得变量a保存数字2,b保存数字3,则正确的输入形式为:2,3<回车>
int a,b; scanf("a=%d,b=%d",&a,&b); 使得变量a保存数字2,b保存数字3,则正确的输入形式为:a=2,b=3<回车>
指定输入数据的宽度
int a,b; scanf("%2d%3d",&a,&b); 从键盘上输入123456,则变量a和变量b中分别存储的数据为? a:12,b:345
注:输入实型数不能指定其小数位的宽度
float c1,c2; scanf("%3.5f",&a);错误 // %3f 正确
字符型数据输入
char c1,c2; scanf("%c%c",&c1,&c2); 使得变量c1保存字符A,变量c2保存字符B,则正确的输入形式为?
A空格B<回车> 错误,空格是一个字符
A<回车> B<回车> 错误,回车也是字符
AB<回车> 正确
char c1,c2; scanf("%c,%c",&c1,&c2); 使得变量c1保存字符A,变量c2保存字符B,则正确的输入形式为?
A,B<回车>
char ch; int a; scanf("%d%c",&a,&ch);//先整后字符 使得变量a保存数字6,变量ch保存字符A,则正确的输入形式为?
6A<回车>
char ch; int a; scanf("%c%d",&a,&ch);//先字符后整 使得变量a保存数字6,变量ch保存字符A,则正确的输入形式为?
A空格6<回车>
A<回车> 6<回车>
A6<回车>
字符输入函数:getchar
获取1个字符
语句
复合语句
用大括号括起来的多条语句
{ 语句1; 语句2; ...... 语句n; }
空语句
;
空语句意味着什么都不做
交换两个变量的值
if 语句
if 单分支
真 执行语句;假 不执行语句
形式
if(条件表达式)语句;
if(条件表达式){语句1;语句2;......语句n;}
Eg:
if 双分支
真 执行语句1;假 执行语句2
形式
if(条件表达式)语句1; else 语句2;
Eg:
if 语句的嵌套
C语言规定C程序中的else总是与其之前未配对的最近的if组成一对。
Eg:
if 多分支语句
if (条件1) 语句1; else if (条件2) 语句2; ...... else if (条件n) 语句n; else 语句n+1;
switch 语句
switch (表达式) { case 常量1:语句; case 常量2:语句; ...... case 常量n:语句; default:语句; }
常量必须为整型常量(整型常量表达式)或字符型常量,不能为实型常量
default(其他) 可有可无,位置任意
根据表达式,找到入口,向下执行全部
Eg:
x=1时
2,2
x=2时
1,2
x=3时
1,1
x=1时
1,1
x=2时
0,1
x=3时
2,2
x=1时
1,1
x=2时
0,1
x=3时
1,1
输入A,输出A
输入b,输出B
输入d,输出ERROR
循环
while 循环
while (条件表达式) 语句;
while (条件表达式) { 语句1;语句2;......;语句n;}
条件为真,执行语句(循环体);条件为假,循环结束
特点
先判断条件,后执行循环体
对于while循环来说,循环体可能一次也不执行
Eg:
do-while 循环
do 语句; while (条件);
特点
先执行循环体,然后再判断条件
循环体至少执行一次
Eg:
for 循环
for(表达式1(初值);表达式2(条件);表达式3(增量))语句;
Eg:
int i; for (i=2;i<=7;i+=2) 语句; 初态 末态
i=2,4,6,8
int i; for (i=1;i<=100;i++) printf("小胡加油!\n");
关键字
break
即可出现在选择结构也可出现在循环结构
作用
结束break所在的循环
Eg:
判断是否为死循环
循环条件永真
运行不到break
判断一个大于1的整数是否为质数
只能被1和本身整除
continue
只能出现在循环结构中
作用
结束本次循环,继续下一次循环
Eg:
循环的嵌套
x=8
编程题
输出100以内能被7整除的正整数
计算1+2+3+4+5
15
计算1+3+5+7+9
25
计算1-3+5-7+9
5
0.83
计算5!
120
计算1!+2!+3!+4!+5!
153
计算5+55+555+5555+55555
61725
计算1~10000以内个位为7且能被3整除的整数之和
1667331
求出所有的水仙花数
3位数
各位数立方之和等于本身
153 370 371 407
求一个整数各个位数之和
将一个整数倒序输出
判断一个正整数是否为回文数
数组
一维数组
输入数据
输出元素
求元素和
奇数输出,偶数不输出
攻擂法
求最大值
求最小值
元素逆置
数组循环左移
2 3 4 5 1
数组循环右移
5 1 2 3 4
输入十进制,输出二进制
冒泡排序法
比较相邻两个数,前>后,交换
核心代码
升序
for(i=0;i<n-1;i++) for(j=0;j<n-1-i;j++) if(a[j]>a[j+1]) 交换a[j]和a[j+1];
降序
for(i=0;i<n-1;i++) for(j=0;j<n-1-i;j++) if(a[j]<a[j+1]) 交换a[j]和a[j+1];
输入十个学生成绩(整型),输出低于平均分的个数
打分系统
输入十个分数(实型),去掉一个最高分,去掉一个最低分,求出剩下分数的平均分,输出(保留2位小数)
二维数组
遍历元素
求和
交集
1 2 3 4 5 6 7 8 9
16
列<=行
1 2 3 4 5 6 7 8 9
34
列>=行
1 2 3 4 5 6 7 8 9
26
输出元素
主对角线
1 2 3 4 5 6 7 8 9
副对角线
1 2 3 4 5 6 7 8 9
求最大值
函数
定义一个函数,功能是输出n个*
实现1!+2!+3!+4!+5!
5
值传递,值不变
对一维数组每个元素相加求和
求一维数组最大值
函数的递归调用
函数自己调用自己
直接
间接
阶乘
0!=1
n=0时,fun(0)=1 n!=0时,fun(n)=n*fun(n-1)
720
斐波那契数列
从第3个数开始,都是前两个数之和
1 1 2 3 5 8 13 21
fun(1)=fun(2)=1 n!=1且n!=2时,fun(n)=fun(n-2)+fun(n-1)
01234
函数的声明
函数首部;
总结
函数是构成C程序的最基本单位
C程序开始于主函数,最后回到主函数,主函数的位置可以任意。
函数不能嵌套定义,但是可以嵌套调用。
函数可以调用自己本身,这个叫做函数的递归调用。
函数默认的类型是int型,int可省
函数实参和形参各自占用独立的存储空间
函数可以没有形参,形参必须是变量,实参没有要求
函数参数传递
值传递
不改变
地址传递
有取内容运算,值改变
无内容运算,值不变
通过return语句,函数只能带回一个返回值,若函数的类型为void型,代表该函数无返回值
函数的返回值的数据类型应和函数的类型保持一致,若不一致,以函数类型为准。
函数应先定义,后调用
指针
指针变量的引用
int a=2,b=3,t; int *p=&a,*q=&b;//*在定义语句里,*只代表p是指针 t=*p;*p=*q;*q=t;
交换a和b的值
a=3 b=2
int a=2,b=3; int *p=&a,*q=&b,*t;//把a的地址赋值给p而不是*p t=p;p=q;q=t;
交换指针的值
a=2 b=3 *p=3 *q=2
3
指针和一维数组
表示方式
一维数组元素
&a[i]
a+i
一维数组元素地址
a[i]
*(a+i)
Eg:
int a[]={1,3,5,7,9,11,13},*p=a+1; p[0]=3;p[2]=7;*p+2=5;*(p+5)=13
int a[5]={1,3,5,7,9},*p=a;
printf("%d",*p++);
*(p++),作用于指针
1
printf("%d",*++p);
*(++p)
3
printf("%d",++*p);
++(*p),作用于元素
2
数组的逆置
指针和二维数组
表示方式
元素
a[i][j]
*(*(a+i)+j)
*(a[i]+j)
元素地址
&a[i][j]
*(a+i)+j
a[i]+j
Eg:
int a[3][3]={1,2,3,4,5,6,7,8,9}; **a=1;*a[1]=4;*(*(a+2)+2)=9;*(*a+1)=2;*(a[2]+1)=8
int a[3][3]={1,2,3,4,5,6,7,8,9},*p=a[1]+1; p[1]+p[3]=6+8=14
指针数组
本质为数组,该数组的每个元素为指针变量,存储的是地址
Eg:
数组指针
本质是指针,该指针指向了一个一维数组(行指针)
int (*p)[3];
p为指针名,该指针指向了一个具有3个元素的一维整型数组
Eg:
int a[2][3]={1,2,3,4,5,6}; int (*p)[3]; //定义了一个数组指针 p=a; p[1][1]=5 //a[1][1]
地址传递
2
最值
36,16,19
15
指针函数
本质是函数,该函数的返回值为地址
函数指针
本质是指针
int (*p)( );
括号不可省
p的本质为指针
p为函数指针
p指向了一个int型函数
字符串
字符串结束标志
‘\0’
字符串的输入
char c[10]; scanf("%s",c);
scanf 无法输入带空格的字符串
c代表首地址,不用加&
char c[10]; gets(c);
gets可以输入带空格的字符串
字符串的输出
char s[]='ABCD'; printf("%s\n",s);
输出时遇到第一个'\0',结束输出
char s[]="ABCD";
puts(s);
ABCD
puts(s+1);
BCD
Eg:
遍历字符串元素
大写转小写
大写字母+32=小写字母
求字符串的长度
字符串函数
strlen
字符串长度函数
计算字符串长度不包括‘\0’
char s[]="ABCDE"; strlen(s)=5
char s[]="ABC\0DEF"; strlen(s)=3
char s[]="ABC\108c\n\xab"; strlen(s)=8
\ddd 八进制
\xhh 十六进制
关键字 sizeof
计算数据所占的字节数或计算数据类型所占字节数
计算字符串字节数包括‘\0’
char s[]="ABCDE"; sizeof(s)=6,strlen(s)=5
char s[10]="ABCDE"; sizeof(s)=10,strlen(s)=5
strcpy
字符串复制函数
将后者字符串复制到前者
strcat
字符串连接函数
将后者连接到前者
strcmp
字符串比较函数
比较两个字符串大小
两个字符串相等
结果为0
前者大于后者
结果>0(正数)
前者小于后者
结果<0(复数)
变量
变量的作用域
局部变量
也称内部变量,指在一个函数内部或复合语句内部定义的变量
作用域
定义该变量的函数或定义该变量的复合语句
全局变量
也称外部变量,指在函数外部定义的变量
作用域
从定义该变量的位置到整个程序的结束
变量的存储类
根据变量在内存中的生命周期,可分为动态变量和静态变量。
自动型:auto
默认类型,可省
自动型为动态存储方式,在函数调用结束后释放内存
Eg:auto int a;
静态型:static
可设置变量和函数只在当前文件被使用
静态变量的初始化是在编译阶段
静态局部变量在函数调用结束后不释放,其值保留
Eg:static int a;
寄存器型:register
外部型:extern
Eg:
编译预处理
在编译之前进行的处理
C语言的预处理包括3种:宏定义,文件包含和条件编译
预处理命令以符号“#”开头,且每行只能写一条预处理命令
预处理不是C语句,故结尾处不加分号
宏定义
不带参数的宏
#define 宏名 替换文本
Eg:
#define PI 3.1415926
在编译前把程序中的所有PI都替换成3.1415926
宏名一般用大写,宏定义可以嵌套
Eg:
宏定义的核心是替换,宏只做替换,不做计算,不做表达式求解,所以不能在宏里面进行计算。
带参数的宏
#define 宏名(参数) 替换文本
#define F(X) X*X 设有定义语句 int a=6,b=2;
F(a)+F(b)=a*a+b*b=40
F(a+b)=a+b*a+b=20
F(a)/F(b)=a*a/b*b=36
Eg:
文件包含
在C语言中文件包含是指一个源文件可以将另一个源文件的全部内容包含进来。
改命令的作用是将指定源文件的内容复制到当前文件中
格式
#include<文件名>
<>在系统指定的目录查找被包含文件(一般用于库函数)
#include" 文件名 "
“”首先到当前目录下(用户目录)查找被包含的文件,如果没有找到,再到系统指定的目录查找。
常见的库函数
#include<stdio.h>
printf,scanf,putchar,getchar,puts,gets
#include<string.h>
strlen,strcmp,strcat,strcpy
#include<math.h>
sqrt(开平方函数)
条件编译
结构体
typedef
为数据类型起别名
Eg:
typedef int IN;
IN a;和 int a;是等价的
typedef char * IP
IP q;等价于 char *q;
定义结构体数据类型
结构体是由一批数据组合而成的一种新的数据类型
组成结构体的每个数据成为结构体的成员
格式
struct 标识符 { 成员1; 成员2; ...... 成员n; };
struct student { int age; char name[20]; float math; };
定义结构体变量
先定义结构体数据类型,再用该结构体数据类型定义结构体变量
结构体数据类型不占用内存,结构体变量占内存
Eg:
用 typedef 给结构体数据类型取别名, 用该别名定义结构体变量:
定义结构体数据类型的同时顺便定义结构体变量
结构体的初始化
结构体变量的初始化
struct student { int age; char name[20]; }stu={18,"Mike"};
结构体数组的初始化
struct student { int age; char name[20]; }s[3]={18,"Mike",20,"Jack",19,"Lily"}
结构体成员的引用
格式
结构体变量 . 成员名
(*结构体指针). 成员名
结构体指针→成员名
Eg:
struct student { int age; char name[20]; }stu={18,"Mike"},*p=&stu;
printf("%d\n",stu.age);
stu的age这个成员
18
puts(stu.name);
Mike
putchar(stu.name[0]);
stu的name成员的首元素
M
补充题型
struct date { int year; int month; int day; }today;
结构体总字节数=各成员字节数之和
在VC环境下,sizeof(today)=12
struct sc { int a; char s[4]; }b,*p=&b;
在VC环境下,sizeof(b)=8,sizeof(p)=4
VC下指针4个字节;TC下指针2个字节
文件
文件指的是存储在外部介质(Eg:磁盘)上数据的集合,操作系统以文件为单位对数据进行管理。程序与数据的交互是以流的形式进行的,进行C语言文件的存取时,都会先进行“打开文件”操作,这个操作就是在打开数据流,而“关闭文件”操作就是关闭数据流。
C语言的文件处理功能依据系统是否设置“缓冲区”分两种:①设置缓冲区②不设置缓冲区。当使用标准I/O函数(包含在头文件stdio.h中)时,系统会自动设置缓冲区,并通过数据流来读写文件,当进行文件读取时,不会对磁盘进行读取,而是先打开数据流,将磁盘上的文件信息拷贝到缓冲区,然后程序再从缓冲区中读取所需的数据。
文件类型
文本文件
以字符编码的方式进行保存
二进制文件
将内存中数据原封不动放至文件中,适用于非字符为主的数据,如果用记事本打开,只会看到一堆乱码。
C语言文件操作
fopen 函数
文件的打开
格式
FILE *fp;//定义一个文件指针fp fp=fopen (文件名,使用文件方式);
fp=fopen ("work.txt","r");
fp=fopen ("D:\\windows\\work.txt","w");
注
如果文件打开失败,fopen函数返回NULL(值为0)
常用打开文件模板
FILE *fp; if((fp=fopen("file","r"))==NULL) { printf("打开文件失败!\n"); exit(0); //退出程序 }
使用文件方式
文本文件
“r”只读
前提:文件一定要存在
“w”只写
①不存在,即新建
②存在,即覆盖
“a”追加
在文件尾添加数据
读写
“r+”
“w+”
“a+”
二进制文件
“rb”只读
“wb”只写
“ab”追加
读写
“rb+”
“wb+”
“ab+”
fclose 函数
文件的关闭
格式
fclose (文件指针);
Eg:fclose (fp);
fputc 函数
把一个字符写到文件上去
格式
fputc (ch,fp);
从键盘上输入一个字符串写到文件中
fgetc 函数
从一个文件上读入一个字符
格式
ch=fgetc (fp);
从文件中以此获取字符并输出显示到电脑屏幕上
feof
C语言标准库函数,其原型在stdio.h中
功能
检测流上的文件结束符
如果文件结束,则返回非0值,否则返回0
fprintf 函数
fprintf(文件指针,格式字符串,输出列表);
fscanf 函数
fscanf(文件指针,格式字符串,输入列表);
Eg:
fgets 函数
从文件读入一个字符串
Eg:
char s[10]; fgets(s,5,fp);//获取n-1个,有一个'\0'。
fputs 函数
向文件输出一个字符串
Eg:
fputs("hello",fp);
从文件1读入10个字符,写入文件2中
rewind 函数
使位置指针重新返回文件的开头
Eg:
rewind(fp);