0Pricing
C Academy · 课时

const 变量

让值只能读取。

const 变量 是 CoddyKit 上的免费 C Academy 课时。 这是第 3 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 C Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 C Academy 课程共包含 4 节课。

常量限定符的含义

const 关键字告诉编译器,变量初始化后其值不得改变。

如果您之后尝试修改它,编译就会失败。这可以保护那些应该保持不变的值。

const int MAX_USERS = 100;

声明常量

您必须在声明 const 变量时为它赋值,因为之后不能再为它赋值。

这里 PI 只初始化一次,之后可以像读取普通变量一样使用它。

#include <stdio.h>
int main(void) {
    const double PI = 3.14159;
    printf("%f\n", PI);
    return 0;
}

尝试修改常量

声明后为 const 赋值会产生编译错误。

下面这一行会被编译器拒绝,这正是我们希望获得的保护。

const int LIMIT = 50;
/* LIMIT = 60; <- compile error */

常量具有类型

与原始宏不同,const 变量具有编译器会检查的真实类型。

这为您提供了类型安全:编译器知道 RATE 是一个 double,并会针对错误使用方式发出警告。

#include <stdio.h>
int main(void) {
    const double RATE = 0.05;
    double total = 200.0 * RATE;
    printf("%.2f\n", total);
    return 0;
}

常量与指针:数据

指针的常量限定有两种形式。const int *p 表示不能通过 p 修改它所指向的数据。

您仍然可以移动 p,使它指向其他位置,但不能通过它写入数据。

int x = 5;
const int *p = &x;
/* *p = 9; <- error: data is const */

常量与指针:指针

int *const p 表示指针本身不能重新赋值,但可以修改它所指向的数据。

请从右向左阅读声明:“p 是指向 int 的常量指针”。

int x = 5, y = 8;
int *const p = &x;
*p = 9;       /* allowed */
/* p = &y;    <- error: pointer is const */

保护函数参数

将指针参数标记为 const,就表示向函数调用者保证函数不会修改其数据。

这既记录了设计意图,也能让编译器捕获意外的写入操作。

#include <stdio.h>
void show(const char *msg) {
    printf("%s\n", msg);
}
int main(void) {
    show("hello");
    return 0;
}

计算中的 const

一种常见用途是表示固定的配置值,例如税率或换算因子。

读取常量可以让公式更清晰,并将该值集中在一个位置。

#include <stdio.h>
int main(void) {
    const double KM_PER_MILE = 1.609;
    double miles = 10.0;
    printf("%.2f km\n", miles * KM_PER_MILE);
    return 0;
}

Const 具有内存地址

由于 const 是一个真正的变量,因此它会占用内存,您也可以获取它的地址。

这不同于 #define 宏,后者只是纯文本替换,不具有地址。

#include <stdio.h>
int main(void) {
    const int N = 42;
    const int *p = &N;
    printf("%d\n", *p);
    return 0;
}

作用域与生命周期

const 遵循与普通变量相同的作用域规则。

在函数内部声明时,它是局部的;在函数外部声明时,它是全局的。这种作用域特性是它相较于整个文件范围宏的另一项优势。

#include <stdio.h>
const int GLOBAL_MAX = 1000;
int main(void) {
    const int local_min = 1;
    printf("%d %d\n", local_min, GLOBAL_MAX);
    return 0;
}

const 与魔法数字

用命名的 const 值替换代码中的原始数字,可以消除“魔法数字”。

如果这个值将来发生变化,您只需修改一行,而不必在整个程序中逐处查找。

#include <stdio.h>
int main(void) {
    const int SECONDS_PER_MIN = 60;
    int minutes = 5;
    printf("%d seconds\n", minutes * SECONDS_PER_MIN);
    return 0;
}

快速检查

检查您对 const 行为的掌握情况。

回顾

const 变量是一个具有类型、只读且由编译器保护其不被修改的值。

它具有类型、作用域和地址,而宏没有。使用指针时,const 可以应用于数据、指针,或同时应用于两者。接下来我们将把它与 #define 进行比较。

常见问题解答

「const 变量」课时是免费的吗?

是的 — 「const 变量」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 C Academy 课程的其余内容,请升级到 CoddyKit PRO。 C Academy 课程共包含 4 节课。

「const 变量」这节课中我会学到什么?

让值只能读取。 你通过在浏览器中直接运行的动手代码来练习 C Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 C Academy 需要有经验吗?

无需任何先前经验。CoddyKit 上的 C Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 3 节课,共 4 节。

「const 变量」课时需要多长时间?

大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。

我能在这节 C Academy 课中编写并运行代码吗?

能。每节 C Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。

此课程中的所有课时

  1. 定义枚举
  2. 枚举值与范围
  3. const 变量
  4. #define 常量
← 返回 C Academy