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

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

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

在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++代码。

六、联系

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

相关推荐

Python入门学习记录之一:变量_python怎么用变量

写这个,主要是对自己学习python知识的一个总结,也是加深自己的印象。变量(英文:variable),也叫标识符。在python中,变量的命名规则有以下三点:>变量名只能包含字母、数字和下划线...

python变量命名规则——来自小白的总结

python是一个动态编译类编程语言,所以程序在运行前不需要如C语言的先行编译动作,因此也只有在程序运行过程中才能发现程序的问题。基于此,python的变量就有一定的命名规范。python作为当前热门...

Python入门学习教程:第 2 章 变量与数据类型

2.1什么是变量?在编程中,变量就像一个存放数据的容器,它可以存储各种信息,并且这些信息可以被读取和修改。想象一下,变量就如同我们生活中的盒子,你可以把东西放进去,也可以随时拿出来看看,甚至可以换成...

绘制学术论文中的“三线表”具体指导

在科研过程中,大家用到最多的可能就是“三线表”。“三线表”,一般主要由三条横线构成,当然在变量名栏里也可以拆分单元格,出现更多的线。更重要的是,“三线表”也是一种数据记录规范,以“三线表”形式记录的数...

Python基础语法知识--变量和数据类型

学习Python中的变量和数据类型至关重要,因为它们构成了Python编程的基石。以下是帮助您了解Python中的变量和数据类型的分步指南:1.变量:变量在Python中用于存储数据值。它们充...

一文搞懂 Python 中的所有标点符号

反引号`无任何作用。传说Python3中它被移除是因为和单引号字符'太相似。波浪号~(按位取反符号)~被称为取反或补码运算符。它放在我们想要取反的对象前面。如果放在一个整数n...

Python变量类型和运算符_python中变量的含义

别再被小名词坑哭了:Python新手常犯的那些隐蔽错误,我用同事的真实bug拆给你看我记得有一次和同事张姐一起追查一个看似随机崩溃的脚本,最后发现罪魁祸首竟然是她把变量命名成了list。说实话...

从零开始:深入剖析 Spring Boot3 中配置文件的加载顺序

在当今的互联网软件开发领域,SpringBoot无疑是最为热门和广泛应用的框架之一。它以其强大的功能、便捷的开发体验,极大地提升了开发效率,成为众多开发者构建Web应用程序的首选。而在Spr...

Python中下划线 ‘_’ 的用法,你知道几种

Python中下划线()是一个有特殊含义和用途的符号,它可以用来表示以下几种情况:1在解释器中,下划线(_)表示上一个表达式的值,可以用来进行快速计算或测试。例如:>>>2+...

解锁Shell编程:变量_shell $变量

引言:开启Shell编程大门Shell作为用户与Linux内核之间的桥梁,为我们提供了强大的命令行交互方式。它不仅能执行简单的文件操作、进程管理,还能通过编写脚本实现复杂的自动化任务。无论是...

一文学会Python的变量命名规则!_python的变量命名有哪些要求

目录1.变量的命名原则3.内置函数尽量不要做变量4.删除变量和垃圾回收机制5.结语1.变量的命名原则①由英文字母、_(下划线)、或中文开头②变量名称只能由英文字母、数字、下画线或中文字所组成。③英文字...

更可靠的Rust-语法篇-区分语句/表达式,略览if/loop/while/for

src/main.rs://函数定义fnadd(a:i32,b:i32)->i32{a+b//末尾表达式}fnmain(){leta:i3...

C++第五课:变量的命名规则_c++中变量的命名规则

变量的命名不是想怎么起就怎么起的,而是有一套固定的规则的。具体规则:1.名字要合法:变量名必须是由字母、数字或下划线组成。例如:a,a1,a_1。2.开头不能是数字。例如:可以a1,但不能起1a。3....

Rust编程-核心篇-不安全编程_rust安全性

Unsafe的必要性Rust的所有权系统和类型系统为我们提供了强大的安全保障,但在某些情况下,我们需要突破这些限制来:与C代码交互实现底层系统编程优化性能关键代码实现某些编译器无法验证的安全操作Rus...

探秘 Python 内存管理:背后的神奇机制

在编程的世界里,内存管理就如同幕后的精密操控者,确保程序的高效运行。Python作为一种广泛使用的编程语言,其内存管理机制既巧妙又复杂,为开发者们提供了便利的同时,也展现了强大的底层控制能力。一、P...