gpt4 book ai didi

c - 当转换 const 指针时,c 中的 const 限定符是否被保留?

转载 作者:行者123 更新时间:2023-11-30 14:37:09 24 4
gpt4 key购买 nike

例如 p 会指向一个常量 char 吗?

const void* a;
char* p = (char*)a;

最佳答案

让我们首先考虑这段代码:

const char c = 'x';
char *p = (char *) &c;

p 指向 x 且类型为 char *,而不是 const char *。但是,x 仍然使用 const 进行定义,并且 C 标准没有定义尝试修改 *p 的行为,例如通过执行 >*p = 'y';.

接下来,考虑以下代码:

char c = 'x';
const char *p = &c;
char *q = (char *) p;

在第三条语句中,const char *p 被转换为 char *。这是允许的。此外,*q = 'y'; 是由 C 标准定义的。重要的是该对象最初是否是用 const定义的。

您可以显式转换指针以添加和删除 const。但是,您有义务知道原始对象是否是用 const 定义的。如果是,则无论进行任何转换,都不会定义修改它的行为。如果不是,您可以使用不带 const 的指针来修改该对象,而不管中间有任何转换。

请注意,在 const char *p = &c; 中不需要强制转换。该语言允许隐式添加 const。但是,它不能被隐式删除;删除 const 时必须使用显式强制转换。

对于您的原始代码:

const void* a;
char* p = (char*)a;

我们不知道a指向什么。我们确实知道p没有记录它是否是const。但是,C 实现可能以一种或另一种形式包含该信息,并且,如果您尝试使用 p 修改最初使用 const 定义的对象,则C 标准未定义行为。

关于c - 当转换 const 指针时,c 中的 const 限定符是否被保留?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57582621/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com