一、结构指针:
1、一般形式:struct 结构名称 *结构指针变量名
2、访问结构成员的一般形式:
(1)、(*结构指针变量).成员变量名
(2)、结构指针变量->成员变量名
二、头文件标准写法
#ifndef HERO_H_INCLUODE//如果没有定义HERO_H_INCLUODE
#define HERO_H_INCLUODE//定义HERO_H_INCLUODE
#include <stdio.h>
#include <stdlib.h>
//等等......
typedef struct _job//宏定义类型
{
}Job;
#endif //结束头文件
1、上面的宏定义类型定义struct,下一次使用时直接Job job,就定义了一个job结构体
三、结构数组
1、元素为结构类型的数组称为结构数组
如:
struct Role {
char * name;
int age;
char *job;
}roles[25];
struct Role roles[25];
roles[25] = {
{...},//roles[0]
{...},//roles[1]
...
{...}//roles[24]
}
2、一个小注意点:动态录入时,如果要动态录入的是char类型的话,要动态分配内存使用stdlib.h里面的malloc
四、回调函数的定义
当一个函数指针被当作某个函数的参数,且该函数指针调用所指向的函数时,我们就说这是回调函数
简单应用
1 #include<stdio.h>
2 //回调函数的实验
3
4 int sum(int,int);
5 int sub(int,int);
6 //实现加减乘除
7 int sum(int a,int b)
8 {
9 return (a+b);
10 };
11
12 int sub(int a,int b)
13 {
14 return (a-b);
15 };
16 //定义回调函数
17 int sum_sub(int a,int b,int (*p)(int,int))
18 {
19 return p(a,b);
20 };
21 int main()
22 {
23 int a=3,b=4,c,d;
24 //使用回调函数
25 c = sum_sub(a,b,sum);
26 d = sum_sub(a,b,sub);
27 printf("a+b = %d\n",c);
28 printf("a-b = %d\n",d);
29 }
五、枚举类型
枚举类型的定义有点像结构体但和结构体相差很大,枚举类型都是整型,且会自动加1,如果第一个值没有赋值的话那么默认为0
1 #include<stdio.h>
2
3 int main()
4 {
5 enum Day{
6 mon = 1,tue,wed,thu,fri,sat,sun
7 };
8 enum Day day;
9 day = mon;
10 printf("星期一%d\n",mon);
11 }
六、结构体指针
struct Books{
char *name;
......
}book1;
//结构体指针指向book1;
struct Books *p1 = &book1;
//通过结构体指针访问结构体成员的两种方式‘
(*p1).name;
p1->name;
七、结构体
用途:使几个不同类型的变量共占一段内存(相互覆盖)
例如·:
union data
{
int i;
char ch;
float f;
};
共用体变量中起作用的成员是最后一次存放的成员,因为系统只会分配一段内存给共用体。这也是共用体和结构体的区别
例如
union data data1;
data1.i = 1;
data1.ch = 'a'
printf("%d\n",data1.i);//编译会通过但是结果不对,因为已经被data1.ch冲掉了
printf("%s\n",data1.ch);//编译通过
八、typedef的用法
功能:用自定义名字为已有数据类型命名
例如:
typedef struct _data{
...
}Data;//相当于给 struct _data起了一个别名叫做Data那么下次想要定义结构体变量时就不用那么麻烦了直接使用:
Data data1;//这样就定义好了一个结构体变量,
上面其实就是给个类型名给这个类型名起一个别名
九、文件
1、文件的打开(fopen())
FILE *fp;//声明一个文件指针,实质上是一个结构体指针
fp = fopen("文件路径","打开方式");//将文件地址给fp相当与打开文件,fopen()函数会返回一个指针,如果返回的是NULL说明返回失败
if(fp == NULL){
printf("%s\n",文件打开失败);
exit(0);//注意此函数可以关闭所有文件并停止调用,且该函数在stdlib.h里
}文件打开的几种方式
方式 | 处理方式 | 指定文件不存在 | 文件存在 |
r | 只读 | 出错 | 正常 |
w | 只写 | 建立新文件 | 原内容丢失 |
a | 追加 | 建立新文件 | 在原内容后追加 |
r+/w+ | 读写 | 出错 | 正常 |
2、文件的关闭(fclose())
作用:释放文件结构体和指针
fclose(fp);
3、文件的读写(fputc())
函数原型:int fputc(int c,FILE *fp);
功能:把一字节代码c写入fp指向文件中
fgetc(File *fp);从文件里面读一个字节的代码
fputc(char ch,File *fp);将一个或多个字节ch添加到fp所指向的文件中
fread(buffer,size,count,fp);
buffer:要读入的数据块的存放地址或要输出的数据块的起始地址(数组)
size每个要读/写的数据块的大小
count:要读或写的数据块个数
fp:指针
如:
fread(f,4,2,fp);//表示从fp指向的文件往数组f里面读,一次读4乘2字节
fwrite(buffer,size,count,fp);
文本文件的终止符为EOF,下面代码是对文本文件的读操作
//文本文件读
FILE *fp
fp = fopen("xxx","xx");
char ch = fgetc(fp);
while(ch != EOF){
putchar(ch);
ch = fgetc(fp);
}
fclose(fp);
下面代码是对文本文件写操作
#include<stdio.h>
#include<stdlib.h>
int main()
{
FILE *fp;
fp = fopen("文件路径及名字","w");
if(fp == NULL){
printf("%s\n","文件创建失败");
exit(0);
}
else{
char ch = getchar();
while(ch != '#'){//当输入#回车结束输入
fputc(ch,fp);
ch = getchar();
}
fclose(fp);
}
}
















