我们如何才能拥有指向 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;
我正在试验 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;