百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术文章 > 正文

C/C++语言的const关键字说明_c++ const详解

zhezhongyun 2025-10-19 15:35 4 浏览

在C/C++编程领域,const关键字是一个基础且关键的存在。它如同“安全卫士”,能帮助开发者限制数据的修改,减少程序中的bug,提升代码的可读性和可维护性。无论是刚接触C/C++的初学者,还是有一定开发经验的人员,深入理解const关键字的用法都至关重要。正如编程专家所言,“合理使用const关键字,是写出高质量C/C++代码的第一步。”

一、const修饰普通变量

const修饰普通变量时,表示该变量的值在定义后不能被修改,即该变量成为常量。比如下面示例代码:

#include <stdio.h>

int main(int argc, char **argv) {

const int num = 10;

// num = 20; // 错误,const修饰的变量不能被修改

printf("num的值为:%d\n", num);

return 0;

}

const修饰普通变量有几点需要注意:

(1)const修饰的变量必须在定义时进行初始化,否则后续无法赋值,编译器会报错。例如下面代码是错误的写法:

const int a;

a = 5;

(2)在C语言中,const修饰的变量本质上还是变量,只是不能直接修改,它不能用来定义数组的大小(C99之前标准,如C89/C90,从C99开始已经支持)。而在C++中,const修饰的变量是真正的常量,可以用来定义数组大小。

二、const 修饰指针

const修饰指针时,情况相对复杂,需要根据const与“*”的位置关系来判断,主要有三种情况。

(1)const修饰指针指向的内容

const修饰指针指向的内容时,指针指向的内容不能被修改,但指针本身的指向可以改变。比如下面示例代码:

#include <stdio.h>

int main(int argc, char **argv) {

int a = 10, b = 20;

const int *p = &a;

// *p = 15; // 错误,不能修改指针指向的内容

p = &b; // 正确,可以改变指针的指向

printf("*p的值为:%d\n", *p);

return 0;

}

在这种情况下需要注意的是,“const int *p”和“int const *p”的含义是相同的,都表示指针指向的内容不可修改。

(2)const修饰指针本身

const修饰指针本身时,指针本身的指向不能被修改,但指针指向的内容可以改变。比如下面示例代码:

#include <stdio.h>

int main(int argc, char **argv) {

int a = 10, b = 20;

int *const p = &a;

*p = 15; // 正确,可以修改指针指向的内容

// p = &b; // 错误,不能改变指针的指向

printf("*p的值为:%d\n", *p);

return 0;

}

需要注意的是,使用const修饰指针本身时,必须同时对其进行初始化,确定其初始指向,因为后续无法再改变指针的指向。

(3)const既修饰指针指向的内容,又修饰指针本身

const既修饰指针指向的内容,又修饰指针本身时,指针指向的内容和指针本身的指向都不能被修改。比如下面示例代码:

#include <stdio.h>

int main(int argc, char **argv) {

int a = 10, b = 20;

const int *const p = &a;

// *p = 15; // 错误,不能修改指针指向的内容

// p = &b; // 错误,不能改变指针的指向

printf("*p的值为:%d\n", *p);

return 0;

}

需要注意的是,const既修饰指针指向的内容,又修饰指针本身时,这种指针在定义时必须初始化,且后续没有任何修改的可能性,使用时需谨慎考虑使用场景。

三、const修饰函数参数

const修饰函数参数时,主要是为了防止函数内部修改参数的值,保护实参的数据安全。

(1)修饰普通类型参数

比如下面示例代码:

#include <stdio.h>

void printNum(const int &num) {

// num = 20; // 错误,不能修改const修饰的函数参数

printf("num的值为:%d\n", num);

}

int main(int argc, char **argv) {

int a = 10;

printNum(a);

return 0;

}

注意的是,对于普通类型的参数,使用const修饰主要是为了明确函数的意图,告诉其他开发者该参数在函数内部不会被修改,增强代码的可读性。

(2)修饰指针/引用类型参数

比如下面示例代码:

#include <stdio.h>

void printStr(const char *str) {

// *str = 'a'; // 错误,不能修改指针指向的内容

printf("字符串为:%s\n", str);

}

int main(int argc, char **argv) {

char str[] = "hello";

printStr(str);

return 0;

}

需要注意的是,当函数参数是指针/引用类型时,使用const修饰可以有效防止函数内部意外修改指针/引用指向的数据,避免对实参造成不必要的改变,尤其在处理字符串、数组等数据时非常实用。

四、const修饰函数返回值

const修饰函数返回值时,主要是限制函数返回值的使用方式,防止返回值被意外修改。

(1)返回const普通类型

比如下面示例代码:

#include <stdio.h>

const int getNum() {

return 10;

}

int main(int argc, char **argv) {

const int num = getNum();

// num = 20; // 错误,返回的const值不能被修改

printf("num的值为:%d\n", num);

return 0;

}

需要注意的是,对于返回普通const类型的函数,其实际意义不是很大,因为函数返回的是一个临时值,即使不加 const,也不能直接修改这个临时值。

(2)返回const指针/引用类型

比如下面示例代码:

#include <stdio.h>

const int *getPtr(int *arr) {

return &arr[0];

}

int main(int argc, char **argv) {

int arr[] = {1, 2, 3};

const int *p = getPtr(arr);

// *p = 10; // 错误,不能修改返回的const指针指向的内容

printf("*p的值为:%d\n", *p);

return 0;

}

