C语言学习入门 (七) 结构体和枚举

来源:互联网 发布:windows 9 编辑:程序博客网 时间:2024/06/06 07:35

结构体

它允许内部的元素是不同类型的

结构体的定义

//结构体类型:

struct Person

{

   char name[20]; //char *name;

   int age;

   float weight;

};

//定义一个结构体变量,定义变量时才分配存储空间

struct Person person;    //与类型定义一起使用


struct Student {  //结构体类型与变量同时定义

    char *name;

    int age;

} stu;


struct {  //省略类型,结构体变量名为stu

    char *name;

    int age;

} stu;

结构体的注意点

1.不允许对结构体本身递归定义

如下做法是错误的,注意第3

1 struct Student {

2     int age;

3     struct Student stu;

4 };

2.结构体内可以包含别的结构体

3.结构体变量占用的内存空间是其成员所占内存之和,而且各成员在内存中按定义的顺序依次排列

结构体的初始化

1.

struct Person

{

   char name[20];

   int age;

   float weight;

};


struct Person person = {"a",2855.5f};

2.

struct Person

{

   char name[20];

   int age;

   float weight;

} person = {"a",2855.5f};

 只能在定义变量时 初始化

结构体的使用

person.age =22;// 这里的.运算符  优先级最高

//person.name = "cc";//这样是不可以的,会报类型未分配的error

malloc(sizeof(per1)+20);//分配内存给name,name为20长度
strcpy(per1.name, "ffaff");//用这种方式给name赋值

struct Person p1 = {"a",2855.5f};

struct Person p2 = p1;

结构体数组

跟结构体变量一样,结构体数组也有3种定义方式   ……person[5];

初始化与数组类似   struct Person person = { {}, {}, {} };

struct Student1 {    int grade;};struct Student1 stu1[3];//先定义结构体类型,再定义变量struct Student2 {//直接在变量后声明数组    int grade;}stu2[3];struct  {//省略结构体名字,并声明为数组    int grade;}stu3[3];


结构体作为函数参数

将结构体变量作为函数参数进行传递时,其实传递的是全部成员的值,

也就是将实参中成员的值一一赋值给对应的形参成员。因此,形参的改变不会影响到实参。//值传递

指向结构体的指针

结构体指针变量的定义形式:struct结构体名称 *指针变量名

有了指向结构体的指针,那么就有3种访问结构体成员的方式

  • 结构体变量名.成员名
  • (*指针变量名).成员名//因为 .优先级高,,所以要括起来
  • 指针变量名->成员名

void processStruct()

{

    printf("p-name:%s\n",person.name);

    

   struct Person *per = &person;

   printf("p-age:%d\n", (*per).age);

    

    printf("p-weight:%.2f\n", per->weight);

}

枚举

它可以用于声明一组常数。当一个变量有几个固定的可能取值时,可以将这个变量定义为枚举类型

枚举类型的定义

enum Season {spring, summer, autumn, winter}; 

枚举变量的定义

跟结构体一样,有3种方式定义枚举变量

>enum Season {spring, summer, autumn, winter};

enum Season s;


>enum Season {spring, summer, autumn, winter} s;

>enum {spring, summer, autumn, winter} s;

枚举使用的注意

> C语言编译器会将枚举元素(springsummer)作为整型常量处理,称为枚举常量。

枚举元素的值取决于定义时各枚举元素排列的先后顺序。默认情况下,第一个枚举元素的值为0,第二个为1,依次顺序加1

enum Season {spring, summer, autumn, winter};

也就是说spring的值为0summer的值为1autumn的值为2winter的值为3

>也可以在定义枚举类型时改变枚举元素的值

enum season {spring, summer=3, autumn, winter};

没有指定值的枚举元素,其值为前一元素加1。也就说spring的值为0summer的值为3autumn的值为4winter的值为5

enum Season

{

    spring, summer =18, fall, winter

} season;

void processSeason()

{   season =spring;//等价于 season = 0;  //默认从0开始

   season = 9;

   season = winter;//等价于 season  20

    printf("season= %d\n",season);

    

   int *p = &season;

   printf("p=%d\n", *p);

}

枚举数组、指向枚举的指针(跟结构体类似)

   //枚举数组 定义方式与结构体数组类似也是三种方式    printf("枚举数组sea3_ary[1]=%d\n",sea3_ary[1]);        //指向枚举的指针    enum Season4 *p = &sea2_ary[0];//    printf("%d\n", *p=autumn4);    enum sea3_ary *q = &sea3_ary[0];//匿名枚举 没有指定类型,这句编译器居然通过了   // printf("%d\n", *q=autumn4);     //指针不能识别类型sea3_ary   这句报错
枚举遍历
 //遍历枚举    for (int i=spring; i<=winter; i++) {//只能遍历        printf("枚举元素:%d \n", i);    }    enum Season2 *s = &sea2;    for (int i = 0; i <=4; i++) {        printf("枚举sea2元素:%d \n", *(s+i)); //跟数组不一样,不是连贯存储的,所以用指针遍历无效    }


0 0
原创粉丝点击