您的位置:首页 > 编程语言 > C语言/C++

黑马程序员-学习笔记C语言03

2016-02-16 12:51 489 查看

——- android培训java培训、期待与您交流! ———-

一、结构数组

数组中每个元素都是相同结构类型的结构变量

定义:

struct student{

int age;

char *name;

}boy[5];


初始化:

struct student stu1[2] = {{18,"熊大"},{17,"熊二"}};//定义数组同时初始化数组;
struct student stu2[2] ;//先定义后初始化
stu2[0] = (struct student){18,"熊大"};
stu2[1] = (struct student){17,"熊二"};


二、结构体指针

1、用来存放结构体变量地址的指针变量,将结构体看做是一个普通的变量类型

2、struct 结构体名 * 指针变量名

3、使用结构体指针间接访问结构体的值

1)(*p).age 访问年龄 p中存储的是stu1的地址

2) p->age 访问年龄 (注意:只有在p是结构体指针的时候才能使用)

三、结构体嵌套使用

结构体变量能嵌套其他结构体类型的变量不能嵌套自己的结构体变量,但是可以嵌套指向自己这种类型的指针变量

初始化及访问

struct student{
int age;
char *name;
struct student *banZhang;
};
//初始化
struct student banZhang = {19,"李班长",NULL};
struct student zhangSan = {18,"张三",&banZhang};
//访问
printf("姓名:%s,年龄为:%d班长:%s",zhangSan.name,zhangSan.age,zhangSan.banZhang->name);


多级同样道理。

注意,结构体嵌套自身指针的时候的使用,指针类型即地址类型

四、结构体变量及成员值作为函数参数

1、用结构体变量的成员值作为函数的参数实质上就是值传递

2、用结构体变量名作为函数的参数时,实质上还是值传递。

3、结构体指针作为函数的参数,实质上是地址传递,能够改变实参变量的值。

五、枚举数据类型

基本数据类型、指针、空类型、构造类型

1、枚举类型

C语言提供的基本数据类型中的一种,因为它不能再分解为任何的基本类型

定义:enum 类型名 {枚举值表} 枚举值表中罗列出所有可用值。

命名习惯 enum iColor{kIcolorWhite,。。。。}

2、枚举变量的定义和使用

枚举变量定义完成以后,系统会自动给枚举的每一个元素赋一个整数的值,从0开始每个加1

//定义一个枚举类型
enum week{iWeekMonday,iWeekTuesday};
//定义一个枚举类型变量并访问
enum week myWeek = iWeekMonday;
printf("%d",myWeek);


六、typedef关键字

为已存在的数据类型起一个别名

使用方法:

1、基本数据类型

2、数组

//给数组起别名
typedef int ARRAY[5];//为int 类型的数组 int[5] 取别名为 ARRAY
ARRAY a1={1,2,3,4,5},a2={5,4,3,2,1};
//相当于下面的表达形式
int a1[5]={1,2,3,4,5},a2 = {5,4,3,2,1};


3、结构体
4、给枚举类型
5、函数指针


七、预处理指令

以#开头的都叫做预处理指令

原程序—》预处理(宏替换)—》编译—》链接—》执行

八、宏

C语言中,我们自定义特殊的标识符,习惯全部大写,写在函数之前分为有参宏和无参宏两种

1、无参宏定义:#(预处理指令)define 宏名 宏字符串(常量、变量、表达式)

宏替换(宏展开) 源程序在编译之前,由预处理程序对我们写的源代码进行预处理,将所有出现 宏名 的地方一律用 宏的字符串 替换,只是一种简单的代换,预处理程序不进行任何检查

注意:

1、宏的作用域

2、在字符串中出现的宏名不会被替换

3、取消宏定义 #undef 宏名,取消宏定义

4、宏定义容许嵌套

5、使用宏起别名,方便使用

有参宏

2、有参宏#define SUM(a) a+a

在预处理过程中,遇见SUM(a)的地方 使用a+a代换

注意:

1、宏的形参之间可以出现空格,但是宏名和形参之间不能出现空格

2、宏只是代换,不存在值传递的问题

3、宏的参数用括号括起来,避免出错

4、可以用宏定义多个语句,实际上就是用代码语句代换宏名

应用:使用有参宏求两个数的最大值

#define MAX(x,y) x>y?x:y

3、typedef和#define区别

define只是简单的替换,而typedef是别名,当用在指针时表现明显

九、条件编译

发生在预处理阶段,在编译之前

核心:根据条件编译指定的代码

条件不同,编译的部分也不同,生成的目标文件大小也不一样(.o文件)

1、#if —#elif—#else—#endif 指令 选择编译可以减小编译文件的大小,注释部分是不参与编译的。

2、#ifdef—#else—#endif用来判断某个宏是否定义

3、#ifndef 检查宏是否没有定义,没有定义返回真

4、可以使用条件编译语句用来调试BUG

如果DEBUG1 == 1,显示调试信息

如果DEBUG1 == 0,不显示调试信息

十、static 和 extern

1、static 和 extern修饰局部变量

static(静态变量)作用,已经初始化的静态变量存储在数据区,作用域延长

static定义变量的语句在代码执行过程中只会被执行一次

extern是不能修饰局部变量的

2、static 和 extern修饰全局变量

