当日核心知识:结构体定义与声明、结构体变量、内存对齐、结构体指针、结构体成员访问、typedef 别名、位运算基础
一、结构体基础(定义 / 声明 / 变量)
概念
结构体(struct)是自定义复合数据类型,可将不同类型数据封装为整体,描述复杂对象。
特性
-
定义格式:
struct 结构体名 { 成员类型1 成员名1; 成员类型2 成员名2; // 至少1个成员 }; // 末尾必 -
命名规则 :结构体名、成员名必须是合法标识符。
-
变量定义:
-
先定义类型、后定义变量:
struct 结构体名 变量名;(C 语言需 struct,C++ 可省略) -
定义类型同时定义变量:
struct 结构体名 { ... } 变量名;
-
-
内存分配 :类型本身无内存 ,变量才有内存;变量初始化与否不影响内存分配。
代码示例
// 结构体类型定义
struct Student {
char name[20];
int age;
float score;
};
// 定义结构体变量
struct Student s1; // C语言写法
Student s2; // C++简化写法
二、typedef 结构体别名
概念
用typedef给结构体类型起别名,简化变量定义,无需重复写 struct。
特性
-
格式 :
typedef struct 结构体名 { ... } 别名; -
用法 :直接用别名定义变量,C/C++ 通用。
-
优势:代码简洁,避免关键字冗余。
代码示例
// 定义别名Stu
typedef struct Student {
char name[20];
int age;
} Stu;
// 用别名定义变量
Stu s1;
三、结构体内存对齐
概念
结构体成员按规则分配内存,成员起始地址需对齐到指定边界,提升 CPU 读取效率。
特性
-
对齐规则:
-
成员按定义顺序依次分配。
-
对齐基准:结构体中最大基本数据类型的字节数(如 int=4,基准为 4)。
-
每个成员起始地址:必须是自身类型字节数的倍数。
-
结构体总大小:必须是对齐基准的倍数,不足则补空字节(内存填充)。
-
-
示例:
struct Test { char a; // 1字节,起始地址0 int b; // 4字节,起始地址需是4的倍数→4,中间空3字节 short c; // 2字节,起始地址8 }; // 总大小:12(4×3,基准4) -
目的 :CPU 按固定字节块读取内存,对齐可减少读取次数、提升效率。
代码示例
#include <iostream>
using namespace std;
struct Test {
char a;
int b;
short c;
};
int main() {
cout << sizeof(Test) << endl; // 输出12
return 0;
}
四、结构体成员访问
概念
通过 .(点运算符) 或**->(箭头运算符)** 访问结构体成员。
特性
-
结构体变量 :用
.访问,格式变量名.成员名。 -
结构体指针 :用
->访问,格式指针名->成员名;等价于(*指针名).成员名。 -
赋值规则:成员赋值需匹配类型,整体赋值仅同类型结构体变量可直接赋值。
代码示例
struct Student {
int age;
};
int main() {
Student s;
Student *p = &s;
// 变量访问:.
s.age = 18;
// 指针访问:->
p->age = 20;
// 等价写法
(*p).age = 22;
return 0;
}
相似概念比较:. vs ->
-
.:用于结构体变量 ,直接访问成员,注意.优先级高于*,用法:(*p).xxx。 -
->:用于结构体指针,间接访问成员,语法更简洁。
五、结构体指针
概念
指向结构体类型的指针,存储结构体变量地址,用于间接操作结构体。
特性
-
定义格式 :
结构体类型 *指针名;。 -
初始化 :指向同类型结构体变量,
指针名 = &变量名;。 -
内存特性:指针占固定字节(4/8 字节),与结构体大小无关。
-
用途:函数传参(避免拷贝,节省内存)、动态内存分配。
代码示例
struct Student {
int age;
};
int main() {
Student s = {18};
Student *p = &s; // 指针指向s
cout << p->age << endl; // 输出18
return 0;
}
六、语法细节(分号规则)
概念
区分结构体、函数、代码块后分号的使用场景。
特性
-
必须加分号:
-
结构体 / 枚举 / 类定义末尾。
-
变量声明、语句末尾。
-
-
无需加分号:
-
函数定义末尾(大括号表示作用域)。
-
代码块(if/for/while)末尾。
-
代码示例
// 结构体定义:末尾加分号
struct A { int x; };
// 函数定义:末尾不加分号
void fun() {}
// 变量声明:加分号
int a;
七、位运算基础
概念
直接操作二进制位,节省内存,用于状态标记、权限控制。
特性
-
核心思想:用二进制位表示状态(1 = 启用,0 = 禁用)。
-
优势:1 个字节(8 位)可存 8 种状态,比整型更省内存。
-
适用场景:状态标记、硬件控制、标志位管理。
代码示例
// 用位表示状态:0000 0001表示状态1
#define FLAG1 1
int status = FLAG1;