C語言基礎回顧 定義宣告 關鍵字

2021-08-03 20:57:21 字數 2995 閱讀 7777

一、關於定義和宣告

宣告: 例: 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的有效位通常有 位,指的是小...