概述: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可應用於雙精度型。...