11 3 ANSI C型別限定符

2021-10-03 08:25:43 字數 2404 閱讀 4339

這篇說一下2個關鍵字:const,volatile.

內容在書12.5章.

以const宣告的物件,值不能通過賦值或遞增遞減來修改,比如下面的**就是不合法的.

//*****1

const int ci = 100;

ci = 10;

//*****2

const char cc;

cc = 'c';

但是這樣是合理的

const int i = 32;
對於指標和const來說,由於需要區分"僅指標本身為const或指標指向的值為const"(403頁),所以比較複雜.

描述示例

含義型別前const

constfloat *pf

指標本身可以改變,指向的值不可改變

變數名前const

float*constpf

指標本身不可改變,指向的值可以改變

型別,變數名前const

constfloat*constpf

指標本身不可改變,指向的值不可改變

型別後,*之前const

floatconst*pf

指標本身可以改變,指向的值不可改變

簡單總結一下:"const放在[*]左側,指標指向的資料不能改變,放在[*]的右側,指標本身不能改變"(403頁). 

前面提到過指標與陣列的關係,所以函式原型函式頭中,下面兩條語句的宣告是相同的,表示不能更改指向arr的資料.

const int* arr;

const int arr;

對於全域性變數,使用const可以保護資料的安全性,否則就可能隨意被其他程式修改.下面是一些全域性const變數的示例.

const double e = 2.7;

const char* seasons[12] = ;

其他檔案訪問這些全域性資料,注意需要使用extern關鍵字.

extern const double e;

extern const char* seasons ;

volatile通常用於硬體位址以及在其他程式多個同時執行的執行緒中共享資料.

volatile int vi; /*vi是乙個易變化的值*/

volatile int* vip; /*vip是乙個volatile變數的指標*/

看起來不是那麼有用,但是這個關鍵字涉及到"編譯器的優化".看看下面的**

int value1 = x;

...//一些不使用x的**

...int value2 = x;

可以看到x的值並未被使用,有些編譯器就會將x臨時儲存在暫存器中,在value2需要x的時候,才從暫存器中讀取x的值.但是如果兩行**之間改變了x的值,就不會進行這種優化.

volatile關鍵字就是用來提示編譯器這種事情會發生的,如果沒有volatile,編譯器就會假定變數的值在使用中不會改變,再嘗試優化**.

可以與const一起使用,順序隨意.

const volatile int* vip;

volatile const int* vip;

ANSIC型別限定符

以const型別關鍵字宣告的物件,其值不能通過賦值來遞增,遞減來修改。以下 const int a 12 限定a的值不能修改 a 12 不可以編譯器會報錯,但是可以初始化變數,因此下面的 沒問題 const int a 12 沒問題該宣告讓a成為唯讀變數。初始化後,就不能改變它的值。可以用const...

linux volatile型別限定符

背景 一直會有意無意的看到有這個volatile,但是做為乙個在linux應用層寫了幾年 的程式設計師,還真的沒有搞懂什麼時候需要這樣用?查了一圈,網上都是各種告訴編譯器不要把該變數放到暫存器,放到暫存器,如果其它地方改了拿不到最新的值,不要優化等等 首先說下,組合語言真的屬於基本不會那種。多執行緒...

C C volatile型別限定符

volatile 限定符告知計算機,而不是變數所在的程式 可以改變該變數的值。通常,它被用於硬體位址以及在其他程式或同時執行的執行緒中共享資料。例如,乙個位址上可能儲存著當前的時鐘時間,無論程式做什 麼,位址上的值都隨時間的變化而改變。或者乙個位址用於接受另一台計算 機傳入的資訊。volatile的...