结构上的常量
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.
类型 Person1
和 Person3
是 const struct Person1
和 const struct Person3
的别名。这意味着任何 Person1
或 Person3
类型的变量在初始化后不能被修改(并且通过扩展它们的任何字段)。但是,struct Person1
或 sturct Person3
类型的变量可以被修改 ,前提是它们没有使用 const
限定符声明。
可以修改 Person2
的实例。特别是,name
可以修改,因为它不是 const
,即使它指向的是。但是 id
字段 不能 为 Person2
(和 struct Person2
)的 any 实例修改,因为它是 const
。同样适用于 struct Person3
.
以下三种 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.
类型 Person1
和 Person3
是 const struct Person1
和 const struct Person3
的别名。这意味着任何 Person1
或 Person3
类型的变量在初始化后不能被修改(并且通过扩展它们的任何字段)。但是,struct Person1
或 sturct Person3
类型的变量可以被修改 ,前提是它们没有使用 const
限定符声明。
可以修改 Person2
的实例。特别是,name
可以修改,因为它不是 const
,即使它指向的是。但是 id
字段 不能 为 Person2
(和 struct Person2
)的 any 实例修改,因为它是 const
。同样适用于 struct Person3
.