枚举类型
enum 枚举名 {枚举元素1,枚举元素2,……};
enum DAY
{
MON=1, TUE, WED, THU, FRI, SAT, SUN
};
注意:第一个枚举成员的默认值为整型的 0,后续枚举成员的值在前一个成员上加 1。我们在这个实例中把第一个枚举成员的值定义为 1,第二个就为 2,以此类推。
可以在定义枚举类型时改变枚举元素的值:
enum season {spring, summer=3, autumn, winter};
没有指定值的枚举元素,其值为前一元素加 1。也就说 spring 的值为 0,summer 的值为 3,autumn 的值为 4,winter 的值为 5
枚举常量实际上就是整型数
enum DAY
{
MON=1, TUE, WED, THU, FRI, SAT, SUN
};
enum DAY day;
枚举类型的常量是连续的时候,是可以实现有条件的遍历的
enum DAY { MON=1, TUE, WED, THU, FRI, SAT, SUN } day;
int main() {
// 遍历枚举元素
for (day = MON; day <= SUN; day++)
{
printf("枚举元素:%d \n", day);
}
int a = 2;
weekend = ( enum day ) a; //类型转换
可以将一个整数通过类型转换转换为对应的枚举变量
结构体类型
定义一种新数据类型,可以将相关联的信息集成在一起。
struct Books {
char title[50];
char author[50];
char subject[100];
int book_id;
}book;
结构体可以和指针、数组联合使用,虽然语法上看起来会比较复杂,但基本知识点和之前学习关于指针和数组的知识是一样的。
对结构体变量成员的访问
printf("title : %s\nauthor: %s\nsubject: %s\nbook_id: %d\n", book.title, book.author, book.subject, book.book_id);
变量名+ . + 成员名
结构体变量可以作为函数的参数,参数传递规则为按值传递,修改形参不影响实参的值。
指向结构体的指针
struct Book * p;
struct Book book1;
p = &book1;
p->title
(*p).title
给类型定义一个别名,让类型的名字更加简短
typedef struct { char id[10]; int m; int d; } stu;
scanf("%s %d %d", stu[i].id, &(stu[i].m), &(stu[i].d));
可以单独对结构体变量的成员取地址,在输入结构体变量的时候需要用到这个语法。
共用体(联合体)
union D{
int a,
char c
};
与结构体不同,联合体的各个成员之间共享内存空间,修改其中任何一个成员,其他成员的值也会被修改。
主要目的是节约内存和存放有关联信息的时候能够带来一定的方便。
匿名共用体(结构体)
在结构体或者共用体的内容可以定义结构体或者共用体类型,此时如果没有指定内部定义的类型的名字,则内部定义的类型为匿名结构体(或共用体)
特点为外部结构体可以将匿名结构体的成员直接作为自己的成员来使用。
预处理指令
#include 头文件包含
#define 宏定义 , 注意带参数的宏定义的使用方法,参数和整个宏定义都要加括号
条件编译指令, 有选择的编译程序中的代码
#ifndef MESSAGE // 当宏名没有定义的时候条件成立,进入if预编译部分
#define MESSAGE "You wish!"
int x;
#endif
#ifndef MESSAGE // 当宏名没有定义的时候条件成立,进入if预编译部分
#define MESSAGE "You wish!"
int x;
#endif
主要的作用:防止变量或者类型被重复定义,特别是用在多文件结构当中
文件
将输出的结果重定向到文件
用命令的方式执行可执行程序
test > out.txt
输入重定向到文件
test < in.txt
在程序中操作文件,需要定义文件指针,打开文件和文件指针关联
FILE * p;
p = fopen("filename", "r");
if(p!==NULL){
fscanf(p, "%d", &a);
fclose(p);
}else{
提示打开失败
}
打开方式参数
“r” : 只读
“w”: 只写
“a”:追加
文件的存储类型的分类
文本文件(只存放字符)fscanf fprintf
按照字符来读写文件
int fgetc(FILE * fp)
当读字符结束的时候返回EOF(-1)
int fputc(int c, FILE * pf)
当写入错误时,返回EOF
文本文件有一个结束标记字符 EOF(-1)
feof(pf) 判断文件是否结束, 在使用的时候要注意,当读完了EOF字符之后,feof才返回为真.
二进制文件(内存数据的二进制一模一样的存入文件)
size_t fwrite(const void *ptr, size_t size_of_elements, size_t number_of_elements, FILE *a_file);
size_t fread(void *ptr, size_t size_of_elements, size_t number_of_elements, FILE *a_file);
p = fopen("filename", "rb");
对文件内部读写位置进行定位
fseek(文件指针, 偏移量, 从那里开始)
从那里开始有3种选择 从头 从当前位置 从结尾处
SEEK_SET SEEK_CUR SEEK_END
ftell(pf)返回文件内部位置指针的当前位置(以字节为单位)
对比
用二进制文件交换数据会存在程序移植性的问题(不同的机器采用不同的长度表示某种类型,大端小端的问题)。
用文本文件交换数据不存在移植性的问题,现在的互联网程序交换数据以文本文件为主。
位运算符
按照二进制位进行的运算
& | ^ ~ << >>
注意 >>
如果对有符号数进行右移操作,左边补符号位(正数位为0, 负数的符号位为1)