我正在用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;