const void * vs. void const * [重复]

const void * vs. void const * [duplicate]

提问人:sarias 提问时间:11/14/2023 更新时间:11/14/2023 访问量:92

问:

对于这个问题,我得到了不同的答案。我知道其他数据类型的顺序无关紧要/只是通过偏好(例如 const char * 和 char const *)。

不确定这是否同样适用于 void *: const void * == void const *?

C 指针 常量

评论

0赞 Barmar 11/14/2023
不,没有区别。 在语法上与任何其他数据类型一样。void
0赞 Some programmer dude 11/14/2023
const void *是指向常量未知对象的指针。 是指向常量未知对象的指针。语义上完全相同。在此上下文中,其行为与任何其他类型相同。void const *void

答:

1赞 gulpr 11/14/2023 #1

没有区别。 并定义类型为 的对象。const void *ptrvoid const *ptrptrpointer to const void

如果将 const 移到 the 之外,它将改变定义的含义。*

void * const ptr;

将定义为 .ptrconst pointer to void

一起:

const void *ptr;   // <= pointer to const void
void const *ptr;   // <= pointer to const void
void * const ptr;  // <= const pointer to void
const void * const ptr; // <= const pointer to const void
1赞 John Bode 11/14/2023 #2

在这种情况下,与任何其他类型之间没有区别 -- 这两个声明都创建指向 .voidconst void

这有点奇怪和多余,因为无论如何表达式都不能成为赋值的目标;如果取消引用的指针是赋值的目标,则编译器将进行 bitch,无论它是否被声明。 哎呀,voidconst

void *ptr;
...
*ptr = some_T_value; // constraint violation, target is void

您必须强制转换以指向不同的非数组对象类型才能执行赋值:ptr

*(T *)ptr = some_T_value;

声明为并不能真正给你带来任何东西。ptrconst void *

现在,如果你做过类似的事情

void * const ptr;

这将是不同的;您不是在创建指向 的指针,而是创建指向 的指针;你将无法赋值给,因为它是一个表达式,但你也无法赋值给,因为它在本例中被声明。const voidconstvoid*ptrvoidptrconst

评论

3赞 Eric Postpischil 11/14/2023
Re “Declaring as doesn't really buy you anything”:之后,产生诊断。之后,它没有。ptrconst void *const void *p;int *i = p;void *p;
0赞 John Bode 11/14/2023
@EricPostpischil:啊。有趣。没有想到(显然)