簡體   English   中英

C中的const和volatile指針有什么區別?

[英]What are the differences between const and volatile pointer in C?

C中的const和volatile指針有什么區別?

差異實際上歸結為constvolatile之間的差異。 這兩個概念的共同點就是語法。 const是編譯器強制執行的並且說“程序員不能改變它”。 volatile表示“這些數據可能會被其他人更改”,因此編譯器不會對該數據做出任何假設。 如果沒有volatile ,編譯器可能會說“我將這些數據從內存放入寄存器,因為我沒有對該數據做任何事情,我確信它是相同的,我不需要再次將它讀入寄存器。 “ 當數據被標記為volatile ,編譯器將不會做出這樣的假設(因為其他人可能已經更改了數據),因此它會將數據重新讀入寄存器。

現在,你要求它們之間的區別

int *const p;

int *volatile q;

或者之間的區別

const int* p;

volatile int* q;

在前一種情況下: p是指向int指針,程序員不能更改指針點,而q是指向int的指針,並且指針指向的點可以由程序員以外的其他人更改,因此編譯器會使沒有關於那個指針的假設。

所以:

int *const p = (int*)malloc(sizeof(int));
int *volatile q = (int*)malloc(sizeof(int));
*p = 17; // legal;
p = (int*)malloc(sizoef(int)); // not legal
*q = 17; // legal;
q = (int*)malloc(sizeof(int)); // legal

在后一種情況下: p是指向int的指針, p指向的是p不能由程序員改變,而q是指向int的指針, q指向的是什么,可以由程序員以外的人改變,所以編譯器不對該數據做任何假設。

int i = 17;
int j = 34;
const int *p = &i;
volatile int *q = &i;
*p = 51; // not legal
p = &j; // legal
*q = 51; // legal
q = &j; // legal

通常, constvolatile適用於指針,而不是指針本身。

const意味着你不允許通過該指針修改指針。

volatile意味着某人/別人可能會修改指針,即使你的代碼沒有。 這也意味着寫入變量可能不僅僅是存儲一個值,以便在下次使用該變量時進行檢索。 因此,只要您的代碼讀取或寫入易失性值,編譯器就必須生成從實際內存中讀取(或寫入)的代碼,而不僅僅是(例如)分配臨時使用的寄存器,以及讀取/寫入登記冊。

編輯:請注意,即使您不允許通過const指針修改數據,仍可以通過其他方式修改數據。 實際上,有時候你可以擁有一個const volatile的指針,這意味着你無法改變它,但其他人可能會改變它。

這是對這兩個概念的解釋

const關鍵字指定初始化后不能修改指針; 此后保護指針不被修改。

volatile關鍵字指定與后面的名稱關聯的值可以通過除用戶應用程序中的操作之外的操作進行修改。 因此,volatile關鍵字對於聲明共享內存中的對象非常有用,這些對象可以由多個進程或用於與中斷服務例程通信的全局數據區域訪問。

它來自這里

const指針(即const char* s = .. )指向無法修改的數據。 易失性指針(即volatile char* s = ... )提示編譯器不要緩存指針在CPU寄存器或其他地方引用的數據。 相反,它們每次需要時都會從原始內存位置重新讀取。 如果數據的內容可能在編譯器的范圍之外發生變化,例如通過修改它的第二個線程,則需要這樣做。

注意, const char*char* const是不同的東西,對於volatile限定符也是如此。 如果您不確定,請查看它們。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM