对c语言const的一点理解

本文深入探讨了C++中指针与const限定符的使用,详细解析了constchar*p与char*constp的区别,以及它们如何影响指针的可修改性和所指向数据的可更改性。通过实例演示了不同情况下编译器的反应,帮助读者理解const限定符在指针声明中的作用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.定义两个字符变量,如下:

    char name[10] = "abcde";
    char age[10] = "28";
则下面两种const用法是等效的,都是表示*p的值不可改变(只读),但是p指针可以改变
    const char *p = name;  //等效const char* p = name;  常量指针
    char const *p = name;  //等效char const* p = name;  常量指针

所以如下打印语句可以通过

    for(int j=0; j<5; j++){
        printf("%s\n", p++);
    }

打印结果是:

abcde
bcde
cde
de
e

但是,下面这种操作就会导致编译出错

    *p = '1';
    printf("%s\n", p);

编译报错信息:

error: assignment of read-only location ‘*p
  *p = '1';
     ^


2.同样定义两个字符变量

    char name[10] = "abcde";
    char age[10] = "28";

同时,定义指针 p,如下所示,表示指针p是一个常量,不可改变(只读),但是指针所指向的内容*p可以改变
    char *const p = name;  //指针常量

所以如下打印语句会导致编译错误

    for(int j=0; j<5; j++){
        printf("%s\n", p++);
    }

编译错误信息:

error: increment of read-only variable ‘p
   printf("%s\n", p++);
                   ^
但是,对*p的直接操作,可以编译通过

    *p = '1';
    printf("%s\n", p);

打印信息如下:

1bcde
 

<think>嗯,用户想了解C语言const关键字的功能和用法。首先,我得回忆一下自己学过的关于const的知识。记得const是用来定义常量的,对吧?不过可能还有更多细节需要展开。 根据提供的引用,特别是引用[2]提到,const定义的是“常变量”,也就是既有常量属性又有变量属性。这有点矛盾,可能需要解释清楚。比如,用const声明的变量不能被修改,但本质上它还是变量,只是在编译器层面做了限制。 接下来,我需要整理const的几个主要用法。比如修饰普通变量、指针变量、函数参数和返回值,还有修饰结构体成员。每个部分都需要例子来说明,这样用户更容易理解。 比如,修饰普通变量的时候,const int a = 5; 之后a就不能再被修改了,否则编译器会报错。这里要强调初始化的重要性,因为const变量必须在声明时初始化。 指针部分可能复杂一点,有常量指针和指针常量的区别。需要区分const在*前还是后。比如const int *p和int *const p的不同,前者指向的内容不能变,后者指针本身不能变指向。这点容易混淆,得用例子说明清楚。 函数参数中使用const的情况,比如传递指针时防止函数内部修改数据。例如在strlen函数中,参数是const char*,这样保证函数不会修改传入的字符串。这能提高代码的安全性。 还有结构体成员的const用法,比如结构体中的某个成员被const修饰,那么该成员在初始化后不能被修改。这里可能需要用结构体初始化的例子来展示。 另外,引用[1]提到const还可以修饰函数返回值,这样返回值不能被修改。比如返回指向常量的指针,防止调用者修改数据。 需要注意用户可能存在的疑问点,比如const变量和#define宏定义的区别,或者const在内存中的存储位置。不过根据提供的引用,可能不需要深入这些,但如果有必要可以简单提及。 还要考虑用户的应用场景,比如他们可能在什么情况下使用const。比如在函数参数中保护数据,或者在定义配置参数时使用const确保不被意外修改。 最后,生成相关问题时要围绕const的不同用法、注意事项、与其他概念的区别,以及实际应用中的好处。比如如何用const优化程序,或者const与指针的结合使用等。 总结下来,回答的结构应该是先概述功能,再分点详细说明用法,每个用法都配上代码示例,然后总结注意事项和好处,最后生成相关问题。确保每个部分都引用提供的资料,特别是引用[1][2][3]中的内容。</think>### C语言中`const`关键字的功能与用法 `const`是C语言中用于定义**只读变量**(常变量)的关键字,其核心功能是**限制变量或数据的可修改性**,从而提升代码的安全性和可读性[^2]。以下是其具体功能与用法: --- #### 一、`const`的基本用法 1. **修饰普通变量** 声明后变量不可修改,且必须初始化。 ```c const int MAX_LENGTH = 100; // MAX_LENGTH = 200; // 编译错误,不可修改 ``` 2. **修饰指针变量** - **指向常量的指针**(常量指针):指针指向的内容不可修改,但指针本身可指向其他地址。 ```c int value = 10; const int *p = &value; // *p = 20; // 编译错误 p = NULL; // 允许修改指针地址 ``` - **指针常量**:指针本身不可修改,但指向的内容可修改。 ```c int num = 5; int *const ptr = &num; *ptr = 10; // 允许修改内容 // ptr = NULL; // 编译错误 ``` 3. **修饰函数参数** 防止函数内部意外修改外部数据,常用于字符串或数组参数。 ```c void print_string(const char *str) { // str[0] = 'A'; // 编译错误 printf("%s\n", str); } ``` 4. **修饰函数返回值** 返回的指针指向的内容不可修改。 ```c const char *get_error_message() { return "Error occurred!"; } // char *msg = get_error_message(); // 警告:需用const修饰 ``` 5. **修饰结构体成员** 结构体中的成员被声明为只读。 ```c struct Config { const int version; }; struct Config cfg = {1}; // cfg.version = 2; // 编译错误 ``` --- #### 二、`const`的注意事项 1. **初始化要求** `const`变量必须在声明时初始化,否则会导致未定义行为[^1]。 ```c const int a; // 错误:未初始化 ``` 2. **与`#define`的区别** `const`定义的是具有类型和作用域的变量,而`#define`是文本替换的宏[^2]。 3. **编译期限制** `const`的只读性由编译器检查,实际运行时仍可能通过指针绕过限制(需谨慎)[^3]。 --- #### 三、`const`的实际优势 - **安全性**:防止意外修改关键数据(如配置参数、函数参数)。 - **可读性**:明确标识代码中的常量,提升可维护性。 - **优化提示**:编译器可能对`const`变量进行优化[^3]。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值