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"}
};