一、结构指针:

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);
}
}