黑马程序员_C语言_结构体与枚举

来源:互联网 发布:java泛型使用场景 编辑:程序博客网 时间:2024/05/18 01:23

一.1.结构体的基本概念

 int char double float 指针 * 数组

 数组的特性:1.同一种类型的数据 2.有序的

 


构造数据类型:结构体,数组


 1.结构体:构造类型,可以保存不同类型的数据

 2.数组:构造类型,只能保存同一种数据类型


假设定义一个人得数据

    int person = 名字(char *)身高(float) 年龄(int)

    

用普通变量类型推理出结构体

    //变量类型变量名字

        int a;//c语言已经规定好了int类型具体是什么样的数据

    

    结构体的类型结构体变量名

    结构体类型 是私人订制版的数据类型

    怎么定义一个结构体类型 struct

    struct 结构体类型名称

    {

        成员类型 成员名称;//后面写个;

    };

    struct Person

    {

       char * name;//名字

       float height;//身高

       int age;//年龄

    };//一个崭新的结构体就声明完了

  定义一个结构体类型,不会分配存储空间


  1.第一种初始化方式

   struct Person p;

    p.name ="jackson";

    p.age =20;

    p.height =1.88;


  2.第二种初始化方式,定义变量的同时赋值注意点:按照结构体类型顺序赋值

    类似 int ages2[3] = {1, 3, 5};

struct Person p1 = {"jordan",1.88, 24};


  3.第三种初始化方式  指定赋值的变量  .name

  类似 int ages3[5] = {[3] = 2, [4] = 34};

struct Person p2 = {.name ="lty", .age = 20, .height =1.98};


//    注意: 这是不可以的

//    struct Person p3;

//    p3 = {"lee", 1.98, 28};

//    p3也是地址


一.2.结构体内存分析


*结构体变量分配存储空间 按照补齐算法

*分配的存储空间必须是占用字节最大的成员的倍数


1.定义结构体类型,不会分配存储空间

   struct Date

    {

       int age;

       int year;

       int month;

       int day;

    };

2.只有通过结构体类型定义变量的时候,才会真正的分配存储空间

   struct Date d1 = {12,2014, 5, 1};

    //   第一个成员变量的地址,就是结构体的地址



 注意:结构体赋值 值传递 不会改变原来结构体的值

    

   struct Date d2;

    d2 = d1;//d1的所有成员一一对应的赋值给d2里的成员(值传递)


一.3.结构体多种定义方式


    1.先定义结构体的类型,再定义结构体变量

   struct Person

    {

       int age;

       int no;

    };

    

   struct Person p;

    

   2.定义结构体类型的同时定义结构体变量

    下面这句话作了两件事

    1.定义结构体类型

    2.通过刚才定义的结构体类型定义结构体变量

   struct Person1

    {

       int age;

       int no;

    } p1;


  3.匿名结构体

    定义结构体类型的同时定义结构体变量,且省略了结构体类型名称

    缺点就是没有结构体类型的名称,不能复用

    struct

    {

       int age;

       int no;

    } p3 = {30,20};


一.4.结构体与数组


参考数组:    int ages[] = {1,3, 5};

    

    用结构体定义多个员工数据


   struct Kpi

    {

       int number;//员工号

       char *name;//员工名字

       char *jineng;//部门

    };

   元素类型 数组名字[元素个数]

    

   struct Kpi ps[3] =

    {

        {1001,"师傅","泡妞"},

        {1002,"大湿胸","打妖怪"},

        {1003,"猪八戒","吃喝玩"}

    };


一.5.结构体与指针


    struct Person

    {

       int age;

       int no;

    };

   struct Person xiaoP = {30,1001};


    定义指针:

    数据类型 *指针变量名称

    struct Person *p;

    p = &xiaoP;

     

   *p 访问的是整个结构体的那块存储空间

    

    (*p).age //.的优先级最高 (这种方式开发中不常见)

    p->age  //重点掌握的方式

    

      (*指针名称).成员名称;不常用

      指针名称->成员名称;重点

    printf("xiaoP age = %d, no = %d\n",p->age, p->no);


    当利用指针指向结构体变量后几种访问的方式

    1.变量名.成员变量 p.age

    2.(*指针变量名).成员变量; (*p).age

    3.指针变量名->成员变量名; p->age

    注意:结构体指针指向的是整个结构体



一.6.结构体作为函数参数


//定义一个结构体

struct Person

{

   int age;

   char *name;

};


void test(structPerson *temp)

//值传递struct Person temp = struct Person p

{

    //    (*temp).age = 20;

    temp->age =20;

}


int main()

{


    

   struct Person p = {30,"jay"};

    

   test(&p);

    

    printf("p.age = %d, p.name = %s\n",p.age, p.name);


   return 0;

}


一.7.结构体嵌套


int main()

{

   struct Time

    {

       int HH;

       int mm;

       int ss;

    };

    

   struct Date

    {

       int year;

       int month;

       int day;

       struct Time birthTime;

    };

    

   struct Person

    {

     

       struct Date birthday;

//        int year;

//        int month;

//        int day;

//        int HH;

//        int mm;

//        int ss;

       

 struct Date ruDate;

//        int year;

//        int month;

//        int day;

//        int HH;

//        int mm;

//        int ss;


        struct Date liDate;

//        int year;

//        int month;

//        int day;

//        int HH;

//        int mm;

//        int ss;


    };


    struct Person person =

    {

        {1980,4, 1,{12,10,55}},

                    给struct Time birthTime 初始化

        {2012,9, 1},

        {2013,2, 29},

    };

    printf("year = %d, month = %d, day = %d, HH = %d\n", person.birthday.year, person.birthday.month, person.birthday.day, person.birthday.birthTime.HH);// ...

   这个.可以无限制的.下去

   

注意:但是结构体嵌套,不能嵌套自己

   struct Person

    {

       int age;

       struct Person p;

    };


二.枚举

什么是枚举?

 1.枚举的本质是基本数据类型 int

 2.定义枚举的时候,枚举的取值默认情况下,从0开始,依次递增

 使用场景:

 当一个变量只有固定的几个取值的时候,可以用枚举变量

 注意:想要使用枚举,首先要定义枚举的类型,类似结构体类型的定义


struct 结构体类型名称

{

    成员变量;

};


enum 枚举类型名称

{

    枚举的取值

};


 定义性别

    enum Sex

    {

        //枚举的取值默认情况下,从0开始,依次递增

       man,   //0

       woman, //1

       other, //2

    };





0 0
原创粉丝点击