首页 > 代码库 > 黑马程序员--C语言结构体

黑马程序员--C语言结构体

一、结构体和数组的区别:

数组:只能由多个相同类型的数据构成;

结构体:可以由多个不同类型的数据构成;

二、结构体定义的三种形式:

 1 int main() 2  3 {        4  5          //结构体定义的3种形式 6  7          //1. 定义结构体的时候声明变量 8  9          struct Person10 11          {        // 里面的三个变量可以成为结构体的成员或者属性12 13                    double weight;14 15                    char *name;16 17                    int age;18 19                   20 21          }  stu,stu1; // 可以定义多个结构体变量,注意stu前面要有空格,后面有分号22 23  24 25          //2.单纯的只定义结构体26 27          struct Student28 29          {30 31                    int no;32 33          };// 注意此处的分号不可忘掉34 35          struct Student s;36 37  38 39          //3.没有结构体名称,直接定义变量40 41          struct42 43          {44 45                    int age;46 47          } p;

三、     结构体初始化

(1)初始化形式

         1>定义变量的时候初始化

        

1 struct Person pp = {10.2, "rose", 45};2 printf("%d,%p", pp, &pp);3 printf("年龄:%d, 姓名:%s, 体重:%f\n", pp.age, pp.name, pp.weight);

 

 

         2>先定义后赋值,结构体中给变量赋值用的是“.”

        

1 stu.age = 10;2 stu.name = "jack";3 stu.weight = 50;4 printf("%p, %d", &stu, stu);5 printf("年龄:%d, 姓名:%s, 体重:%f\n", stu.age, stu.name, stu.weight);

 

3>

1 struct Student s1 = {10, "jack", 40.0};2 struct Student s2 = {11, "rose", 45.0};

 

//s2所有成员的值都对应的赋值给s1

s1 = s2;

(2)初始化常见错误

       

1  struct Student s2;2 3  s2 = {14, "zhs", 20.0};4  5  //类似的错误初始化:6  7  //int a[3];8  9  //a[3] = {1, 2, 3};

 

四、结构体内存分析

 1 void test1() 2  3 { 4  5          struct Student 6  7          { 8  9                    int age;    //4个字节10 11                    char a;      //1个字节12 13                    double weight; //8个字节14 15                    char *name;    //4个字节16 17          };18 19          struct Student stu;20 21          int s = sizeof(stu);22 23          printf("%d", s);24 25 }

 

(1)补齐算法:

1>

 1 struct Student 2  3 { 4  5          int age;    //4 6  7          char a;               //1 8  9          double weight;         //8   10 11 }12 13 //sizeof(stu)的结果:16

2>

 1 struct Student 2  3 { 4  5          int age;    //4 6  7          double weight;         //8    8  9          char a;               //110 11 }12 13 //sizeof(stu)的结果:24

3>

 1 struct Student 2  3 { 4  5          int age;    //4 6  7          char a;               //1 8  9          int height; //410 11 }12 13 sizeof(stu)的结果:12

(2)结构体内存细节

1>定义结构体类型的时候(并不会分配存数空间)

2>定义结构体变量的时候(才是真正分配存储空间)

五、结构体数组

  1 #include <stdio.h>  2   3 struct Date  4   5 {  6   7        int year;  8   9        int month; 10  11        int day; 12  13 }; 14  15 struct Person 16  17 { 18  19        int age; 20  21        char *name; 22  23        struct Date birthday; 24  25        /*注意结构体的嵌套定义中 26  27        struct Person s;这种写法是错误的,自己不能嵌套自己 28  29        */ 30  31 }; 32  33 void test(struct Person); 34  35 void test2(struct Person *); 36  37 int main() 38  39 { 40  41        int i; 42  43        struct Person p[3] = { {12, "jack", {2002, 1, 3}}, {13, "rose", {2003, 2, 3}}, {14, "Mike", {2003, 2, 4}}}; 44  45        /*错误写法 46  47        struct Person p[3]; 48  49        p[3] = { {12, "jack", {2002, 1, 3}}, {13, "rose", {2003, 2, 3}}, {14, "Mike", {2003, 2, 4}}}; 50  51        52  53        */ 54  55        //指向结构体的指针的定义 56  57        struct Person *pp = p; 58  59        /* 60  61        指针取值:pp->age ==p.age 62  63                        (*pp).age == p.age 64  65        变量取值:p.age 66  67        */ 68  69        for(i = 0; i<3; i++) 70  71        { 72  73               printf("%d, %s, %d-%d-%d\n", p[i].age, p[i].name, p[i].birthday.year, p[i].birthday.month, p[i].birthday.day); 74  75        } 76  77   78        for(i = 0; i<3; i++) 79  80        { 81  82               printf("%d, %s, %d-%d-%d\n", (pp+i)->age, (pp+i)->name, (*(pp+i)).birthday.year, (*(pp+i)).birthday.month, p[i].birthday.day); 83  84        } 85  86        test(p[0]); 87  88        test2(&p[1]); 89  90  return 0; 91  92 } 93  94 /*结构体与数组 95  96 */  97  98 void test(struct Person s) 99 100 {101 102        struct Date d = {2011,2,1};103 104        s.age = 20;105 106        s.name = "rose";107 108        s.birthday = d;109 110        printf("%d, %s, %d-%d-%d\n", s.age, s.name, s.birthday.year, s.birthday.month, s.birthday.day);111 112 }113 114  115 void test2(struct Person *p)116 117 {118 119        struct Date d = {2011,2,1};120 121        p->age = 21;122 123        p->name = "point";124 125        p->birthday = d;126 127        printf("%d, %s, %d-%d-%d\n", p->age, p->name, p->birthday.year, p->birthday.month, p->birthday.day);128 129 }

六、结构体注意:

1>结构体类型不可重复定义

 1 //这种写法是错误的 2 struct Student 3  4 { 5  6  int age; 7  8 }; 9 10 struct Student11 12 {13 14 char *name; 15 16 }

 

2>结构体可以嵌套定义,但是自己不能嵌套自己

 1 /*错误写法 2 struct Student 3  4 { 5  6 int age; 7  8 struct Student s; 9 10 };11 */

这样写是不正确的

3>结构体初始化时不可以先定义后整体赋值

1 /*错误写法2 struct Student s2;3 4 s2 = {14, "zhs", 20.0};5 */

4>定义结构体类型的时候内存没有分配存储空间,当定义结构体变量的时候才分配;

5>取结构体中的变量的值得时候应用“.”符号,如果是指针应用“->”符号;

6>注意结构体的补齐算法.

 

黑马程序员--C语言结构体