22.结构体详解.md 3.8 KB
Newer Older
极客江南's avatar
极客江南 已提交
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184
## 什么是结构体

- 结构体和数组一样属于构造类型
- 数组是用于保存一组相同类型数据的, 而结构体是用于保存一组不同类型数组的
- 例如,在学生登记表中,姓名应为字符型;学号可为整型或字符型;年龄应为整型;性别应为字符型;成绩可为整型或实型。
- 显然这组数据不能用数组来存放, 为了解决这个问题,C语言中给出了另一种构造数据类型——“结构(structure)”或叫“结构体”。

---

## 定义结构体类型

- 在使用结构体之前必须先定义结构体类型, 因为C语言不知道你的结构体中需要存储哪些类型数据, 我们必须通过定义结构体类型来告诉C语言, 我们的结构体中需要存储哪些类型的数据
- 格式:

```c
struct 结构体名{
     类型名1 成员名1;
     类型名2 成员名2;
     ……
     类型名n 成员名n;
 };
```

- 示例:

```c
struct Student {
    char *name; // 姓名
    int age; // 年龄
    float height; // 身高
};
```

---

## 定义结构体变量

- 定好好结构体类型之后, 我们就可以利用我们定义的结构体类型来定义结构体变量
- 格式: ```struct 结构体名 结构体变量名;```
  ![](https://img-blog.csdnimg.cn/img_convert/a19ef99bede1b3b0d689959881390bd0.png)

- 先定义结构体类型,再定义变量

```c
struct Student {
     char *name;
     int age;
 };

 struct Student stu;
```

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

```c
struct Student {
    char *name;
    int age;
} stu;
```

- 匿名结构体定义结构体变量

```c
struct {
    char *name;
    int age;
} stu;
```

>+ 第三种方法与第二种方法的区别在于,第三种方法中省去了结构体类型名称,而直接给出结构变量,这种结构体最大的问题是结构体类型不能复用

---

## 结构体成员访问

- 一般对结构体变量的操作是以成员为单位进行的,引用的一般形式为:```结构体变量名.成员名```

```c
struct Student {
     char *name;
     int age;
 };
 struct Student stu;
 // 访问stu的age成员
 stu.age = 27;
 printf("age = %d", stu.age);
```

---

## 结构体变量的初始化

- 定义的同时按顺序初始化

```c
struct Student {
     char *name;
     int age;
 };
struct Student stu = {lnj", 27};
```

- 定义的同时不按顺序初始化

```c
struct Student {
     char *name;
     int age;
 };
struct Student stu = {.age = 35, .name = lnj"};
```

- 先定义后逐个初始化

```c
struct Student {
     char *name;
     int age;
 };
 struct Student stu;
stu.name = "lnj";
stu.age = 35;
```

- 先定义后一次性初始化

```c
struct Student {
     char *name;
     int age;
 };
struct Student stu;
stu2 = (struct Student){"lnj", 35};
```

---

## 结构体类型作用域

- 结构类型定义在函数内部的作用域与局部变量的作用域是相同的

+ 从定义的那一行开始, 直到遇到return或者大括号结束为止

- 结构类型定义在函数外部的作用域与全局变量的作用域是相同的

+ 从定义的那一行开始,直到本文件结束为止

```c
//定义一个全局结构体,作用域到文件末尾
struct Person{
    int age;
    char *name;
};

int main(int argc, const char * argv[])
{
    //定义局部结构体名为Person,会屏蔽全局结构体
    //局部结构体作用域,从定义开始到“}”块结束
    struct Person{
        int age;
    };
    // 使用局部结构体类型
    struct Person pp;
    pp.age = 50;
    pp.name = "zbz";

    test();
    return 0;
}

void test() {

    //使用全局的结构体定义结构体变量p
    struct Person p = {10,"sb"};
    printf("%d,%s\n",p.age,p.name);
}
```

## 

最后,如果有任何疑问,请加微信 **leader_fengy** 拉你进学习交流群。

开源不易,码字不易,如果觉得有价值,欢迎分享支持。