C語言資料型別的修飾符

2021-08-07 03:18:16 字數 1575 閱讀 1600

概述:c語言操作物件是記憶體資源,對記憶體資源存放位置的限定

變數:在程式執行過程中其數值可以改變的資料

定義的一般形式:

儲存型別:資料型別變數名;

儲存型別:決定了變數的儲存位置

資料型別:決定了變數的儲存大小

1、auto自動變數,位於普通記憶體,可讀可寫區域。預設情況下使用的是auto,如果變數在{}中,則變數存放於棧空間。

2、register

int a; ==》可讀可寫的記憶體上

register int a; 限制變數定義在暫存器上的修飾符用於定義一些快速訪問的變數

實際上是中看不中用的修飾符,編譯器會盡量的安排cpu的暫存器去存放a,如果暫存器不足時,那麼a還是放在儲存器中(記憶體)

記憶體(儲存器)與 暫存器的關聯:

微軟推出一些不同的cpu,頻率一樣,**差異很大,基本上都是和內部暫存器的數量有關,隨著內部暫存器數量的增加,執行速度大幅提公升,其成本相對也提高了很多。

記憶體是有位址的,暫存器是沒有位址的,因此,取位址符&對register變數是非法的(即使最後使用的不是暫存器)

3、static

靜態變數==》存放於靜態區的變數

應用場景:

(1) 函式內部的變數

int fun()

(2)全域性變數(函式外部的變數)

int a; ==》static int a; a存放於資料段,全域性存在,全域性可見

int fun()

(3)函式的修飾符

int fun() ==》static int fun()

題外:

int main()

編譯會報型別不匹配的警告,但是編譯能過,main的位址能列印,這說明main是一種型別,可以用型別修飾符修飾的

4、extern

外部宣告

5、const 常量的定義

const int a = 100; 唯讀的變數,但是還是有辦法去改變(指標技巧)

假定記憶體中有兩塊區域,一塊的屬性是wr,一塊的屬性是r,則r屬性區域的記憶體裡存放的內容是不能修改的,但是const修飾的變數存放的區域屬性是wr而不是r,其不可修改的屬性是由編譯器去控制的,而不是記憶體的屬性

6、volatile

告知編譯器編譯方法的關鍵字,不優化編譯

告知編譯器:被修飾變數的值的修改,不僅僅可以通過軟體,也可以通過其它方式(硬體修改)

舉例:

int a = 100;

while(a == 100);

myfun();

==》彙編**:

f1: ldr r0 , [a] [a]代表a的位址,將a的值從記憶體送到r0暫存器

f2:cmp r0, #100

f3:jmpeq f1編譯器開啟優化後 jmpeq : f2

f4:myfun()

由於在while迴圈中沒有對a操作,因此編譯器會認為記憶體中的變數a不會發生變化,因此會有優化,不會去記憶體中讀取a的值與r0作比較。

C 型別修飾符

資料隱藏是物件導向程式設計的乙個重要特點,它防止函式直接訪問類型別的內部成員。類成員的訪問限制是通過在類主體內部對各個區域標記public private protected來指定的。關鍵字 public private protected 稱為訪問說明符。乙個類可以有多個 public prote...

C 修飾符型別

c 允許在char int 和 double資料型別前放置修飾符。修飾符用於改變基本型別的含義,所以它更能滿足各種情境的需求。下面列出了資料型別修飾符 為了理解 c 解釋有符號整數和無符號整數修飾符之間的差別,我們來執行一下下面這個短程式 include using namespace std 這個...

C 修飾符型別

c 允許在char int 和 double資料型別前放置修飾符。修飾符用於改變基本型別的含義,所以它更能滿足各種情境的需求。下面列出了資料型別修飾符 修飾符signed unsigned long 和 short可應用於整型,signed和unsigned可應用於字元型,long可應用於雙精度型。...