C语言中,const关键字用法,详细解读

目录

    • [‌1. 修饰普通变量‌](#‌1. 修饰普通变量‌)
    • [‌2. 修饰指针‌](#‌2. 修饰指针‌)
      • [(1) ‌指向常量的指针‌](#(1) ‌指向常量的指针‌)
      • [(2) ‌常量指针‌](#(2) ‌常量指针‌)
      • [(3) ‌指向常量的常量指针‌](#(3) ‌指向常量的常量指针‌)
    • [‌3. 函数参数中的const‌](#‌3. 函数参数中的const‌)
    • [‌4. 函数返回值中的const‌](#‌4. 函数返回值中的const‌)
    • ‌5.注意事项‌
    • ‌6.与#define的区别‌

在C语言中,const关键字用于定义只读变量或指针,增强代码的安全性和可读性。以下是const的详细用法及注意事项:

‌1. 修饰普通变量‌

‌作用‌:变量值不可修改,必须在定义时初始化。

‌示例‌:

c 复制代码
const int a = 10;  // 正确:声明时初始化
// a = 20;        // 错误:a是只读的
const float pi;    // 错误:未初始化

‌2. 修饰指针‌

const与指针结合时,需注意const的位置:

(1) ‌指向常量的指针‌

记忆 :看 const左边的

格式‌ :const T *p 或 T const *p
‌特点‌修饰 T(数据类型) , 剩下 *p 指针,所以const修饰常量内容。指针指向的内容不可修改,但指针本身可指向其他地址。

c 复制代码
int a = 10, b = 20;
const int *p = &a;
// *p = 30;       // 错误:不能修改指向的内容
p = &b;           // 正确:指针本身可改变

(2) ‌常量指针‌

‌格式‌ :T * const p
‌特点‌ :修饰 * , const修饰指针符号所以 指针p 不能变。指针本身不可修改(必须初始化),但指向的内容可修改。

c 复制代码
int a = 10;
int *const p = &a;
*p = 20;          // 正确:修改指向的值
// p = &b;        // 错误:指针不可改变

(3) ‌指向常量的常量指针‌

格式‌ :const T *const p

特点‌:指针和指向的内容均不可修改。

c 复制代码
	const int *const p = &a; 
	// *p = 20; // 错误:内容不可修改 
	// p = &b; // 错误:指针不可修改

‌3. 函数参数中的const‌

‌作用‌:防止函数内部意外修改参数指向的数据。

‌示例‌:

c 复制代码
void print(const char *str) {
    // str[0] = 'A';  // 错误:不能修改只读数据
    printf("%s\n", str);
}

‌4. 函数返回值中的const‌

‌作用‌:返回的指针指向的数据不可被修改。

‌示例‌:

c 复制代码
const char *getMessage() {
    return "Hello World";  // 字符串字面量是常量
}
int main() {
    const char *msg = getMessage();
    // msg[0] = 'h';      // 错误:不可修改
}

‌5.注意事项‌

‌1)初始化要求‌:

const变量必须在定义时初始化,否则编译错误。

c 复制代码
const int x;  // 错误:未初始化

‌2)通过指针强制修改const变量‌

虽然语法允许用指针绕过const限制,但这是‌未定义行为‌(可能导致程序崩溃):

c 复制代码
const int a = 10;
int *p = (int*)&a;
*p = 20;  // 未定义行为!

‌3)const变量不是常量表达式‌

在C89中,const变量不能用于数组长度等需要常量表达式的场景:

c 复制代码
const int size = 10;
int arr[size];  // C89中错误,C99支持变长数组(VLA)

‌6.与#define的区别‌

  • const变量有类型和地址,占用内存;
  • #define是预处理替换,无类型检查。

‌总结‌

用法示例 含义

const int a 变量a不可修改
const int *p/int const *p p指向的内容不可修改
int *const p 指针p不可指向其他地址
const int *const p 指针p和其内容均不可修改

合理使用const能提高代码健壮性,明确程序中数据的读写权限,减少错误。

相关推荐
rzl0232 分钟前
java web5(黑马)
java·开发语言·前端
jingling55544 分钟前
面试版-前端开发核心知识
开发语言·前端·javascript·vue.js·面试·前端框架
m0_687399841 小时前
写一个Ununtu C++ 程序,调用ffmpeg API, 来判断一个数字电影的视频文件mxf 是不是Jpeg2000?
开发语言·c++·ffmpeg
Natsume17101 小时前
嵌入式开发:GPIO、UART、SPI、I2C 驱动开发详解与实战案例
c语言·驱动开发·stm32·嵌入式硬件·mcu·架构·github
爱上语文1 小时前
Redis基础(5):Redis的Java客户端
java·开发语言·数据库·redis·后端
A~taoker1 小时前
taoker的项目维护(ng服务器)
java·开发语言
萧曵 丶1 小时前
Rust 中的返回类型
开发语言·后端·rust
shaun20012 小时前
华为c编程规范
c语言
hi星尘2 小时前
深度解析:Java内部类与外部类的交互机制
java·开发语言·交互
看到我,请让我去学习2 小时前
Qt编程-qml操作(js,c++,canvas)
开发语言·qt