C语言const的4种用法实例

 更新时间:2025年09月03日 10:46:57   作者:C语言中文网  
C语言中const用于禁止修改数组元素、指针内容或基本变量,修饰位置不同,本文就来介绍一下C语言const的4种用法实例,具有一定的参考价值,感兴趣的可以了解一下

我们编写过类似以下的 C 语言代码,用于修改字符数组中的值:

char str[20] = "hello\n";
printf("%s", str);
str[0] = 'H';
printf("%s", str);

那么,我们如果想禁止数组 str 的元素被修改,应该怎样做呢?

C语言const修饰数组元素

在 C语言中,const 是一个关键字,用于修饰一个变量,以表示该变量的值不可被修改。在程序中,const 可以用于修饰变量、指针、函数等不同的对象。

因此,为了让数组不被修改,我们可以在原来的代码char str[20] = "hello\n"前面加上 const 关键字,例如:

const char str[20] = "hello\n";

当使用 const 关键字修饰 char 时,char 将被禁止修改。数组 str 的元素 char 无法被修改,如果后续的语句尝试修改数组元素,编译器将报错。

需要注意的是,const 关键字可以放在 char 旁边,无论放在 char 的左边还是右边,都具有相同的效果。下面两种写法是等效的:

const char str[20] = "hello\n";
char const str[20] = "hello\n";

这样,我们就成功地保护了数组 str 的元素不被修改。

C语言const修饰指针所指向的数据

下面程序展示了一个错误示例,该示例尝试修改字符常量,导致程序运行出错:

#include <stdio.h>
int main()
{
    char *pStr = "hello\n";
    printf("%s", pStr);
    pStr[0] = 'H';
    printf("%s", pStr);
    return 0;
}

上面的代码试图通过指针 pStr 修改字符串常量 "hello\n"。然而,编译器在编译阶段并不会报错,错误只在运行时才会暴露。那么,如何在编译时就发现这个错误呢?

我们可以使用 const 关键字修饰指针所指向的 char。这样,如果尝试修改指针所指向的 char,编译器将报错。例如:

//  在char左边增加const关键字
const char *pStr = "hello\n";

下图展示了在 Visual Studio 中编写使用 const 关键字修饰 char*pStr 的效果:

图 1 const关键字修饰char *pStr

第六行语句 pStr[0] = 'H' 尝试修改指针所指向的 char 内容。但在之前的声明中,char 已被关键字 const 修饰,因此该修改是被禁止的,并且编译时会报错。

当然,将 const 关键字放置在 char 右边也能起到同样的效果。

//  char右边增加const关键字
char const *pStr = "hello\n";

这样,我们可以在编译阶段发现错误,避免程序运行时出现问题。

C语言const修饰指针本身

那么,如果将 const 放到 * 的右边呢?例如:

//  在星号*右边增加const关键字
char * const pStr = "hello\n";

程序是可以成功编译的,说明 const 关键字并没有对 char 产生作用。既然程序编译通过了,那么 const 关键字的作用在哪里呢?

实际上,在这种情况下,const 关键字修饰了 *,也就是指针 pStr 本身的值。这意味着,在初始化后,指针 pStr 本身的值无法被修改。例如:

char * const pStr = "hello\n";
pStr = NULL;

上述代码将编译报错,因为 const 关键字修饰了指针本身,这意味着指针无法被重新赋值或修改。

C语言const修饰基本变量

当然,const 关键字也可以修饰基本变量,例如:

#include <stdio.h>
int main()
{
   const int n = 100;
   n = 101;    //  这一行报错
   return 0;
}

在这个例子中,const 关键字修饰了 int 类型的变量 n。变量 n 的值在初始化后只能读取,不能修改。尝试修改变量 n 的值将导致编译报错。

到此这篇关于C语言const的4种用法实例的文章就介绍到这了,更多相关C语言const用法内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • QT 实现随机验证码功能

    QT 实现随机验证码功能

    本文介绍了如何使用QT技术实现一个具有动态效果的随机验证码系统,详述了CaptchaMovableLabel和CaptchaLabel两个自定义类的功能,包括显示和拖动字母、绘制噪音点和线条、以及随机生成字母等,讲解了如何通过继承QWidget和QLabel来实现这些功能,并通过MainWindow创建界面
    2024-10-10
  • C++中::SHCreateDirectoryEx函数使用方法

    C++中::SHCreateDirectoryEx函数使用方法

    ::SHCreateDirectoryEx用于创建多级目录,类似于mkdir -p命令,本文主要介绍了C++中::SHCreateDirectoryEx函数使用方法,具有一定的参考价值,感兴趣的可以了解一下
    2025-03-03
  • C语言中双链表的基本操作

    C语言中双链表的基本操作

    这篇文章主要介绍了C语言中双链表的基本操作,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-02-02
  • C++11的操作符alignof使用详解

    C++11的操作符alignof使用详解

    这篇文章主要介绍了C++11的操作符alignof使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2025-10-10
  • C++线程亲和性优化指南分享

    C++线程亲和性优化指南分享

    线程亲和性通过绑定线程到特定CPU核心,减少迁移开销,提升缓存命中率和性能,适用于多核、NUMA架构,实现方式包括Linux的pthread库和Windows的API,需注意负载均衡、超线程及系统拓扑,建议结合工具验证效果
    2025-09-09
  • c++元编程模板函数重载匹配规则示例详解

    c++元编程模板函数重载匹配规则示例详解

    这篇文章主要为大家介绍了c++元编程模板函数重载匹配规则示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-01-01
  • C语言数据在内存中的存储流程深入分析

    C语言数据在内存中的存储流程深入分析

    使用编程语言进行编程时,需要用到各种变量来存储各种信息。变量保留的是它所存储的值的内存位置。这意味着,当您创建一个变量时,就会在内存中保留一些空间。您可能需要存储各种数据类型的信息,操作系统会根据变量的数据类型,来分配内存和决定在保留内存中存储什么
    2022-10-10
  • STL 的string类怎么啦

    STL 的string类怎么啦

    在我们研究string类犯了什么毛病之前,还让我先说一下如何了解一个C++的类。我们要了解一个C++的类,一般来说,要从三个方面入手
    2013-11-11
  • OpenCV使用鼠标响应裁剪图像

    OpenCV使用鼠标响应裁剪图像

    这篇文章主要为大家详细介绍了OpenCV实现鼠标响应裁剪图像,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-01-01
  • 详解C语言中函数宏的三种封装方式

    详解C语言中函数宏的三种封装方式

    函数宏,即包含多条语句的宏定义,其通常为某一被频繁调用的功能的语句封装,且不想通过函数方式封装来降低额外的弹栈压栈开销。本文就来聊聊函数宏的三种封装方式吧
    2023-03-03

最新评论