C學習筆記---數據類型,變量,儲存類

1.經常使用基本數據類型佔用空間(64位機器爲例):html

char : 1個字節 -- int :4個字節 -- float:4個字節 -- double:8個字節安全

2.書寫類型:函數

A.整數: a. 默認爲10進制 ,10 ,20.  - b. 以0開頭爲8進制,045,021.  - c.以0b開頭爲2進制,0b11101101. - . d.以0x開頭爲16進制,0x21458adf.spa

B. 浮點:a. float 4 字節 Byte - b.double 8 byte -c. long double 16 byte
htm

C.字符型常量教程

char 用英文單引號括起來,只保存一個字符'a'、'b' 、'*' ,還有轉義字符 '\n' 、'\t'。生命週期

D.字符串常量內存

用英文的雙引號引發來 能夠保存多個字符:"abc"。ci

 

3.變量聲明作用域

a、一種是須要創建存儲空間的。例如:int a 在聲明的時候就已經創建了存儲空間。

b、另外一種是不須要創建存儲空間的,經過使用extern關鍵字聲明變量名而不定義它。 例如:extern int a 其中變量 a 能夠在別的文件中定義的。除非有extern關鍵字,不然都是變量的定義。

c. #define 是宏定義,它不能定義常量,但宏定義能夠實如今字面意義上和其它定義常量相同的功能,本質的區別就在於 #define 不爲宏名分配內存,而 const 也不爲常量分配內存,怎麼回事呢,其實 const 並非去定義一個常量,而是去改變一個變量的存儲類,把該變量所佔的內存變爲只讀!

------------------------------------------------------------------------

sub:

const 定義的是變量不是常量,只是這個變量的值不容許改變是常變量!帶有類型。編譯運行的時候起做用存在類型檢查。

define 定義的是不帶類型的常數,只進行簡單的字符替換。在預編譯的時候起做用,不存在類型檢查。

一、二者的區別

(1) 編譯器處理方式不一樣

  • #define 宏是在預處理階段展開。
  •  const 常量是編譯運行階段使用。

(2) 類型和安全檢查不一樣

  •  #define 宏沒有類型,不作任何類型檢查,僅僅是展開。
  •  const 常量有具體的類型,在編譯階段會執行類型檢查。

(3) 存儲方式不一樣

  • #define宏僅僅是展開,有多少地方使用,就展開多少次,不會分配內存。(宏定義不分配內存,變量定義分配內存。)
  • const常量會在內存中分配(能夠是堆中也能夠是棧中)。

(4) const 能夠節省空間,避免沒必要要的內存分配。 例如:

#define NUM 3.14159 //常量宏 const doulbe Num = 3.14159; //此時並未將Pi放入ROM中 ...... double i = Num; //此時爲Pi分配內存,之後再也不分配! double I= NUM; //編譯期間進行宏替換,分配內存 double j = Num; //沒有內存分配 double J = NUM; //再進行宏替換,又一次分配內存!

const 定義常量從彙編的角度來看,只是給出了對應的內存地址,而不是象 #define 同樣給出的是當即數,因此,const 定義的常量在程序運行過程當中只有一份拷貝(由於是全局的只讀變量,存在靜態區),而 #define 定義的常量在內存中有若干個拷貝。

(5) 提升了效率。 編譯器一般不爲普通const常量分配存儲空間,而是將它們保存在符號表中,這使得它成爲一個編譯期間的常量,沒有了存儲與讀內存的操做,使得它的效率也很高。

(6) 宏替換隻做替換,不作計算,不作表達式求解;

宏預編譯時就替換了,程序運行時,並不分配內存。

----------------------------------

d.

define 注意「邊緣效應」,例:#define N 2+3, N 的值是 5。

int a = N/2

在編譯時咱們預想 a=2.5,實際打印結果是 3.5 緣由是在預處理階段,編譯器將 a=N/2 處理成 a=2+3/2,這就是 define 宏的邊緣效應,因此咱們應該寫成 #define N (2+3)。

 

4.儲存類:

auto 是局部變量的默認存儲類, 限定變量只能在函數內部使用;

register 表明了寄存器變量,不在內存中使用; sub:  register用於定義存儲在寄存器中而不是 RAM 中的局部變量。這意味着變量的最大尺寸等於寄存器的大小(一般是一個詞),且不能對它應用一元的 '&' 運算符(由於它沒有內存位置)。

static是全局變量的默認存儲類,表示變量在程序生命週期內可見; sub:

static 存儲類指示編譯器在程序的生命週期內保持局部變量的存在,而不須要在每次它進入和離開做用域時進行建立和銷燬。所以,使用 static 修飾局部變量能夠在函數調用之間保持局部變量的值。

static 修飾符也能夠應用於全局變量。當 static 修飾全局變量時,會使變量的做用域限制在聲明它的文件內。

全局聲明的一個 static 變量或方法能夠被任何函數或方法調用,只要這些方法出如今跟 static 變量或方法同一個文件中。

extern 表示全局變量,即對程序內全部文件可見,相似於Java中的public關鍵字

sub:

extern 存儲類用於提供一個全局變量的引用,全局變量對全部的程序文件都是可見的。當您使用 extern 時,對於沒法初始化的變量,會把變量名指向一個以前定義過的存儲位置。

當您有多個文件且定義了一個能夠在其餘文件中使用的全局變量或函數時,能夠在其餘文件中使用 extern 來獲得已定義的變量或函數的引用。能夠這麼理解,extern 是用來在另外一個文件中聲明一個全局變量或函數。

 

 

 

 

引用:1.菜鳥教程:https://www.runoob.com/cprogramming/c-storage-classes.html

2. 評論區筆記

相關文章
相關標籤/搜索