常量的概念以及用法
1. 字面常量 (Literal Constants)
直接在代码中写出的具体数值或字符,没有名字。
整型常量:10, -5, 0xFF (十六进制), 012 (八进制)
浮点常量:3.14, 1.2e-5
字符常量:'A', 'n', '\n' (转义字符)
字符串常量:"Hello World"
2.使用 #define 宏定义 (预处理常量)
这是 C 语言中最传统的定义常量的方法。它在预处理阶段进行简单的文本替换,不分配内存,没有类型检查
3.使用 const 关键字 (常变量)
语法:const 数据类型 常量名 = 值;
特点:
必须以分号;结尾。
有类型安全(Type Safety)。
可以进行调试(因为它是符号表的一部分)。
可以限定指针指向的内容不可变。
const 与指针的结合(难点)
const 放在 * 的不同位置,含义不同
const int *p 或 int const *p: 含义:指针指向的内容是常量,不能通过指针修改值,但指针本身可以指向别处。 口诀:“const 在 * 左边,内容不可改”。
int * const p: 含义:指针本身是常量,不能改变指针的指向,但可以通过指针修改它指向的值。 口诀:“const 在 * 右边,指针不可改”。
const int * const p: 含义:两者都不可改
| 声明 | 读法 | 修改*p(值) | 修改p(地址) | 记忆技巧 |
|---|---|---|---|---|
int *p | 普通指针 | ✅ | ✅ | 随便改 |
const int *p | 常量指针 | ❌ | ✅ | 左边管值 |
int * const p | 指针常量 | ✅ | ❌ | 右边管指向 |
const int * const p | 指向常量的常量指针 | ❌ | ❌ | 锁死 |
4.枚举(enum)
如果需要定义一组相关的整数常量,使用 enum 更清晰
#include<stdio.h> int main() { enum Color{ red = 1, green = 6, blue }; printf("red=%d\n",red); printf("green=%d\n",green); printf("blue=%d\n",blue); return 0; }5.#define 与 const 的区别总结
| 特性 | #define(宏) | const(关键字) |
|---|---|---|
| 处理阶段 | 预处理阶段(编译前) | 编译阶段 |
| 类型检查 | 无(纯文本替换,易出错) | 有(类型安全) |
| 内存占用 | 不分配内存(直接替换代码) | 通常分配内存(存储在数据段) |
| 调试支持 | 不支持(调试器看不到宏名) | 支持(调试器可以看到变量名) |
| 地址操作 | 不能取地址 (&) | 可以取地址 (&) |
| 推荐程度 | 旧式写法,用于复杂的宏逻辑 | 现代 C 语言推荐写法 |
预处理器宏与变量的区别
#define 是一个预处理器指令,用于在编译前将某些文本替换为指定的值。它没有类型信息,是简单的文本替换。#define 声明的常量不会占用内存,它只是在预处理阶段做替换。
const 是C语言中的一个类型修饰符,用来声明常量,它会为常量分配内存并指定类型。常量的值在程序运行期间不可修改。
类型安全
#define 没有类型信息,编译器无法检查类型。因此,它在某些情况下可能导致类型不匹配的问题。
const 声明的常量具有类型,可以利用编译器的类型检查来避免错误。
作用域
#define 声明的常量是全局的,通常在整个文件中有效,甚至跨函数调用,除非使用#undef来取消定义。
const 声明的常量遵循变量的作用域规则,可以限制常量的作用范围。
#define 更适用于简单的常量替换、条件编译和宏函数,它不具备类型检查,灵活性高,但容易引发错误。
const 更适用于需要类型安全、具有作用域限制的常量声明,特别是在涉及到变量和复杂数据类型时。
