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;
相关推荐
ZhangShao060715 小时前
题解:CF2249B
c++·算法
用户昵称10015 小时前
C/C++编程-工程实践-本地存储log的工程意义
c语言·开发语言
吹什么轩16 小时前
c++复习:map和set的使用
开发语言·c++
fpcc17 小时前
跟我学C++中级篇—内存流
开发语言·c++
吹什么轩18 小时前
c++复习:模拟实现list来更好的理解和应用list
开发语言·c++
AmyLin_200118 小时前
PDF 色彩保真工程实践【5】核心实现(下):拼装 Image XObject、页面资源与内容流
c++·pdf·sdk·颜色空间·印刷·icc·cmyk
乱七八糟的屋子19 小时前
MTL4 (Matrix Template Library) 超详细实战教程|C++高性能稠密/稀疏矩阵计算
c++·矩阵·稀疏矩阵·mtl4·matrixtemplate·c++线性代数·高性能数值计算
老师我太想进步了202620 小时前
C语言版讲解函数递归
c语言·开发语言
依然鸣20 小时前
PTA团体程序设计天梯赛L2真题讲解L2-045-048
数据结构·c++·经验分享·学习·算法·pat考试·pat
有点。20 小时前
C++深度优先搜索(二)
开发语言·c++·深度优先