一、重难点运算符详解
赋值运算符(=)
逻辑非运算符(!)
取反运算符(~)
函数调用运算符(())
运用方法:函数调用中函数名后面加个小括号
类型转换运算符(())
英文名称:cast operator
运用方法:(类型名)a 把a的值转换为指定数据类型对应的值
sizeof运算符
英文名称:sizeof operator
运用方法:sizeof a 求a(对象、常量、类型名等)的长度
按位与运算符(&)(bitwise AND operator)
按位或运算符(|)(bitwise inclusive OR operator)
按位异或运算符(^)(bitwise exclusive OR operator)
按位求反运算符(~)(~operator)
附加解释 用于整数内部的位的4种逻辑运算
取址运算符(&)
英文名称:address operator
运用方法:&a 取得a的地址(生成指向a的指针)
附加解释:(例:isako=&sanaka:即isako指向sanaka,isako喜欢sanaka)表示对象地址的转换说明为%p;将取址运算符&写在Type型对象x前得到的&x为Type*型指针,其值为x的地址。
指针运算符(*)
运用方法:*a a指向的对象
附加解释:(即:当p指向x时,*p就是x的别名);也称间接访问运算符(在c语言中,指针的一个重要作用就是作为函数参数使用,间接改变变量);int *isako,hiroko(*isako是指针变量,hiroko是整型变量*)。
下标运算符([])
附加解释:双目运算符;其中一个操作数的类型是:指向Type型对象的指针。另一个操作数的类型是:整数类型数据类型。且下标运算符[]的操作数的顺序是随意的,而结果一样。
句点运算符(.)
运用方法:a.b 表示结构体a的成员b
附加解释:(示例)访问对象sanaka的成员height的方法:sanaka.height【对象名(变量名).成员名】。
箭头运算符(->)
运用方法: a->b 用指针访问结构体a中的成员b
附加解释:即(*p).m简写为p->m。句点运算符和箭头运算符统称为访问运算符(member-access operator)。
二、C语言中重要的符的补充
类型修饰符(const)
英文名称:type qualifier
运用方法:声明形参的时候在形参前加上const
附加解释:禁止在函数内修改接收到的数组内容
存储类说明符(static)
英文名称:storage duration specifier(static)
运用方法:在即将声明的变量前加上static
附加解释:使变量被赋予了静态存储器
类型说明符(unsigned;signed)
英文名称:类型说明符(type specifier);无符号整型(unsigned integer type);有符号整型(signed integer type)
运用方法:在即将声明的变量前加上unsigned/signed
附加解释:unsigned:表示0和正数的整型
signed:表示0和正负数的整型
与signed和unsigned相同,short和long也是一种类型说明符。
精华总结:signed和int可以省略。即有符号和整型可以省略。
三、C语言中重要的函数的补充
toupper函数:转换为大写字母
头文件 #include <ctype.h>
原型 int toupper(int c);
说明 将小写英文字母转换为相应的才写英文字母。
返回值 若c是小写英文字母,则返回转换后的大写字母,否则直接返回c。
tolower函数:转换为小写字母
头文件 #include <ctype.h>
原型 int tolower (int c);
说明 将大写英文字母转换为相应的小写英文字母。
返回值 若c是大写英文字母,则返回转换后的小写字母,否则直接返回c。
strlen函数:求字符串的长度
strlen 函数是求字符串长度的函数,该函数返回不包含 null字符在内的字符串长度。
头文件 #include <sthrng.h>
原型 size_t strlen (const char *s)
说明 求出s指向的字符串的长度(不包括nu11字符)
返回值 返回s指向的字符串的长度
strcpy 函数:复制字符串
strcpy 函数、strncpy 函数是复制字符串的函数。使用后者还可以对要复制的字符数设限。
头文件 #include <string.h>
原型 char *strcpy(char *s1, const char *s2);
说明 将s2指向的字符串复制到s1指向的数组中。若s1和s2指向的内存空间重叠,则作未定义处理。
返回值 返回s1的值。
strncpy函数:复制字符串
头文件 #include <string.h>
原型 char *strncpy (char *sl, const char *s2, size_t n);
说明 将s2指向的字符串复制到s1指向的数组中。若s2的长度大于等于n,则复制到第n个字符为
止。否则用null字符填充剩余部分。若a1和s2指向的内存空间重叠,则作未定义处理。
strcat 函数:连接字符串
strcat 函数、strncat 函数是在已有的字符串后连接别的字符串的函数。使用后者还可以对要连接的字符串个数设限。
头文件 #include <string.h>
原型 char *strcat (char *s1, const char *s2)
说明 将s2指向的字符串连接到g2指向的数组末尾。若s1和s2指向的内存空间重叠。
返回值返回s1的值。
strncat函数:连接字符串
头文件 #include <string.h>
原型 char *strncat (char *sl, const char *s2, size t n)
将s2指向的字符串连接到s1指向的数组末尾。若s2的长度大于n则截断超出部分。若s1和s2
指向的内存空间重叠,则作未定义处理。
返回值 返回s1的值。
strcmp 函数:比较字符串的大小关系
strcmp 函数和strncmp 函数是对两个字符串的大小关系进行比较的函数。
头文件 #include <atring.h>
原型 int strcmp (const char *s1, const char *s2)
说明 比较s1指向的字符串和s2指向的字符事的大小关系(从第一个字符开始逐一进行比较,当出
现不同的字符时,便可确定这些字符的大小关了)。
返回值 若s1和s2相等,则返回0;若s1大于s2,则返回正整数值:若s1小于s2,则返回负整数值。
strncmp函数:比较字符串的大小关系
头文件 #include <string.h>
原型 int strncmp(const char *sl, const char *s2, size_t n)
说明 比较s1指向的字符的数组和s2指向的字符的数组的前n个字符的大小关系。
返回值 若s1和s2相等,则返回0;若s1大于s2,则返回正整数值:若s1小于s2,则返回负整数值。
atoi 函数:转换字符串
头文件 #include <stdlib.h>
原型 int atoi (const char *nptr)
说明 将nptr指向的字符串转换为int型表示
返回值 返回转换后的值。结果值不能用int型表示时的处理未定义。
atol函数:转换字符串
头文件 #include <stdlib.h>
原型 long atol (const char *nptr)
说明 将nptr指向的字符串转换为long型表示
返回值 返回转换后的值。结果值不能用long型表示时的处理未定义。
atof函数:转换字符串
头文件 #include <stdlib.h>
原型 double atof (const char *nptr)
说明 将nptr指向的字符串转换为double型表示
返回值 返回转换后的值。结果值不能用double型表示时的处理未定义。
fopen函数:打开文件
头文件 #include <stdio.h>
原型 FILE *fopen (const char *filename, const char *mode)
说明 打开文件名为filename所指字符串的文件,并将该文件与流相关联。实参mode指向的字符串,以下述字符序列中的某一项开头。(示例)fp=fopen(“abc.txt”,“r”);
r 以只读模式打开文本文件。
w 以只写模式建立文本文件,若文件存在则文件长度清为0。
a 以追加模式(从文件末尾处开始的只写模式)打开或建立文本文件。
rb 以只读模式打开二进制文件。
wb 以只写模式建立二进制文件,若文件存在则文件长度清为0。
ab 以追加模式(从文件末尾处开始的只写模式)打开或建立二进制文件。r+以更新(读写)模式打开文本文件。
w+以更新模式建立文本文件,若文件存在则文件长度清为0。
a+以追加模式(从文件末尾处开始写入的更新模式)打开或建立文本文件。
r+b或rb+以更新(读写)模式打开二进制文件。
w+b或wb+以更新模式建立二进制文件,若文件存在则文件长度清为0。
a+b或ab+以追加模式(从文件末尾处开始写入的更新模式)打开或建立二进制文件。
以读取模式(mode以字符开头)打开文件时,如果该文件不存在或者没有读取权限,则文件打开失败。
对于以追加模式(mode以字符a开头)打开的文件,打开后的写入操作都是从文件末尾处开始的。此时fseek函数的调用会被忽略。在有些用nu11字符填充二进制文件的编译器中,以追加模式(mode以字符a‘开头,并且第2或第3个字符是'b')打开二进制文件时,会将流的文件位置指示符设为超过文件中数据末尾的位置。
对于以更新模式(mode的第2或第3个字符为+)打开的文件相关联的流,可以进行输入和输出操作。但若要在输出操作之后进行输入操作,就必须在这两个操作之间调用文件定位函数(fseek、fsetpos或rewind)。除非输入操作检查到文件末尾,其他情况下若要在输入操作之后进行输出操作,也必须在这两个操作之间调用文件定位函数。有些编译器会将以更新模式打开(或建立)文本文件改为以相同模式打开(或建立)二进制文件,这不会影响操作。
当能够识别到打开的流没有关联通信设备时,该流为全缓冲。打开时会清空流的错误指示符和文件结束指示符。
返回值 返回一个指向对象的指针,该对象用于控制打开的流。打开操作失败时,返回空指针。
fclose函数:关闭文件
头文件 #include <stdio.h>
原型 int fclose(FILE *stream);
说明 刷新stream所指向的流,然后关闭与该流相关联的文件。流中留在缓冲区里面尚未写入的数据会被传递到宿主环境(即可使程序正常运行的计算机环境),由宿主环境将这些数据写入文件。而缓冲区里面尚未读取的数据将被丢弃。然后断开流与文件的关联。如果存在系统自动分配的与该流相关联的缓冲区,则会释放该缓冲区。(示例)fclose(fp);
返回值 若成功地关闭流,则返回0。检查到错误时返回EOF。
fscanf函数:从文件读取数据
头文件 #include <stdio.h>
原型 int fscanf(FILE *stream, const char *format,...);
说明 从stream指向的流(而不是从标准输入流)中读取数据。除此以外,与scanf函数完全
相同。(示例)fscanf(fp,"%d",&x),只比scanf函数多了1个参数,即输入流。
返回值 若没有执行任何转换就发生了输入错误,则返回宏定义EOF的值。否则,返回成功赋值的输入项数。若在输入中发生匹配错误,则返回的输入项数会少于转换说明符对应的实参个数,甚至为0。
fprintf函数:从文件写入数据
头文件 #include <stdio.h>
原型 int fprintf(FILE *stream, const char *format,...);
说明 向stream指向的流(而不是标准输出流)写入数据。除此以外,与printf函数完全相同。(示例)fprintf(fp,"%d",&x),……
返回值 返回发送的字符数。当发生输出错误时,返回负值。
time函数:获取当前日历时间
说明 三种调用方式都可将当前时间存储在变量current中。
原型 A:time(¤t);B:current=time(NULL);C:current=time(¤t);
localtime函数:从日历时间转换为分解时间
说明 timer=localtime(¤t)
fgetc函数:从文件读取字符
头文件 #include <stdio.h>
原型 int fgetc(FILE *stream);
说明 从stream指向的输入流(若存在)中读取unsigned char型的下一个字符的值,并将它转
换为int型。然后,若定义了流的文件位置指示符,则将其向前移动。比getchar函数增加了一个参数,即输入流。(示例)fgetc(fp);
返回值 返回stream所指输入流中的下一个字符。若在流中检查到文件末尾,则设置该流的文件结
束指示符并返回EOF。如果发生读取错误,就设置该流的错误指示符并返回EOF。
fputc函数:从文件返回字符
头文件 #include <stdio.h>
原型 int fputc(int c, FILE *stream);
说明 将c指定的字符转换为unsigned char型后写入stream指向的输入流。此时如果定义了流的文件位置指示符,就会向指示符指向的位置写入字符,并将文件位置指示符适当地向前移动。在不支持文件定位或者以追加模式打开流的情况下,总是以向输出流的末尾追加字符的方式进行字符输出。比putchar函数增加了第二个参数,即输入流。(示例)fputc(ch,dfp);
返回值 返回写入的字符。如果发生写入错误,就设置该流的错误指示符并返回EOF。
fwrite函数:用于数据的写入
fwrite函数和fread函数会接收4个参数。第一个参数是指向读写数据的首地址的指针,第二个参数是数据的长度,第三个参数是数据的个数,第四个参数是指向读写对象的指针;(示例)fwrite/fread(&pi,sizeof(double),1,fp)
头文件 #include <stdio.h>
原型 size_t fwrite (const void *ptr, size_t size, size_t nmemb, FILE *stream)
说明 从ptr指向的数组中将最多nmemb个长度为size的元素写入stream指向的流中。若定义了流的文件位置指示符,则以成功写入的字符数为单位向前移动。当发生错误时,该流的文件位置指示符的值不可预测。
返回值 返回成功写入的元素个数。仅当发生写入错误时,元素个数会少于nmemb。
fread函数:用于数据的读取
头文件 #include <stdio.h>
原型 size_t fread (const void *ptr, size_t size, size_t nmemb, FILE *stream)
说明 从stream指向的流中最多读取nmemb个长度为size的元素到ptr指向的数组。若定义了流的文件位置指示符,则以成功读取的字符数为单位向前移动。当发生错误时,该流的文件位置指示符的值不可预测。只读取到某一元素的部分内容时,值不可预测。
返回值 返回成功读取的元素个数。当发生读取错误或达到文件末尾时,元素个数会少于nmemb。
若size或nmemb为0,则返回0。这时数组内容和流的状态都不发生变化。
isprint函数:
头文件 #include <ctype.h>
原型 int isprint(int c);
说明 判断字符c是否为可打印字符(含空格)。
返回值 若判断成功则返回0以外的值(真),否则返回0。
四、巧用对比记忆法解决C语言中的易混项
printf函数与scanf函数 部分使用区别
int型 double型
使用printf函数显示 printf("%d",no) printf("%f",no)
使用scanf函数读取 scanf("%d",&no) scanf("%lf",&no)
‘*’和“*”的区别
字符常量‘*’
字符串常量“*”
详细解释 (1)定界符不同。字符常量使用单引号,而字符串常量使用双引号。
(2)长度不同。字符常量的长度固定为1,而字符串常量的长度,可以是0,也可以是某个整数。
(3)存储要求不同。字符常量存储的是字符的ASCII码值,而字符串常量除了要存储有效的字符外,还要存储一个结束标志’\0’。
for、while、do-while的区别
break语句和continue语句的区别
break语句:终止整个循环语甸
continue 语句:只结束本次循环
详细解释 break语句能额外用在switch语句中来终止switch语句
定义声明与非定义声明区别
定义声明:创建出变量实体的声明
非定义声明:未创建出变量实体的声明
自动存储器与静态存储器的区别
自动存储期:在函数中不使用存储类说明符static而定义出的对象(变量)
详细解释 被赋予了自动存储期(automatic storage duration),程序执行到对象声明的时候就创建出了相应的对象。而执行到包含该声明的程序块的结尾,也就是大括号1的时候,该对象就会消失。
也就是说,该对象拥有短暂的寿命,另外,如果不显式地进行初始化,则该对象会被初始化为不确定的值。
静态存储期 在函数中使用static定义出来的对象,或者在函数外声明定义出来的对象都被赋予了静态存储期(static storage duration)
在程序开始执行的时候,具体地说是在main函数执行之前的准备阶段被创建出来,在程序结束的时候消失。也就是说,该对象拥有“永久”的寿命。另外,如果不显式地进行初始化,则该对象会自动始化为0。
算术类型
![](https://i-blog.csdnimg.cn/blog_migrate/623fcb32eeaba1571af567fabe8a2e55.png)
整数类型数据类型:只表示整数
浮点数:可表示具有小数部分的数值
枚举型:值的集合(一般指的是整型与常数)
字符型:表示字符
整型:表示整数
附加解释 字符型、整型和浮点型只需使用int或double等关键字就能表示其数据类型,因此将它们统称为基本数据类型(basic type)。
用于整数内部的位的4种逻辑运算(按位操作的逻辑运算)
按位与运算符(&)(bitwise AND operator):两者都为1时结果为1
按位或运算符(|)(bitwise inclusive OR operator):只要有一个为1,结果就为1
按位异或运算符(^)(bitwise exclusive OR operator):有且只有一个为1结果才为1
按位求反运算符(~)(~operator):正常求反呗
附加解释 &、|、~运算符会根据1位真、0为假的规则对操作数的各二进制位进行逻辑运算;
&&、||、!运算符会根据非0为真、0为假的规划对操作数的值进行逻辑运算;
有符号整数的三种最常见的内部表示法
补码:反转所有位后加一
反码:反转所有位
符号和绝对值:将符号位由0变为1,其他位不变
对象式宏和函数式宏的区别
对象式宏:#define a b (将该指令之后的a替换为b)。(示例)#define NUMBER 5
函数式宏:#define sqr(x) ((x)*(x)) (计算x的平方的函数式宏)。
附加解释 对象式宏是指对对象赋值,函数式宏是对函数赋予意义。
枚举名和类型名的区别
![](https://i-blog.csdnimg.cn/blog_migrate/0ae07d28a88f1320e9b9cea2d8858f8c.png)
“int型变量”和“指向int型变量的指针变量”有什么区别?
int型变量:保存“整数”的盒子
指向int型变量的指针变量:保存“存放整数对象的地址”的盒子
标量型
包括算术类型和指针类型
用数组实现的字符串与用指针实现的字符串的区别
用数组实现的字符串 char str[] ="ABC"
用指针实现的字符串 *ptr[] ="123"
附加解释 对数组不能赋值,对指针能赋值
数组和结构体的区别(统称为聚合类型)
元素类型 数组用于高效地操作“相同类型”数据的集合。而结构体这种数据结构通常用于高效地操作“不同类型”数据的集合(当然,偶尔也会有成员类型全部相同的情况)。
可否赋值 即便两个数组的元素个数相同,也不能相互赋值。但是,相同类型的结构体可以相互赋值。如右图所示,y中的所有成员都赋给了x中相应的成员。
三种标准流的区别
stdin—标准输入流(standard input stream)
用于读取普通输入的流。在大多数环境中为从键盘输入。scanf 与getchar 等函数会从这个流中读取字符。
stdout —标准输出流(standard output stream)
用于写入普通输出的流。在大多数环境中为输出至显示器界面。printf、puts与putchar等函数会向这个流写入字符。
stderr —标准错误流(standard error stream)
用于写出错误的流。在大多数环境中为输出至显示器界面。
附加解释 我们之所以能够如此简单方便地执行使用了流的输入输出操作,是因为C语言程序在启动时已经将标准流(standard stream)准备好了。表示标准流的stdin、stdout、stderr函数都是指向FILE型的指针型。FILE型是在<stdio.h>头文件中定义的。
打开文件时可以指定以下四种模式
只读模式--只从文件输入
只写模式--只向文件输出
更新模式--既从文件输入,也向文件输出
追加模式--从文件末尾处开始向文件输出
五、C语言中额外重要的概念解释
转换说明的结构
![](https://i-blog.csdnimg.cn/blog_migrate/120308c877245cfbdb0b936f6aac6516.png)
0标志:设定了0标志之后,如果数值的前面有空余位,则用0补齐位数(如果省略了0标志,则会用空白补齐位数)。
最小字段宽度:也就是至少要显示出的字符位数。不设定该位数或者显示数值的实际位数超过它的时候,会根据数值显示出必要的位数。另外,如果设定了“”,数据会左对齐显示,未设定则会右对齐显示。
精度:指定显示的最小位数,如果不指定,则整数的时候默认为1,浮点数的时候默认为6。
转换说明符:d…显示十进制的int型整数。
f…显示十进制的double型浮点数。
附加解释 为了在画面中显示字符串,需要把printf函数的转换说明设为%s。显示的位数、左对齐或右对齐等,可以通过输出最小宽度和精度来指定。
短路求值
像这样,在仅根据左操作数的判断结果就可知逻辑表达式的判断结果的情况下,不会对右操作数进行判断,这就称为短路求值。
函数原型声明
像这样明确记述了函数的返回类型,以及形参的类型和个数等的声明称为函数原型声明。
头文件,文件包含指令
包含库函数的函数原型声明的<stdio.h>成为头文件,而取得头文件内容#include指令称为文件包含指令
ON/OFF信号
即1和0
typedef声明
typedef声明是创建数据类型的同义词的声明(而非创建新的数据类型)。
为已有的类型A 创建别名B。B将作为类型名使用。该名称一般称为typedef名。
指数和尾数(长度和精度)
浮点型的”表示范围“是由长度和精度共同决定的
![](https://i-blog.csdnimg.cn/blog_migrate/6755329dca01273b481868e1bfe5d114.png)
其中1.23457称为尾数,9称为指数。尾数的位数相当于“精度”,指数的值相当于“长度”。
优先级和结合性
优先级:运算符一览表中,运算符越靠上,优先级越高
![](https://i-blog.csdnimg.cn/blog_migrate/7199b40b891526e8d79a7c33e43f2daa.png)
结合性:左结合性和右结合性
命名空间
命名空间的分类有以下四种
(1)标签(label)名
(2)小标签(tag)名
(3)成员名
(4)一般性标识符
![](https://i-blog.csdnimg.cn/blog_migrate/cccfeb9717f25c1a3b1ffd0870699e9f.png)
像这样,只要不属于同一个命名空间,即使在同一有效范围内使用相同的名字,也不会产生任何问题。
(示例)枚举名和变量名分别属于不同的命名空间(name space),因此即便名称相同也能正确区分。打个比方,人名里的福冈和地名里的福冈,虽然名字相同但是性质不同,所以可以区分清楚。如果说“我去福冈”,马上就能知道指的是地名。
递归
所谓递归(recursive),就是将自己包含在内,或者用自己来定义自己。
辗转相除法
![](https://i-blog.csdnimg.cn/blog_migrate/182a4c745f70a577f2b5dde4ef8dd885.png)
将两个整数值作为长方形的边长。用以短边为边长的正方形来填充该长方形,然后对剩余部
分的长方形重复进行同样的操作。当长方形被正方形填满时,该正方形的边长就是之前提到的两
个整数值的最大公约数。
缓冲
并不是每读入一个字符后就马上输出,而是在按下口键后一并输出。c语言的输入输出一般会将读入的字符以及待输出的字符暂时保存在缓存中,当达到下列条件时才进行实际的输入输出操作。
A缓存已满
B输入换行符
当然,也有下面这样的环境。
C 立即输出
这些方式分别称为A全缓冲、回行缓冲、回无缓冲。
数据溢出(溢位)与异常
因数据溢出(overflow)(溢位)使运算结果超出可表示的数值范围或违反数学定义(除以0等)时会发生异常(exception)。
(示例)x和y中保存的值可以用int 型来表示,但是赋给2的50000却超出了int 型的表示范围。
发生异常时程序如何运行是由编译器决定的。
字符串字面量和空字符串
想“ABC”那样带双引号的一系列字符成为字符串字面量
空字符串
在字符串字面量的末尾会被加上一个叫作nu11字符的值为0的字符。用八进制转义字符表示nul1字符就是‘\0’。若用整数常量来表示就是0。
解引用
通过在指针前写上指针运算符*来访问该指针指向的对象
六、C语言中的其他小知识点
scanf函数和指针的联系
scanf函数的使命是主调函数中定义的对象保存值。倘若它接收到的纯粹是变量的“值”,是无法保存的。因此,scanf函数接收到的是指针(具有地址的“值”),由该指针所指对象保存从标准输入(一般为键盘)读到的值。因此,调用scanf函数的一方必须发出如下请求。请放入该地址中存储的对象所读取的值!!
数组名原则上会被解释为指向该数组起始元素的指针。
在下述两种情况下,数组名不会被视为指向起始元素的指针。1 作为sizeof运算符的操作数出现时:(数组名)不会生成指向起始元素的指针的长度,而是生成数组整体的长度。2 作为取址运算符&的操作数出现时:&数组名不是指向起始元素的指针的指针,而是指向数组整体的指针。
以下4个表达式都是访问各元素的表达式。a[i] *(a+i) p[i] *(p+i);
以下4个表达式都是指向各元素的指针。&a[i] a+i &p[i] p+i;
综上可得:*+&=无;
Type*型指针p指向Type型数组a的起始元素a[0]时,指针p的行为就和数组a本身一样。
指针之间不可相加可相减;
赋值表达式的左操作数不可以是数组名。(否则,数组的地址就会改变);
“指针和数组的密切关系”。
除一部分特殊情况之外,数组名都会被解释为指向该数组起始元素的指针。也就是说,如果a是数组,那么数组名a就是&a[0]。
char ss[5][12]; /*元素类型为char[12]、元素个数为5的数组*/;
同一种类型的数据的集合是数组,多种类型的数据的集合是结构体;
声明结构体时所赋的初始值的形式是,将各个结构体成员的初始值依次排列在{}里面,并用逗号分割。未赋初始值的成员被初始化为0。例:struct student takao={"Takao",173,86.2};
结构体中的 类型名、结构名、结构体成员
![](https://i-blog.csdnimg.cn/blog_migrate/74a63bf8f90721f3ed7cfb9c7e3da526.png)
派生类型
“结构体”聚合了各种类型的对象。这里创建了结构体集合的“数组”。像这样,在C语言中可以组合各种方法创建出无穷的数据类型。通过这种方式创建的数据类型称为派生类型(derived type)。能够通过派生创建的类型如下(可以自由组合)。
数组类型(array type) 将某一种元素类型对象的集合分配在连续的内存单元中。
结构体类型(structure type) 按成员的声明顺序分配内存单元。各成员的数据类型可以不同。
共用体类型(union type) 不同的成员可以放入同一段内存单元,使之相互重叠。
函数类型(function type) 由1个返回类型和0个以上的形参及其数据类型构成。
指针类型(pointer type) 创建为指向对象或函数的数据类型。
成员和构成成员(无法再进行分解的成员)
流(stream) 针对文件、画面、键盘等的数据的输入输出操作,都是通过流进行的。我们可以将流想象成流淌着字符的河。
使用文件时,需要事先用库函数中的fopen函数打开文件;该函数需要两个参数。第1个参数是要打开的文件名,第2个参数是文件类型及打开模式;
文件类型有两种,即文本文件和二进制文件;
scanf函数和fscanf函数会返回读取到的的项目数。
<time.h>头文件中定义了获取日期和时间所需的各种数据类型和函数;
o来自于octal(十进制),x来自于hexadecimal(十六进制)。