C 和 C++ 中,const 是一个类型限定符,它用来指定常量的属性(即不能被修改)。const 和 char 的位置关系可能导致不同的解释。具体来说,char const 和 const char 看似相同,但实际上它们在语法上有些细微的差别,尽管它们对程序的行为没有影响。

1、const char

const char 语法表示“常量字符”,即一个字符常量。

#include <stdio.h>

int main() {
    const char *ptr = "Hello, world!";
    
    while (*ptr != '\0') {  // 当指针未指向字符串的结束符
        putchar(*ptr);      // 打印当前字符
        ptr++;              // 移动到下一个字符
    }
    putchar('\n');
    
    return 0;
}

2、char const

char const 是一种等价的表达方式,表示“字符常量”。在这种写法中,const 仍然修饰 char,但它的位置不同。

#include <stdio.h>

int main() {
    // 定义一个指向字符串常量的指针
    char const *ptr = "Hello, world!";

    // 打印字符串
    printf("%s\n", ptr);

    // 遍历字符串并逐字符打印
    printf("逐字符输出:\n");
    for (const char *p = ptr; *p != '\0'; ++p) {
        printf("%c\n", *p);
    }

    // 尝试修改字符串内容(编译器通常会报错或运行时引发错误)
    // *ptr = 'h'; // 错误:无法修改字符串常量

    return 0;
}

3、const char和char const区别

const charchar const 在语法上位置不同。前者是将 const 应用到 char 类型,而后者则是将 const 应用到指针的值。它们的含义完全相同,指向一个不可修改的字符。无论是 const char * 还是 char const *,它们都表示指向常量字符的指针。两者在语法上是等价的,只是 const 放置的位置不同,它们都表示指向常量字符的指针。

#include <stdio.h>

int main() {
    // const char* 和 char const* 的示例
    const char* str1 = "Hello, World!";  // str1 指向一个常量字符串
    char const* str2 = "Hello, C!";      // 与 str1 的定义等价

    // *str1 和 *str2 的内容不能被修改
    // *str1 = 'h'; // 错误:尝试修改只读内存中的值

    str1 = "New String"; // 合法:str1 可以指向其他字符串
    str2 = "Another String"; // 合法:str2 可以指向其他字符串

    printf("str1: %s\n", str1);
    printf("str2: %s\n", str2);

    // char* const 的示例
    char buffer1[] = "Mutable String";
    char buffer2[] = "Another Mutable";
    char* const ptr = buffer1; // ptr 是常量指针,不能指向其他字符串

    // ptr = buffer2; // 错误:ptr 是常量指针,不能重新赋值
    ptr[0] = 'm'; // 合法:可以修改 ptr 指向的内容

    printf("Modified buffer1: %s\n", buffer1);

    // const char* const 的示例
    const char* const const_ptr = "Constant String";
    // const_ptr = buffer1; // 错误:const_ptr 是常量指针,不能重新赋值
    // *const_ptr = 'C';    // 错误:const_ptr 指向的内容不能修改

    printf("const_ptr: %s\n", const_ptr);

    return 0;
}