C语言 我们怎么能有真正的void指针指向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 constn",modNum32);
ptr3 = &modNum32;
*((uint32_t*)ptr3) = 5; //This works as expected 
printf("%Xn",modNum32);
printf("Address of void const pointer before incrementing %pn",ptr3);
ptr3++;//this works!
printf("Address of void const pointer after incrementing %p! this don't work in normal const pointersn",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; 

以防止修改。在这种情况下,编译器将发出一个错误。

Node:一个指向常量对象的常量指针的声明看起来像

const void * const ptr1 = &modNum32;

相关内容

  • 没有找到相关文章

最新更新