讀書筆記 c語言深度剖析之關鍵字

2021-08-04 16:45:16 字數 3623 閱讀 2927

c語言一共有32個關鍵字

auto 宣告自動變數,預設時一般預設為auto

int 宣告整型變數

double 宣告雙精度變數

long 宣告長整型變數

char 宣告字元型變數

float 宣告浮點型變數

short 宣告短整型變數

signed 宣告有符號型別變數

unsigned 宣告無符號型別變數

struct 宣告結構體變數

union 宣告聯合資料型別

enum 宣告列舉型別

static 宣告靜態變數

switch 用於開關語句

case 開關語句分支

default 開關語句中的其他分支

break 跳出當前迴圈

register 宣告暫存器變數

const 宣告唯讀變數

volatile 說明變數在程式執行中可被隱含地改變

typedef 用於給資料型別取別名

extern 宣告變數在其他檔案中定義

return 子程式返回語句

void 宣告函式無返回值或無引數,宣告空型別指標

continue 結束當前迴圈,開始下一輪迴圈

do 迴圈語句的迴圈體

while 迴圈語句的迴圈條件

if 條件語句

else 條件語句否定分支

for 一種迴圈語句

goto 無條件跳轉語句

sizeof 計算物件所佔記憶體空間的大小

 什麼是宣告:

1、 告訴編譯器,這個名字已經匹配到一塊記憶體上;

2、 告訴編譯器,這個名字我先預定了,別的地方再也不能用它來作為變數名或物件名;

定義:建立了物件並為物件分配了記憶體,宣告沒有分配記憶體;

 auto 編譯器在預設預設的情況下,所有變數都是auto的;

 register 請求編譯器盡可能的將變數存在cpu的內部暫存器中而不是通過記憶體定址訪問以提高效率;register修飾的變數必須是能被cpu暫存器所接受的型別,這就意味著register修飾的變數必須是乙個單個的值,並且其長度應小於或等於整型長度,而且register修飾的變數可能不存放在記憶體中,所以不能用取位址運算子「&」來獲取register修飾的變數的位址;

 static關鍵字的作用:

1、 修飾變數;變數分為區域性變數和全域性變數,它們都存在與記憶體的靜態區。靜態全域性變數,作用域僅限於變數被定義的檔案中,其他檔案即使使用extern宣告也無法使用它。準確的說靜態全域性變數的作用域是從定義之處開始,到檔案尾處結束,在定義之處前面的那些**行也不能使用它,想要使用就必須在前面做extern宣告;靜態區域性變數,在函式體裡面定義,就只能在這個函式裡面用,同乙個文件中的其他函式也用不了。由於被static修飾的變數總是存在記憶體的靜態區,所以即使這個函式執行結束,靜態變數的值還是不會被銷毀,函式下一次使用時仍然能用到這個值;

2、 修飾函式;函式前面加static使得函式成為靜態函式。但此處static的含義不是指儲存方式,而是指該函式的作用域僅僅侷限於本檔案(所以又稱內部函式)。使用內部函式的好處:不同的人編寫不同的函式時,不用擔心自己定義的函式是否會與其他檔案中的函式重名

static關鍵字的兩種含義:1、表示退出乙個塊後仍然存在的區域性變數; 2、表示不能被其他檔案訪問的全域性變數和函式;c++賦予了static關鍵字第3個作用;

 break與contiune

break結束本層迴圈

continue結束本次迴圈

 void 空型別

1、 對函式返回的限定;

2、 對函式引數的限定;

void *的特殊性;

其他型別指標不能用void*賦值,void*可以被其他型別指標賦值;

在c語言中,凡是不加返回值型別限定的函式,就會被編譯器作為返回整型值處理;

如果函式無形參,那麼應宣告其引數為void;

ansi標準規定,不能對void*型別做演算法操作;

gnu標準比ansi標準開放;

void不能代表乙個真實的變數

const定義的唯讀變數從彙編的角度來看,只是給出了對應的記憶體位址,而不是象#define一樣給出的是立即數,所以,const定義的唯讀變數在程式執行中只有乙份拷貝,而#define定義的巨集常量在記憶體中有若干個拷貝。#define巨集是在預編譯階段進行替換,而const修飾的唯讀變數具有特定的型別;

 const(型別修飾符)

1、 修飾一般變數

intconst i = 2;

const

int i = 2;

以上兩種語句一樣

2、 修飾陣列

int const a[5] = ;

const

int a[5] = ;

以上兩種語句一樣

3、 修飾指標

const

int * p; // p可變,p指向的物件不可變

intconst * p; // p可變,p指向的物件不可變

int * const p; // p不可變,p指向的物件可變

const

int * const p; // p不可變,p指向的物件不可變

『*』在const後面時表示指標的物件不可變,『*』在const前面時表示指標不可變

4、 修飾函式的引數

當不希望引數值被函式體內意外改變時使用

5、 修飾函式的返回值

表示函式返回值不可被改變;

c++中對const進行了擴充套件

 volatile (型別修飾符)

遇到這個關鍵字宣告的變數,編譯器對訪問該變數的**不進行優化,從而可以提供對特殊位址的穩定訪問;(保證對特殊位址的穩定訪問)

 extern

extern c的用法、

 柔性陣列

結構中的最後乙個元素允許是未知大小的陣列,但結構中的柔性陣列成員前面必須至少有乙個其他成員,柔性陣列成員允許結構中包含乙個大小可變的陣列。。sizeof 返回的這種結構大小不包括柔性陣列的記憶體。包含柔性陣列成員的結構用malloc ()函式進行記憶體的動態分配,並且分配的記憶體應該大於結構的大小,以適應柔性陣列的預期大小。

 union

union關鍵字的用法與struct的用法非常類似,union維護足夠的空間來置放多個資料成員的「一種」,而不是位每乙個資料成員配置空間,在union中所有的資料成員共用乙個空間,同一時間只能儲存其中乙個資料成員,所有資料成員具有相同的其實位址;

union 型資料所佔的空間等於其最大的成員所佔的空間。對union 型的成員的訪問都是相對於該聯合體基位址的偏移量為0處開始,也就是聯合體的訪問不論對哪個變數的訪問都是從union 的首位址位置開始。

 列舉型別

enum color

colorval;

enum與#define的區別:

1、 #define巨集常量是在預編譯階段進行簡單替換。列舉常量則是在編譯的時候確定其值;

2、 一般在編譯器裡,可以除錯列舉常量,但不能除錯巨集常量;

3、 列舉可以一次定義大量的相關常量,而#define巨集一次只能定義乙個;

enum型別的sizeof計算,由於enum中一次取花括號內任意乙個值,而這個值有事int型,因此sizeof所得值即int型的sizeof;

C語言深度剖析之關鍵字

static int j void fun1 void void fun2 void int main return 0 sizeof是關鍵字而不是函式int main printf d strlen a return 0 bool變數與 零值 進行比較 bool btestflag false i...

enum關鍵字 C語言深度剖析

列舉型別的定義方式如下 enum enum type name enum const 1,enum const 2,enum const n enum variable name 注意 enum type name是自定義的一種資料型別名,而enum variable name為enum type ...

C語言深度剖析 讀書筆記6 return關鍵字

1.在無返回值的函式中,使用return語句 1 無返回值的函式中,return後面不帶有返回值,合法,表示跳出當前函式體 例1 void func1 int main void 列印結果 in func1 before return back to main 2 無返回值的函式中,return後面...