13.结构体
1.结构体
a.struct是关键字;
b.struct Student合起来才是结构体“类型”;
c.结构体内部定义的变量不能直接赋值;
d.结构体只是一个类型,没有定义变量前,是没有分配空间,就不能赋值。
2.使用:
(1).定义结构体变量;
(2).类型名 变量名:
struct Student stu; //struct关键字 //结构体变量初始化,和数组一样,要使用大括号 //在定义时才初始化 struct Student stu2 = {18,"hello",59};
(3).如果是普通变量,使用“.”运算符;
(4).结构体指针变量使用:->
struct Student *p; p = &tmp; //给结构体变量一个空间 p -> age = 18;
p->name = (char *)malloc((strlen("mike")+1); //给成员分配空间,如果name是结构体成员是数组,和数组操作类似 strcopy(p->name,"mike"); p->score = 59; //指针要有合法指向,才能操作结构体成员 //任何结构体变量都可以用“.”或“->” (&temp)->age = 18; (*p).age = 18; //合法
3.结构体变量定义:
4.迭名结构体
5.结构体数组
6.结构体嵌套
struct Info { int age; char name[50]; };
struct Student { struct Info info; int score; }; //调用 struct Student s; s.info.age = 18; strcopy(s.info.name,"mike");
7.结构体变量之间的操作
//相同结构体变量之间可以相互赋值 struct Student s1 = {18,"mike",59}; struct Student s2; s2 = s1; //内容一样,但是内存空间独立
8.const修饰的结构体变量不能修改
const struct Student *p2 = &tmp; //const修饰的指针,指针指向的内存不能修改,p2是指向常量的指针 //struct Student const *p2 = &tmp; p2->age = 18; //err p2 = NULL; //ok struct Student * const p2 = &tmp; p2->age = 18; //ok,常指针,指向的内存可以修改,地址不可以修改; p2 = NULL; //err
8.指针指向栈区空间
9.指针指向堆区空间
10.非法使用内存导致段错误
struct Test { char *str; int a; int b; int c; } int main() { struct Test obj; strcpy(obj.str,"mike"); ///给指向的内存拷贝内存 printf("str = %s\n",obj.str); return 0; }
11.结构体成员指针
(1).使用指针保存字符串的首地址
struct Student { int age; char *name; int score; }; int main() { struct Student s; s.age = 18; s.name = "mike"; //指针变量保存字符串常量的首地址 s.score = 59; return 0; }
(2).指向栈区空间
struct Student { int age; char *name; int score; }; int main() { struct Student s; s.age = 18; char buf[]; //定义一个栈区空间 s.name = buf; //指针指向栈区空间 strcopy(s.name,"mike"); s.score = 59; return 0; }
(3).操作堆区空间
结构体指针变量和成员指针都要先分配空间,后面要释放;
12.共用体(关键字union)
(1).结构体的大小可以简单认为成员大小的累加;
(2).共用体是构造数据类型,也叫联合体它使几个不同类型的变量共占一段内存(相互覆盖),每次只有一个能使用.
(3).共用体公有一块内存,所有成员地址一样;
(4).给某个成员赋值,会影响到另外的成员;
(5).共用体的大小为最大成员的大小;
13.枚举(enum)
(1).枚举里面的成员是一个标识符,枚举常量;
(2).第一个成员如果没有赋值,默认为零,下一个成员比上一个成员多1;
(3).枚举成员,或者枚举常量;
14.typedef使用
(1).给已存在的类型起一个别名;
(2).typedef不能创建新类型;
(3).typedef发生在编译阶段(define是在预处理阶段)。
15.缓冲区操作
fflush(stdout);
缓冲区缓冲作用屏蔽。