C/C++ 基础笔记(八)

当日核心知识:结构体定义与声明、结构体变量、内存对齐、结构体指针、结构体成员访问、typedef 别名、位运算基础


一、结构体基础(定义 / 声明 / 变量)

概念

结构体(struct)是自定义复合数据类型,可将不同类型数据封装为整体,描述复杂对象。

特性

  1. 定义格式:

    复制代码
    struct 结构体名 {
        成员类型1 成员名1;
        成员类型2 成员名2;
        // 至少1个成员
    }; // 末尾必
  2. 命名规则 :结构体名、成员名必须是合法标识符

  3. 变量定义:

    • 先定义类型、后定义变量:struct 结构体名 变量名;(C 语言需 struct,C++ 可省略)

    • 定义类型同时定义变量:struct 结构体名 { ... } 变量名;

  4. 内存分配类型本身无内存变量才有内存;变量初始化与否不影响内存分配。

代码示例

复制代码
// 结构体类型定义
struct Student {
    char name[20];
    int age;
    float score;
};
​
// 定义结构体变量
struct Student s1; // C语言写法
Student s2;        // C++简化写法

二、typedef 结构体别名

概念

typedef给结构体类型起别名,简化变量定义,无需重复写 struct。

特性

  1. 格式typedef struct 结构体名 { ... } 别名;

  2. 用法 :直接用别名定义变量,C/C++ 通用

  3. 优势:代码简洁,避免关键字冗余。

代码示例

复制代码
// 定义别名Stu
typedef struct Student {
    char name[20];
    int age;
} Stu;
​
// 用别名定义变量
Stu s1;

三、结构体内存对齐

概念

结构体成员按规则分配内存,成员起始地址需对齐到指定边界,提升 CPU 读取效率。

特性

  1. 对齐规则:

    • 成员按定义顺序依次分配。

    • 对齐基准:结构体中最大基本数据类型的字节数(如 int=4,基准为 4)。

    • 每个成员起始地址:必须是自身类型字节数的倍数

    • 结构体总大小:必须是对齐基准的倍数,不足则补空字节(内存填充)。

  2. 示例:

    复制代码
    struct Test {
        char a;  // 1字节,起始地址0
        int b;   // 4字节,起始地址需是4的倍数→4,中间空3字节
        short c; // 2字节,起始地址8
    }; // 总大小:12(4×3,基准4)
  3. 目的 :CPU 按固定字节块读取内存,对齐可减少读取次数、提升效率

代码示例

复制代码
#include <iostream>
using namespace std;
​
struct Test {
    char a;
    int b;
    short c;
};
​
int main() {
    cout << sizeof(Test) << endl; // 输出12
    return 0;
}

四、结构体成员访问

概念

通过 .(点运算符) 或**->(箭头运算符)** 访问结构体成员。

特性

  1. 结构体变量 :用 . 访问,格式变量名.成员名

  2. 结构体指针 :用 -> 访问,格式指针名->成员名;等价于(*指针名).成员名

  3. 赋值规则:成员赋值需匹配类型,整体赋值仅同类型结构体变量可直接赋值。

代码示例

复制代码
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。

  • ->:用于结构体指针,间接访问成员,语法更简洁。


五、结构体指针

概念

指向结构体类型的指针,存储结构体变量地址,用于间接操作结构体。

特性

  1. 定义格式结构体类型 *指针名;

  2. 初始化 :指向同类型结构体变量,指针名 = &变量名;

  3. 内存特性:指针占固定字节(4/8 字节),与结构体大小无关。

  4. 用途:函数传参(避免拷贝,节省内存)、动态内存分配。

代码示例

复制代码
struct Student {
    int age;
};
​
int main() {
    Student s = {18};
    Student *p = &s; // 指针指向s
    cout << p->age << endl; // 输出18
    return 0;
}

六、语法细节(分号规则)

概念

区分结构体、函数、代码块后分号的使用场景。

特性

  1. 必须加分号:

    • 结构体 / 枚举 / 类定义末尾。

    • 变量声明、语句末尾。

  2. 无需加分号:

    • 函数定义末尾(大括号表示作用域)。

    • 代码块(if/for/while)末尾。

代码示例

复制代码
// 结构体定义:末尾加分号
struct A { int x; };
​
// 函数定义:末尾不加分号
void fun() {}
​
// 变量声明:加分号
int a;

七、位运算基础

概念

直接操作二进制位,节省内存,用于状态标记、权限控制。

特性

  1. 核心思想:用二进制位表示状态(1 = 启用,0 = 禁用)。

  2. 优势:1 个字节(8 位)可存 8 种状态,比整型更省内存。

  3. 适用场景:状态标记、硬件控制、标志位管理。

代码示例

复制代码
// 用位表示状态:0000 0001表示状态1
#define FLAG1 1
int status = FLAG1;
相关推荐
luj_17681 小时前
大律师考核应重能力与科技素养
c语言·开发语言·c++·经验分享·算法
刃神太酷啦1 小时前
Linux 系统 MySQL 完整安装配置教程:从卸载 MariaDB 到优化 my.cnf----《Hello MySQL!》(1)
android·linux·c语言·c++·mysql·leetcode·mariadb
萌动的小火苗3 小时前
数据结构面试题【无答案】
c语言·开发语言·数据结构·链表
汉克老师4 小时前
CSP-J 初赛(以满分为目标):第十五课《结构体、排序与自定义比较——从“给数字排队”到“给一群人排队”》
c++·csp-j·小学生·学c++编程
HugoStudio_SWAN5 小时前
C++ CMD 互动动画:按键触发爆炸效果
开发语言·c++·学习·程序人生
水饺编程5 小时前
第5章,[Win32 章节] :Polygon 函数和多边形填充模式
c语言·c++·windows·visual studio
wuminyu5 小时前
Java FFM处理网络读写事件源码剖析
java·linux·c语言·jvm·c++
一木 之林6 小时前
C/C++ 面向对象编程(OOP)(进阶)
java·c语言·c++
千谦阙听7 小时前
C++篇:类和对象(上)
开发语言·c++
LONGZETECH8 小时前
新能源汽车动力电池实训教学痛点与虚拟仿真技术解决方案
c语言·3d·unity·架构·汽车·汽车教学软件