结构上的常量

Const on struct

以下三种 const 定义结构的方法有什么区别:

#include <stdio.h>

const typedef struct Person1 {
    char*  name;
    int    id;
} Person1;

typedef struct Person2 {
    const char*  name;
    const int    id;
} Person2;

const typedef struct Person3 {
    const char*  name;
    const int    id;
} Person3;

void main(void) {
    Person1 p1 = {"John", 1};
    Person2 p2 = {"John", 1};
    Person3 p3 = {"John", 1};
    printf("%s %s %s", p1.name, p2.name, p3.name);

}

各自提供什么特别的保证?以下是编译器输出的示例:https://godbolt.org/z/MWdcaz.

类型 Person1Person3const struct Person1const struct Person3 的别名。这意味着任何 Person1Person3 类型的变量在初始化后不能被修改(并且通过扩展它们的任何字段)。但是,struct Person1sturct Person3 类型的变量可以被修改 ,前提是它们没有使用 const 限定符声明。

可以修改 Person2 的实例。特别是,name 可以修改,因为它不是 const,即使它指向的是。但是 id 字段 不能 Person2(和 struct Person2)的 any 实例修改,因为它是 const。同样适用于 struct Person3.