需要注意的是,当函数返回一个指针/引用,且不希望调用者修改指针/引用指向的内容时,使用const修饰返回值就非常有必要了,它可以强制调用者将返回的指针/引用赋值给 const 指针/引用变量,从而限制对指针/引用指向内容的修改。

五、结语

const关键字在C/C++语言中有着广泛且重要的应用,它不仅能提高代码的安全性,减少潜在的bug,还能增强代码的可读性和可维护性。无论是修饰普通变量、指针,还是函数参数和返回值,都有其特定的规则和用法。对于C/C++开发初学者来说,需要耐心理解和掌握const关键字的各种用法,并通过大量的代码实践来加深印象;对于有一定开发经验的人员,也需要不断总结和梳理const关键字的使用技巧,在实际开发中合理、灵活地运用const关键字,写出更高质量的C/C++代码。

六、联系

如果有任何疑问欢迎随时交流。学无止境,实事求是,每天进步一点点!

相关推荐

信奥赛知识点_信奥赛 教材

信息学奥赛(NOIP/CSP等)中,C语言是核心编程语言,考察重点是算法逻辑、数据结构应用和代码效率。以下整理了信奥赛中典型的C语言知识点及对应试题(从基础到进阶),涵盖入门到提高组常见内容。...

如何在 Docker 中设置环境变量 ?_docker run设置环境变量

Docker是一个开源平台,它简化了在容器中创建、部署和管理应用程序。一个容器是一种可移植的、轻量级的、自包含的运行时环境,包含运行应用程序所需的一切。容器化的关键组成部分之一是管理环境变量。环境变...

C++中的头文件以及源文件_c++头文件格式有哪些

在C++中,头文件和源文件是组织代码的两种不同文件,作用和编写方式不同,是组织代码的基本方式,两者共同构成了项目的模块化结构头文件的作用头文件扩展名为`.h`或`.hpp`,通常包含:函数声明(原型)...

杰x分享(102):51单片机基础(二十四)

分享兴趣,传播快乐,增长见闻,留下美好。亲爱的您,这里是LearingYard学苑!今天小编为您带来“51单片机基础”欢迎您的访问!Shareinterest,spreadhappiness,i...

西门子S71200/1500PLC用GET_DIAG指令获取第三方IO模块通信状态?

我们在项目中,如果是西门子PLC的分布式IO模块,可以通过调用DeviceStates指令或者ModuleStates指令来获取模块的详细信息。下图是采用DeviceStates指令来获取两个IO...

Python变量类型和运算符_python中变量类型

变量类型变量与命名规则在Python中,变量是存储数据的容器,不需要事先声明类型,直接赋值即可创建。变量名只能包含字母、数字和下划线,且不能以数字开头。Python的变量名是大小写敏感的(例如a...

02010602 方法02-值参数、引用参数、输出参数、参数数组

02010602方法02-值参数、引用参数、输出参数、参数数组、ref局部变量和ref返回方法的参数是一个特殊变量1.形参形参→是局部变量,它声明在方法的参数列表中,而不是方法体中。publi...

C/C++语言的const关键字说明_c++ const详解

在C/C++编程领域,const关键字是一个基础且关键的存在。它如同“安全卫士”,能帮助开发者限制数据的修改,减少程序中的bug,提升代码的可读性和可维护性。无论是刚接触C/C++的初学者,还是有一定...

JavaScript ES6 let、cont、解构_js es6方法

let和const遇到{}就形成作用域同一作用域不能重复声明变量或函数[如:let声明过不能用const和var声明相同名字]没有变量提升const必须初始化赋值,不能被修改,而...

Kubernetes v1.34: 使用 Init 容器定义应用环境变量

Kubernetes通常使用ConfigMap和Secret来设置环境变量,这会引入额外的API调用和复杂性。例如,你需要分别管理工作负载的Pod和它们的配置,同时还要确保配置和...

全面详解 Python 类变量与实例变量的访问步骤

1.核心概念:什么是类变量和实例变量?在开始讨论访问步骤之前,我们首先要明确这两个概念的定义和区别。类变量(ClassVariable)定义位置:在类的内部,但在任何方法(包括__init__...

golang编程细讲-变量/常量/表达式

我们之前说到了函数通常封装了单个事情的处理过程。这个处理的过程通常需要有输入信息,然后处理后,产生/返回处理结果信息。这些输入/输出的信息,或者说数据,我们使用变量来表示。因此变量这个概念本身就是一种...

Python 访问类变量与实例变量:步骤梳理与原理讲解

核心概念速览在深入细节之前,我们先快速区分一下两者:类变量(ClassVariable):定义位置:在类的内部,但在任何方法的外部。所属对象:属于类本身。共享性:被所有该类的实例(对象)共享...

golang嵌入脚本语言-tengo语言的语法-变量/语句/表达式

让我们步入tengo的基本语法部分。首先tengo支持单行注释和多行注释://这是一个单行注释/**这是一个多行注释*/其次,tengo是一个动态脚本语言,因此变量本身无类型,有类型的是变量...

【第17集】C++ 逻辑变量:编程世界的&quot;真假侦探&quot;

同学们好!今天我们要学习C++中超级重要的逻辑变量!它们就像是编程世界的"真假侦探",专门负责判断条件是真还是假!一、什么是逻辑变量?通俗理解:逻辑变量=编程版的"是非题...