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;
相关推荐
郝学胜_神的一滴1 小时前
Qt 高级开发 027: QTabWidget自定义样式表美化实战
c++·qt
啦啦啦啦啦zzzz1 小时前
数据结构:哈夫曼编码
数据结构·c++·哈夫曼编码
兵哥工控1 小时前
MFC开关量输出发脉冲实例
c++·mfc·开关量发脉冲
ChillCoding1 小时前
更新中:C++ STL库,查找排序(基础算法),数据结构,数学算法,竞赛相关基础
数据结构·c++·算法
智者知已应修善业1 小时前
【51单片机使用IO组赋值方法实现无源蜂鸣器响时LED12亮不响时34亮】2024-3-7
c++·经验分享·笔记·算法·51单片机
.千余2 小时前
【C++】深挖STL list底层:解迭代器与节点存储逻辑
开发语言·c++·笔记·学习·其他
雪落漂泊2 小时前
C++ 继承与多态(上)
开发语言·c++
聆风吟º2 小时前
【C++11新章】列表初始化详解
开发语言·c++·列表初始化
alwaysrun2 小时前
C++之灵活易用的YAML解析库yaml-cpp
c++·后端·程序员