一、關於定義和宣告
宣告: 例: extern int i; extern int arr[ ];
告訴編譯器,已經定義了乙個變數名,但是不分配空間,宣告可以出現多次。
定義: 例: int i const int i = 0(定義的同時初始化)
建立乙個物件或者變數並且給其分配記憶體,名字和記憶體匹配,並且記憶體的位置也不能改變,定義只能出現一次
定義是一種特殊的宣告。
二、重要關鍵字:
1.auto:
任何變數預設auto
2.register
請求編譯器盡可能的將變數放在cpu的暫存器裡而不是記憶體中定址訪問,注意是盡可能
注意注意: register修飾的變數的型別必須是cpu接收的型別,register變數必須是乙個單一的值,長度應該小於或者等於整形的長度;
register的變數可能不放在記憶體裡面,所以不能取位址&
3.static關鍵字
(1)修飾變數:
區域性變數:改變儲存特性、程式執行時候建立,結束才銷毀
(2)修飾函式
4.sizeof
32個關鍵字之一,後面跟型別或者變數,得到所佔空間的大小
記得加括號
5.signed和unsigned關鍵字
記得再看看正數負數的加減運算操作,整形提公升
6.void
void: 空型別 void* 空指標型別 空指標可以指向任意型別的資料
void的作用發揮在: (1) 限定函式的返回值 (2) 限定函式的引數
注意點:
1)、任何型別的指標都可以直接賦值給void* 的指標,不需要強轉,但是void* 的指標不可以賦值給任何指標。
2)、乙個函式如果沒有返回值,那麼就必須要使用void型別宣告這個函式!!,因為不加返回值說明的函式返回值預設為int
加了void返回型別增強函式的自描述性。
3)、函式引數使用void 表示函式不接受任何引數,c語言中,可以向無參函式傳遞引數,不會出錯但是再c++中不可以向無參函式傳遞引數;
所以有的時候c編譯器能跑c++編譯器報錯,所以就統一在函式內部使用void表示不接受任何引數(c和c++)保證了都不接受傳參;
4)、void* p =&a *p 錯!,不能對外能指標解引用,p++/p+n 錯!不能對萬能指標進行運算操作。
5)、void a 錯,之前寫的void* p 定義可能不錯因為所有的指標都是4位元組大小,但是定義乙個void變數是不對的,void不能代表乙個真實的變數
7.return
return不可以返回棧空間的指標
8.const關鍵字:
const修飾唯讀變數、不可以修改,實際上const的出現就是為了取代#define #define不是關鍵字是之指令
const修飾的變數本質是變數,不能放在陣列的下標引用中作為陣列元素,陣列的元素必須是常量,但是在c++中卻可以
const修飾的唯讀變數必須在定義的同時初始化!!(為啥)
case後面可以跟const修飾的變數嗎? 不可以 ,依然是乙個變數
注意:
a.const的底層實現
編譯器不為const唯讀變數分配記憶體,把他儲存在符號表裡面,const唯讀變數在編譯的時候確定了值,沒有對記憶體的讀和操作,所以使用const可以提高效率,const修飾的變數在程式的執行期間只有乙份拷貝,拷貝了的值存放在靜態區。
b.const和#define的區別
(1)從彙編的角度: const給的是靜態區那個唯讀變數的位址,但是#define是替換,直接給的是立即數。
(2)const修飾的變數在編譯過後開始執行的時候分配記憶體,分配在靜態區,因為是全域性的,所以就只有這乙份。但是巨集常量在記憶體裡面有若干拷貝,替換一次就拷貝一次。
(3)#define巨集是在預編譯階段替換,但是const修飾變數是在編譯的時候確定值。
(4)#define巨集是沒有型別的,但是const修飾的變數有型別。
c.const修飾的指標:
const int* p;
int const* p;
int *const p;
const int *const p
近水樓台先得月
9.volatile
保證記憶體可見性
告訴編譯器修飾的這個變數不穩定,防止編譯器優化,可以提供對特殊位址的穩定的訪問。
10.extern
可以放在變數或者函式前,表示函式或者變數被定義在別的檔案中, 宣告
11、enum
列舉和#define的區別:
(1) #define巨集常量是在預編譯階段進行簡單的替換,列舉常量是在編譯的時候確定其值
(2)#define巨集常量是無法除錯的,但是編譯器中可以除錯列舉常量
(3)列舉可以一次性定義大量相關的常量,但是巨集定義一次乙個
sizeof(列舉型別物件)=4 注意是列舉型別的物件,不是列舉型別,不論怎麼變都是4個位元組,是乙個整形;
12.typedef
給型別定義新的名字;
typedef和#define的區別:define無法正確的處理指標:
define pchar char*
pchar p3, p4; //p3是char*型別,但是p4不是
typedef
char* pchar;
pchar p3, p4; //p3是指標型別但是p4不是,可以把pchar看作int 看作double
如上看出來,#define不能像typedef那樣正確的處理指標。 C語言關鍵字
c語言關鍵字 在檔案範圍的教訓和關鍵字,你知道靜態變數保持他們的價值觀,甚至不在他們超出範圍的破壞。比如說呢。int generateid int main this program prints 01 2 請注意,s nid一直保持它的價值的跨多個函式呼叫。static關鍵字有另一種意思當應用到全...
C語言關鍵字
關鍵字就是已被c語言本身使用,不能作其它用途使用的字。例如關鍵字不能用作變數名 函式名等 由ansi標準定義的c語言關鍵字共32個 auto double int struct break else long switch case enum register typedef char extern...
c語言關鍵字
c 語言標準定義的32 個關鍵字 1 auto 宣告自動變數,預設時編譯器一般預設為auto int 宣告整型變數 double 宣告雙精度變數 雙精度浮點型 long 宣告長整型變數 char 宣告字元型變數 float 宣告浮點型變數 單精度浮點型 6.1 float的有效位通常有 位,指的是小...