我们如何才能拥有指向 const 的真正的 void 指针?

How can we have real void pointer to const?

我正在试验 C,我声明了一个指向 const 的 void 指针。在指向 const 的普通指针中,我们不能通过取消引用来更改其指向的地址的值。但是如果我们使用指向 const 的 void 指针,它就可以改变。常量指针也有类似的行为,可以更改 void 常量指针的地址!这是预期的行为吗?还是我错过了什么?我正在使用以下代码:

const void *ptr2; //pointer to const 
void const *ptr3; // const pointer 
uint32_t modNum32 = 0xDEADBEEF;
ptr2 = &modNum32;
*((uint32_t*)ptr2) = 4; // this works!
printf("After modifying a void pointer to const: %X, This don't work with normal pointer to const\n",modNum32);

ptr3 = &modNum32;
*((uint32_t*)ptr3) = 5; //This works as expected 
printf("%X\n",modNum32);

printf("Address of void const pointer before incrementing %p\n",ptr3);
ptr3++;//this works!
printf("Address of void const pointer after incrementing %p! this don't work in normal const pointers\n",ptr3);

下面是控制台O/P:

After modifying a void pointer to const: 4, This don't work with normal pointer to const
5
Address of void const pointer before incrementing 0x7ffe61cf0710
Address of void const pointer after incrementing 0x7ffe61cf0711! this don't work in normal const pointers

这个声明

void const *ptr3; // const pointer 

没有声明常量指针。要声明一个常量指针,您需要编写

void * const ptr3 = &modNum32; // const pointer

注意,如果是块作用域声明,则需要显式初始化。

在这个表达式语句中

*((uint32_t*)ptr2) = 4; // this works!

您丢弃了限定符 const。

由于指向的对象不是一个常量对象,所以你可以改变它。

你应该写

*(( const uint32_t*)ptr2) = 4; 

防止修改。在这种情况下编译器会报错。

节点:指向常量对象的常量指针声明如下所示

const void * const ptr1 = &modNum32;