0Pricing
C Academy · 课时

register 与 const

提示与不可变性

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

register 提示

register 建议将变量保存在 CPU 寄存器中以提高速度。它只是一个提示;现代编译器通常会忽略它。

#include <stdio.h>
int main(void) {
    register int i;
    int sum = 0;
    for (i = 0; i < 5; i++)
        sum += i;
    printf("sum = %d\n", sum);
    return 0;
}

不能获取其地址

由于 register 变量可能不在内存中,因此不能使用 & 获取它的地址。

#include <stdio.h>
int main(void) {
    register int x = 10;
    printf("x = %d\n", x);
    return 0;
}

register 如今很少使用的原因

优化编译器已经能够将高频使用的变量放入寄存器。如今这个关键字主要只具有历史意义。

#include <stdio.h>
int main(void) {
    int product = 1;
    for (register int i = 1; i <= 4; i++)
        product *= i;
    printf("product = %d\n", product);
    return 0;
}

const 限定符

const 使变量在初始化后只读。尝试修改它会产生编译错误。

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

常量表达设计意图

对固定值使用 const 可以让代码更清晰,并防止意外修改。

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

const 与指针

const int *p 表示不能通过 p 修改所指向的值,但指针本身仍可以指向其他位置。

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

常量指针

int * const p 表示指针不能改变,但它所指向的值可以改变。

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

const 函数参数

将参数标记为 const,表示函数不会修改它,这有助于调用者理解函数行为。

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

按设计保持不可变

对于任何不应改变的值,请优先使用 const。它可以在编译时发现错误。

#include <stdio.h>
int main(void) {
    const int LIMIT = 100;
    int x = 90;
    if (x < LIMIT)
        printf("under limit\n");
    return 0;
}

结合使用 const 与全局变量

全局 const 是一种安全的共享常量,整个文件都可以使用它。

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

同时使用 register 和 const

您甚至可以同时采用这两种方式标记循环计数器,不过这里的 const 表示循环体不能修改它。

#include <stdio.h>
int main(void) {
    int sum = 0;
    for (int i = 0; i < 3; i++) {
        const int doubled = i * 2;
        sum += doubled;
    }
    printf("sum = %d\n", sum);
    return 0;
}

快速检查

请检验您对 register 和 const 的理解。

回顾:register 与 const

您已经了解了两种限定符。

  • register 提示使用寄存器存储,但通常会被忽略
  • 不能获取 register 变量的地址
  • const 使值变为只读
  • 指针的 const 性有两种形式:常量值和常量指针
  • 请广泛使用 const 来提高安全性

常见问题解答

「register 与 const」课时是免费的吗?

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

「register 与 const」这节课中我会学到什么?

提示与不可变性 你通过在浏览器中直接运行的动手代码来练习 C Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 C Academy 需要有经验吗?

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

「register 与 const」课时需要多长时间?

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

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

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

此课程中的所有课时

  1. auto 与局部作用域
  2. static 变量
  3. extern 与全局变量
  4. register 与 const
← 返回 C Academy