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

缓冲区缓冲作用屏蔽。

 

posted @ 2019-01-04 17:15  西贡小傻  Views(188)  Comments(0Edit  收藏  举报