8-1 结构体

1. 结构体,数值的聚合,形成一个对象,基本的定义形式如下

  /*
   * struct <结构体名> {
   *  <成员类型> <成员名>;
   *  ...
   * } <结构体变量>;
   */

  // 定义了一个新的类型,类型名叫 Person
  struct Person{
    char *name;
    int age;
    char *id;
  };

当然,可以在定义这个结构体的时候定义该类型对应的变量,也可以在定义结构体之后定义一个新变量,两者皆可

struct Person{
    char *name;
    int age;
    char *id;
  } person;    // 这样是在定义新类型 Person 的同时,又用这个类型定义了一个新的变量 person;

struct Person preson;  // 也可以这样单独拿出来定义,此时已经开辟了这块内存

如果这个结构体仅使用一次,也可以不定义结构体的名字,直接定义它所对应的变量,比如:

struct {
    char *name;
    int age;
    char *id;
} anonymous_person;  // 不定义结构体类型名,直接定义其变量

2. 如何初始化结构体,想一下数组的初始化

struct Person preson = {"abc", 200, "123456"};

这样正常的初始化是没有问题的,但是如果不初始化年龄,只初始化 name 和 id 那要怎么做呢?直接这样属性名赋值是不行的

这时需要用到成员选择运算符,在属性前面多了一个 .

struct Person person = {.name="abc", .id="123456"};

3. 如何获取结构体内部的属性值呢?

struct Person person;
person.name = "a";
person.age = 10;
person.id = "1123123";

printf("name:%s, age:%d, id: %s", person.name, person.age, person.id);   // name:a, age:10, id: 1123123

4. 结构体地址是多少,内部成员的地址呢?

那么,结构体指针该如何定义,如何利用结构体指针进行值的读取呢,这里还是要继续用到成员选择运算符,只不过对应指针的运算符变成了 -> 

struct Person *person_ptr = &person;
person_ptr->name = "aaa";
person_ptr->age = 11;
person_ptr->id = "112";
printf("\nname:%s, age:%d, id: %s", person_ptr->name, person_ptr->age, person_ptr->id); // name:aaa, age:11, id: 112

5. 看一个结构体占据了多大的内存

// 两种方式查看结构体的大小
printf("\nsizeof(struct Person): %d", sizeof(struct Person));  // sizeof(struct Person): 24
printf("\nsizeof(person): %d", sizeof(person));                // sizeof(person): 24

注意,上面在查看结构体大小时,struct 关键字不能丢,对比上面可以发现,一直存在 struct 关键字,能不能用什么方法,不要每次都加 struct 呢?当然可以,先前的 typedef 又要起到妙用了

6. 利用 typedef 隐藏 struct 关键字

typedef struct Person Person;  // Person 有了两重含义
Person person1 = {.name = "andy", .age=20};
printf("\nname: %s, age: %d", person1.name, person1.age);  // name: andy, age: 20

还有另外一种方式,在定义结构体的同时,就利用 typedef 进行名称的改写,注意,此时结构体后面的 Student 是 typedef 定义的别名,不是结构体变量,是个类型

7. 结构体嵌套该如何实现?比如上面的 Student 结构体,如果要添加另外一些属性,比如公司名,公司 id,公司位置,该如何添加?第一种方式:在结构体里直接添加;第二种方式,嵌套一个公司的结构体;直接展示第二种的 demo

typedef struct Company{
    char *name;
    char *id;
    char *location;
}Company;

typedef struct Student{
    char *name;
    int age;
    int class;
    Company *company; // 嵌套了一个公司的结构体,只不过这里添加的是结构体指针了
}Student;

8. 更进一步,如果结构体里面有多个嵌套的结构体,如何去调用里面的值呢?一层层点下去就好

typedef struct Student{
    char *name;
    int age;
    int class;
    Company *company; // 嵌套了一个公司的结构体,只不过这里添加的是结构体指针了
    struct {
      int extra;
      char *extra_str;
    }extra_value;
}Student;

Student student;
student.extra_value.extra = 1;
student.company->name = "Ali";

嵌套的结构体如何初始化呢?

  typedef struct Company{
    char *name;
    char *id;
    char *location;
  }Company;

  typedef struct Student{
    char *name;
    int age;
    int class;
    Company *company; // 嵌套了一个公司的结构体,只不过这里添加的是结构体指针了
    Company company1;

    struct {
      int extra;
      char *extra_str;
    }extra_value;  // 定义一个匿名结构体

    struct Person *person_ptr;  // 定义一个指向Person结构体类型的指针, 注意这里是要加 struct 关键字的,因为这里别名还没生效
  }Student;

  // 结构体初始化
  Company company = {.name="ali",.id="123"};
  Student student = {.name="andy", .company=&company,
                     .company1={.name="ten",.id="22"}
  };

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值