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用法内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • C语言链表实现通讯录系统课程设计

    C语言链表实现通讯录系统课程设计

    这篇文章主要为大家详细介绍了C语言链表实现通讯录系统课程设计,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-06-06
  • C++中如何实现SSL/TLS加密通信

    C++中如何实现SSL/TLS加密通信

    在互联网时代,确保信息传输过程中的机密性、完整性和可用性成为了开发者必须考虑的关键因素,在C++网络编程中,使用SSL/TLS加密通信是一种常见的做法,它允许客户端和服务器之间通过互联网安全地交换信息,从而为网络通信提供隐私性和数据完整性
    2025-01-01
  • C++设计模式编程中Template Method模板方法模式的运用

    C++设计模式编程中Template Method模板方法模式的运用

    这篇文章主要介绍了C++设计模式编程中Template Method模板方法模式的运用,讲到了包括模板方法模式中的细分方法以及适用场景,需要的朋友可以参考下
    2016-03-03
  • C++ STL关联式容器自定义排序规则的2种方法

    C++ STL关联式容器自定义排序规则的2种方法

    这篇文章主要介绍了C++ STL关联式容器自定义排序规则的2种方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-03-03
  • C语言中getopt()函数和select()函数的使用方法

    C语言中getopt()函数和select()函数的使用方法

    这篇文章主要介绍了C语言中getopt()函数和select()函数的使用方法,是C语言入门学习中的基础知识,需要的朋友可以参考下
    2015-09-09
  • 详解Qt如何加载libxl库

    详解Qt如何加载libxl库

    这篇文章主要介绍了详解Qt如何加载libxl库,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-03-03
  • C语言内存泄露很严重的解决方案

    C语言内存泄露很严重的解决方案

    这篇文章主要介绍了C语言内存泄露很严重的解决方案,预防内存泄漏问题有多种方法,比如加强代码检视、工具检测和内存测试等,下面文章总结内容需要的小伙伴可以参考一下
    2022-05-05
  • cmake添加一个库的实现步骤

    cmake添加一个库的实现步骤

    本文主要介绍了cmake添加一个库的实现步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-06-06
  • Qt示例教程之用Qt画一个温度计

    Qt示例教程之用Qt画一个温度计

    在Qt绘图中经常需要绘制一些仪表的刻度盘,比如温度计,下面这篇文章主要给大家介绍了关于用Qt画一个温度计的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2023-03-03
  • C++中发送HTTP请求的实现方式

    C++中发送HTTP请求的实现方式

    使用C++编程发送HTTP请求通常需要使用第三方的HTTP库或框架,在C++中,有几个受欢迎的HTTP库可供选择,例如Curl、Boost.Beast和cpp-httplib,另外,也可以自己实现socket来发送http请求,需要的朋友可以参考下
    2024-04-04

最新评论