C语言关键字详解

一、static关键字

这也是面试或编程中最常见的关键字之一了,作用:

  1. 修饰局部变量:使变量成为静态局部变量,存储在静态存储区,生命周期延长至整个程序运行期间

  2. 修饰全局变量:限制变量作用域仅在本文件内(内部链接)

  3. 修饰函数:限制函数作用域仅在本文件内(内部链接)

  4. 修饰类成员(C++中):属于类本身而非对象实例

其中static修饰类成员需要举例详细说说

cpp 复制代码
#include <iostream>
using namespace std;

class Student {
public:
    Student(string n) : name(n) {
        count++;  // 每创建一个学生对象,计数加1
    }
    
    ~Student() {
        count--;  // 对象销毁时计数减1
    }
    
    // 静态成员函数 - 属于类本身
    static int getCount() {
        return count;
        // 注意:静态成员函数不能访问非静态成员
        // 错误:cout << name;  // 不能访问非静态name
    }
    
    // 非静态成员函数
    void display() {
        cout << "姓名:" << name << endl;
        cout << "当前学生总数:" << count << endl;  // 可以访问静态成员
    }
    
private:
    string name;        // 非静态成员 - 每个对象独有
    static int count;   // 静态成员 - 所有对象共享
};

// 静态成员必须在类外定义和初始化
int Student::count = 0;

int main() {
    // 访问静态成员 - 不需要创建对象
    cout << "初始学生数:" << Student::getCount() << endl;
    
    // 创建对象
    Student s1("张三");
    Student s2("李四");
    
    // 所有对象共享同一个静态成员
    cout << "创建2个学生后:" << endl;
    cout << "通过类名访问:" << Student::getCount() << endl;
    cout << "通过对象s1访问:" << s1.getCount() << endl;
    cout << "通过对象s2访问:" << s2.getCount() << endl;
    
    cout << "\n每个学生的信息:" << endl;
    s1.display();
    s2.display();
    
    {
        Student s3("王五");  // 在作用域内创建第三个学生
        cout << "\n创建第三个学生后:" << Student::getCount() << endl;
    }  // s3离开作用域被销毁
    
    cout << "\ns3销毁后:" << Student::getCount() << endl;
    
    return 0;
}

输出结果

cpp 复制代码
初始学生数:0
创建2个学生后:
通过类名访问:2
通过对象s1访问:2
通过对象s2访问:2

每个学生的信息:
姓名:张三
当前学生总数:2
姓名:李四
当前学生总数:2

创建第三个学生后:3

s3销毁后:2

static类成员的特点:

1 共享性:所有对象共享同一份静态成员

2 内存分配:在程序的数据段分配内存,不依赖于对象存在

静态成员:程序启动时分配,程序结束时释放

非静态成员:对象创建时分配,对象销毁时释放

3 访问方式:

int num = Student::getCount(); // 通过类名访问(推荐)

4 初始化:必须在类外单独定义和初始化,类内声明

二、const关键字

指向整型常量的指针变量 const int *p;

指向整型变量的指针常量 int * const p;

const与#define的区别

特性 const #define
类型检查 有类型检查 无类型检查,只是文本替换
作用域 遵守作用域规则 全局有效(除非#undef)
调试 可调试,有变量名 编译时替换,无变量名
内存 分配内存 不分配内存,只是替换
复杂类型 可定义复杂类型 只能定义简单常量

三、volatile关键字

1. 作用

告诉编译器该变量可能会被意外修改,每次访问时都必须从内存中读取,不要做优化(如寄存器缓存)。

2. 使用场景

  1. 硬件寄存器:映射到内存的硬件寄存器

  2. 中断服务程序:被中断修改的全局变量

  3. 多线程:多个线程共享的变量

  4. 信号处理程序:被信号处理函数修改的变量

3. 编译阶段作用

  • volatile:编译阶段起作用,告诉编译器不要优化

  • extern:链接阶段起作用,声明外部定义

四、sizeof关键字

1. 作用

编译时一元操作符(不是函数),计算数据类型或表达式所占内存字节数。

2.sizeof与strlen的区别

特性 sizeof strlen
性质 操作符/关键字 库函数
计算时机 编译时计算 运行时计算
参数 类型/变量 字符串指针
'\0'处理 包含'\0' 不包含'\0'
数组退化为指针 数组名不退化 数组名退化为指针

五、register关键字

1. 作用

建议编译器将变量存储在CPU寄存器中,以提高访问速度。

2. 注意事项

  1. 只是建议:编译器可能忽略

  2. 不能取地址&register_var 是非法的

  3. 有限数量:寄存器数量有限

  4. 现代编译器:通常自动优化,很少需要手动指定

  5. 适用类型:常用于循环计数器等频繁访问的变量

相关推荐
方璧17 小时前
限流的算法
java·开发语言
Hi_kenyon18 小时前
VUE3套用组件库快速开发(以Element Plus为例)二
开发语言·前端·javascript·vue.js
曲莫终18 小时前
Java VarHandle全面详解:从入门到精通
java·开发语言
ghie909018 小时前
基于MATLAB GUI的伏安法测电阻实现方案
开发语言·matlab·电阻
Gao_xu_sheng18 小时前
Inno Setup(专业安装/更新 EXE)
开发语言
吴声子夜歌19 小时前
Java数据结构与算法——基本数学问题
java·开发语言·windows
wanglei20070820 小时前
生产者消费者
开发语言·python
leo__52020 小时前
基于菲涅耳衍射积分的空心高斯光束传输数值模拟(MATLAB实现)
开发语言·matlab
昵称已被吞噬~‘(*@﹏@*)’~20 小时前
【RL+空战】学习记录03:基于JSBSim构造简易空空导弹模型,并结合python接口调用测试
开发语言·人工智能·python·学习·深度强化学习·jsbsim·空战