C语言结构体知识点记录
2018-09-09 本文已影响0人
超级皮波9
一.结构体
- 概念
- 结构体是构造类型的一种
- 构造类型前面还有
数组
- 数组的作用是用于储存一组
相同类型
的数据 -
结构体的作用是用于储存一组
不同类型
的数据
- 如何定义
- 先定义结构体的类型
- 通过结构体的类型定义结构体的变量
**定义结构体的类型**
//格式
struct 结构体类型名称{
数据类型 属性名称 ;
数据类型 属性名称 ;
};
//例子 定义结构体Person
struct Person {
char *name;
int age;
double height;
}; //分号注意一定要写
**定义结构体的变量**
//格式
struct 结构体类型名称 变量名称;
//例子 定义结构体变量 P
struct Person p;
**使用结构体变量**
//格式
结构体变量 . 结构体属性名称
//例子
p.name = "小明";
p.age = 10;
p.height = 1.8;
二 . 结构体变量的初始化
- 定义的同时初始化
- 注意: 如果定义的同时初始化,那么初始化的顺序必须和结构体类型中的顺序一致
#include <stdio.h>
int main(){
//定义结构体
struct Person{
char name;
int age;
int money;
};
//定义结构体变量同时初始化
struct Person p = {"jack",22,1000};
return 0;
}
- 先定义再初始化
#include <stdio.h>
int main(){
//定义结构体
struct Person{
char name;
int age;
int money;
};
//定义结构体变量 先定义再初始化
struct Person p;
p.name = "jack";
p.age = 22;
p.money = 100000;
return 0;
}
三.定义结构体变量的方式
- 先定义结构体类型,在定义结构体变量
#include <stdio.h>
int main(){
//定义结构体
struct Person{
char name;
int age;
int money;
};
//定义结构体变量
struct Person p;
return 0;
}
- 定义结构体类型的同时定义结构体变量
#include <stdio.h>
int main(){
//定义结构体
struct Person{
char name;
int age;
int money;
} p; //结构体变量p
return 0;
}
- 定义结构体类型的同时省略结构体名称,同时定义结构体变量
- 为匿名结构体 特点 : 结构体类型只能使用一次
#include <stdio.h>
int main(){
//定义结构体
struct {
char name;
int age;
int money;
} p; //结构体变量p
return 0;
}
4 . 结构体类型的作用域
- 作用域和变量的作用域一样
5 . 结构体内存分析
注意点
- 给整个结构体变量分配储存空间和数组一样,从内存地址比较大的开始分配
- 给结构体变量中的属性分配储存空间也和数组一样,从所占内存地址比较小的开始分配
定义结构体类型不会分配储存空间,只有定义结构体变量的时候才会分配储存空间
- 结构体在分配内存的时候,会做一个内存对齐的操作
- 会先获取所有属性中占用内存最大的属性的字节数
- 然后在开辟出最大属性字节的内存给第一个属性,如果分配给第一个属性之后还能继续分配给第二个属性,那么就继续分配给第二个属性
- 如果分配给第一个属性之后,剩余的内存不够分配给第二个属性了,那么会再次开辟最大属性的内存,再次分配 依次类推
#include <stdio.h>
int main(){
//定义结构体
struct Person {
char name; // 1 个节点 //开辟4个字节 char 占用1个
int age; // 4个字节 // 剩余三个 不够int 再开辟4个字节
int money; // 4个字节 // 再开辟4个字节
};
struct Person p; // 所以p = 4+4+4
printf("sizeof(p) = %i\n",sizeof(p)); // 12个字节
return 0;
}
六 .结构体和指针
-
结构体指针
因为结构体变量也会分配内存空间,所以结构体变量也有内存地址,所以可以使用指针保存结构体变量的地址 -
规律
定义结构体变量的指针的方法和定义普通变量的方法一样
如果指针指向了结构体变量,那么访问结构体变量的方法就有三中
1.结构体变量.属性名称
2.(*结构体指针变量名称).属性名称
3.结构体指针变量名称->属性名称
#include <stdio.h>
int main(){
//定义结构体
struct Person {
char *name;
int age;
int money;
};
struct Person per = {"小明",22,100};
struct Person *p = &per;
printf("per.name = %s\n",per.name); // 1. per.name = 小明
printf("(*p).name = %s\n",(*p).name); // 2. (*p).name = 小明
printf("p->name = %s\n",p->name); //3. p->name =小明
return 0;
}
七 . 结构体嵌套定义
- 结构体的属性可以又是一个结构体 , 提高代码的复用性
#include <stdio.h>
int main(){
//定义一个日期的结构体
struct Date{
int year;
int month;
int day;
};
//定义人的结构体
struct Person{
char *name;
int age;
struct Date birthday; // 嵌套定义日期的结构日
};
struct Person p = {"小明",22,{2018,9,9}}; // 初始化
return 0;
}