我在做C語言的實驗,我宣告了一個無效指標為常數。在普通的指向常數的指標中,我們不能通過取消參考來改變它所指向的地址的值。但是如果我們使用一個無效的指向常量的指標,它就可以被改變。類似的行為也出現在常量指標上,一個無效的常量指標的地址可以被改變。這是否是預期的行為?還是我錯過了什么?
const void *ptr2; /pointer to const
void const *ptr3; //const指標
uint32_t modNum32 = 0xDEADBEEF;
ptr2 = &modNum32;
*((uint32_t*)ptr2) = 4; // This works!
printf("在修改一個void指標為const: %X后,這與正常指標為const的情況下不作業。
",modNum32)。
ptr3 = &modNum32;
*((uint32_t*)ptr3) = 5; //This works as expected
printf("%X
",modNum32)。)
printf("增加%p之前的void const指標的地址
",ptr3)。
ptr3 ;//this works!。
printf("增加%p后的無效常量指標的地址!這在普通常量指標中不作業
",ptr3)。
下面是控制臺的O/P:
在修改了一個void指標到const。4, 這不'與正常的const的指標一起作業。
5的地址。
void const 指標在遞增0x7ffe61cf0710之前的地址。
void const指標的地址在遞增0x7ffe61cf0711之后!這在正常的'指標中不起作用
uj5u.com熱心網友回復:
這個宣告
void const *ptr3; // const pointter
沒有宣告一個常量指標。要宣告一個常量指標,你需要寫
。void * const ptr3 = &modNum32; // const pointer
注意,如果是一個塊范圍宣告,你需要明確地初始化它。
在這個運算式陳述句中
*((uint32_t*)ptr2) = 4; // this works!
你丟棄了限定詞const.
。由于指向的物件不是一個常量物件,那么你可以改變它。
你應該寫
*(( const uint32_t*)ptr2) =4。
以防止修改。在這種情況下,編譯器將發出一個錯誤。
節點:一個宣告,在這個宣告中,我們可以看到,它是一個 "不完整的"。
節點:一個指向常量物件的常量指標的宣告將看起來像
const void * const ptr1 = & modNum32。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/315471.html
標籤:
上一篇:向函式傳遞結構指標陣列
