C/C++ 基础笔记(八)
当日核心知识:结构体定义与声明、结构体变量、内存对齐、结构体指针、结构体成员访问、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;