static修饰的全局变量只能在当前文件中使用,而不能在其他文件中使用,在不同的文件中可以声明同名的变量(也叫内部变量)

extern修饰的全局变量,表示当前变量可以在本文件中使用也可以在其他文件中使用。

注意:extern声明的全局变量在不同的有包含关系的文件中不能同名 。属于重复定义。

全局变量默认值为零

3、修饰函数

static修饰的是内部函数,只能在定义的文件中使用,非要使用的话可以在定义函数的文件中再定义一个中转的函数,间接调用。

extern修饰的外部函数,也可以在外部访问,默认情况下是可以省略extern的,同样表示外部函数

十一、文件部分

1、文件的作用和分类

保存程序的结果,记录信息,他是存储在外部介质上数据的集合,集合的名称叫文件名。也就是存储在硬盘上的。

分类1:普通文件和设备文件

分类2:ASCII文件和二进制文件

ASCII文件(文本文件):文件中每个字符对应一个字节,存储对应的ASCII码的二进制补码形式

二进制文件:直接存储二进制码

2、文件操作

步骤:引入头文件-》定义文件指针-》打开文件-》文件读写-》关闭文件

文件操作函数:

字符读写:fgetc,fputc

字符串读写:fgets,fputs

数据块读写:fread,fwrite

格式化的读写:fscarf,fprintf

文件操作的原理

1)文件缓冲区

系统自动的在内存中为每一个正在使用的文件开辟一个文件缓冲区,从内存想磁盘输出数据必须要先送到内存中的缓冲区,装满缓冲区后才一起送到磁盘中,如果从磁盘向计算机读入数据,则一次从磁盘文件将一批数据输入到内存缓冲区,然
a651
后再从缓冲区逐个的将数据送到程序数据区。

2)文件指针

指向文件的指针变量叫做文件指针

FILE *fp 可以存放一个文件的首地址,可以通过文件指针对文件进行读、写、追加操作

应用:从键盘接收一个字符串,然后打印

char ch [10];
printf("请输入一个字符串");
fgets(ch, 10, stdin);
//定义文件指针
FILE *pf = fopen("a.txt", "w+");
//判断文件是否打开成功
if (pf != NULL) {
//写入文件
fputs(ch, pf);
//读取文件中的字符串到ch数组中
fgets(ch, 10, pf);
//输出字符串中的内容
fputs(ch,stdout);
}
else{
printf("文件打开失败,按任意键退出");
getchar();
exit(1);
}
fclose(pf);
return 0;


3)文件的打开和关闭

fopen和close

4)文件的使用方式及注意

“r” 打开一个已存在的文件,能读不能写

“w” 创建一个新文件,能写不能读。如果文件已存在,会先删后建。

“a” 打开一个已存在的文件,在文件尾部追加数据,不能读,文件不存在会先创建文件,准备写入

“r+” 打开一个已存在的文件,能读能写

“w+” 创建一个新文件,能读能写,覆盖原文件

“a+” 等价于“a”,能读

“t” 打开一个文本文件

“b” 打开一个二进制文件

5)字符读写函数

1、字符写入函数 fputc

把一个字符写入到指定的文件中 fputc(字符,文件指针)字符可以是常量也可以是变量

2、字符读取函数 fgetc

3、逐字符将字符串写入到文件中

4、逐个读取

fp指针会自动+1,进行指针移动

EOF是一个文件结束标志,每个文件都会有

应用,从键盘接收一个字符串,然后再打印出来

rewind(fp)将文件指针重新指向文件的首地址

6)字符串读写函数

fputs写一个字符串到文件当中,返回值为本次写入字符串的长度(int)

fgets从文件中读取一个字符串

注意:1、fgets当文件内容读取完毕后,会给字符串加上结束符\0。

2、读取时遇到\n或者EOF,读取结束

7)数据块读写函数fread和fwrite

强项是读写二进制的文件

应用:将两个学生数据,写入一个文件中,再读出这两个学生的数据显示在屏幕上

//定义学生结构体
typedef struct student{
char *name;
int age;
}S;
//声明并初始化结构体变量
S stu1 = {"熊大",18},stu2 = {"熊二",17};
//定义文件指针
FILE *fp = fopen("a1.data", "wb+");
//判断文件是否打开成功
if (fp != NULL) {
//写入文件
fwrite(&stu1, sizeof(S), 1, fp);
printf("写入成功\n");
//读取文件
S stu3;
//将文件指针移动至文件头
rewind(fp);
fread(&stu3, sizeof(S), 1, fp);
printf("%s,%d",stu3.name,stu3.age);
}
else{
printf("文件打开失败,按任意键退出");
getchar();
exit(1);
}
//关闭文件
fclose(fp);


8)格式化读写函数fscanf和fprintf

格式化的读取函数可以忽略文件中一些无用的数据,直接取得我们想要的数据

fprintf(stdout, “##%s##%d”,stu3.name,stu3.age);

9)文件的随机读写实现

文件定位

rewind 将文件内部的指针位移到文件首

fseek 移动文件指针到指定位置

fseek(fp, -sizeof(S), SEEK_END);//同样将文件指针移动到文件头

feof 判断文件是否到了末尾,如果是返回1

terror 判断函数是否读取出错

clearerr 用于清除出错标志和文件结束标志,使他们为0值
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  C语言基础