C語言基礎知識要點彙總

2021-08-25 12:11:34 字數 3594 閱讀 9021

最近所在的專案組正在做c的開發,前兩天剛coding完乙個4千來行的程式,4千行的c程式對於經常做c開發的人來說可能不算什麼,但這是我開發過的最長的乙個c程式,做完之後還是小有一點成就感的。大一的時候學了些基礎,之後就沒深入的學習也不怎麼用過c,藉著這次機會想把c複習一下,所以整理了一下可能平時淡忘了的、模糊的知識點。以下內容不是系統的知識梳理而是一些零碎的知識點。如有說得不對的地方,望大夥能及時指正,以達到共同進步的目的。

1、變數名與變數值

變數名實際上是乙個符號位址。程式編譯時,系統給變數開闢該變數對應型別所需的記憶體空間(用於儲存變數值),然後由系統建立乙個從變數名到該記憶體空間的首位址的對映,這樣就可以通過變數名訪問到變數值了。

變數名由數字、字母和下劃線組成。大小寫敏感,不能以數字開頭。變數名的長度(字元個數)沒有硬性的規定,只是不同的c編譯器可能會有不同要求。

c語言中,使用變數之前必須定義該變數,否則編譯出錯。定義變數時須寫明變數所屬型別。程式編譯時,會根據變數的型別來決定為該變數開闢多大的記憶體空間,同時還可以檢查運算的合法性。比如實型資料之間不能做求餘數的操作。

2、整型資料

c語言中,整型資料的類別有三種:short,int,long;屬性有兩種:signed,unsigned。共有六種組合。

整型資料型別的長度:c標準沒有硬性規定每種型別的長度,只是規定:long的長度要不小於int;short的長度不大於int。一般的c編譯器都會以乙個機器字的存放乙個int型資料。

3、變數初始化

變數的初始化不是在編譯期間完成記憶體空間的分配(只有靜態變數和外部變數是在編譯期間初始化),而是在程式執行時執行函式時才賦值。

4、格式輸入&輸出

%md,%mc,%ms(m為正整數):m的大小決定了輸出內容的寬度,當輸出內容的長度小於m時,輸出內容右對齊,左補空格;當輸出內容的長度大於m時,輸出內容不受m的限制,原樣輸出。

%-md,%-mc,%-ms:用法同上,只是輸出內容左對齊,右補空格。

%m.nf,%m.ns :m控制輸出內容的總寬度,對於實型資料來說小數點也算一位,當輸出內容的實際寬度大於m時突破m的限制;%m.nf中的n控制小數字的位數,%m.ns中的n表示擷取字串的左n位,若n小於m則左補空格。

%0md:輸出m位的整型數值,如果被輸出的資料位數小於m時,前補0

5、c語言的變數的儲存型別

c語言的變數儲存型別有很多種分法,根據生命週期來分可分為:動態變數和靜態變數;根據使用域來分可分為:區域性變數和全域性變數(又叫內部變數和外部變數)

a)、動態變數和靜態變數。

動態變數------變數所佔空間是動態分配的,即只有到使用到某個變數時,才動態的給該變數分配記憶體空間,用完後還要及時收回。比如函式的形參及函式內的區域性變數。其**表現形式為關鍵字"auto" +變數型別名+變數名,一般情況下關鍵字"auto"省略不寫。也就是說我們平時用得最多的就是動態變數。動態變數存放於記憶體的棧區和堆區。

靜態變數------變數所佔空間是靜態的,即程式自始至終一直存在。**表現形式為關鍵字"static"+變數型別名+變數名,靜態變數的初始化是在編譯期完成的,且只初始化一次,程式執行時不再對靜態變數進行賦初值。

b)、區域性變數和全域性變數(又叫內部變數和外部變數)

區域性變數------定義在函式體內部的變數,所以又叫內部變數。其作用域僅限於宣告該區域性變數的函式體內部。程式執行時,在動態儲存區為區域性變數分配空間(靜態區域性變數除外)。

一般情況下使用的區域性變數都是動態變數,但並不表示沒有靜態的區域性變數。靜態區域性變數因為是靜態的所以會被存在靜態儲存區,這就意味著即使函式呼叫結束,它的值還仍然存在。利用這一特性我們可以用靜態區域性變數來保留函式上一次的執行結果

全域性變數------定義在函式體外部的變數,所以又叫外部變數。其作用域為該全域性變數的宣告處一直到程式結束。與區域性變數不同的是,全域性變數存在靜態儲存區,在編譯期就被分配空間。

外部變數可以用"extern"關鍵字來擴充套件作用域。例如:一int型的外部變數a被定義在程式的中部,那該外部變數的作用域是不包含其以上的函式的,如果在檔案開頭使用"extern a"來宣告該外部變數,那該外部變數的作用域變會被擴大到整個檔案。使用"extern"還可以把外部變數的作用域擴大到另外的檔案中。例如:在a.c中有一外部變數a,那在b.c中使用extern a宣告後a在b.c中也可以使用了。

0, 逗號表示式:

int a=(b=1,c=2,d=3);printf("%d",a) //a=3

整個逗號表示式的值等於最後乙個子表示式的值。

1、 條件表示式:exp1?exp2:exp3

a、條件表示式的優先順序高於賦值運算

b、條件表示式的結合方向是自右向左(先計算右邊的表示式)

c、exp2和exp3不僅可以是數值表示式,還可以是賦值或函式表示式。如a>b?(a=100):(b=200);或a>b?(printf("%d",a)):(printf("%d",b));

d、exp1,exp2,exp3的型別可以不一樣。如x?'a':'b';x>y?1:1.5

2、閏年的條件:

if((year%400==0)||(year%4==0&&year%100!=0))leap = 1;else leap=0;

3、多維陣列:

a、二維陣列的存放順序:按行存放。

b、多維陣列在記憶體中的排列順序:最右邊的下標變化最快。

4、c語言變數型別

a、按儲存形態分

i  靜態變數(全域性變數和static修飾的變數,存於記憶體的靜態儲存區,在編譯區被初始化,程式的執行期間一直有值)

ii 動態變數(宣告在"{}"之間的變數和形參,存於記憶體的動態儲存區的棧空間,動態分配空間,函式呼叫結束記憶體**)

b、按作用域分

i  內部變數(作用域僅限於"{}"內)

ii 外部變數(作用域:從宣告處到檔案結束,在其它檔案中使用extern宣告外部變數還可以把作用域擴充套件到該檔案中)

a+b、

i  靜態內部變數(內部變數的作用域沒變,只是程式執行期間一直有值)

ii 靜態外部變數(該外部變數只屬於本檔案,無法使用extern擴充套件作用域)

5、函式型別

a、內部函式(使用static修飾,只能被本檔案中的其它函式呼叫)

b、外部函式(使用extern修飾或不用修飾,可以被其它檔案中的函式呼叫)

關於指標和指標變數

指標指標及記憶體位址。對於32位機來說,記憶體位址需要32bit也就是4byte的二進位制數來表示,所以指標是乙個4byte的二進位制數。

指標變數

用於儲存指標的變數,也就是說指標變數的內容是乙個記憶體位址是乙個4byte的二進位制數。無論指標變數指向的是什麼型別的資料,它的值永遠只會是乙個4byte的二進位制記憶體位址。

儲存的內容都是長度一樣的記憶體位址,那為什麼宣告的時候還要寫明該指標變數的型別呢?我們知道不同型別的資料在記憶體中占用的位元組數是不一樣的,所以通過指標訪問資料時

指標變數移動的步長也是不一樣的。例如:乙個指標變數p指向了某整型陣列的第乙個元素a[0],此時我想用這個指標變數p來訪問a[1]時只需要將p+1也就是*(p+1)就能取得a[1]的

值。我們在編碼的時候讓p+1而實際上記憶體位址移動了4個位元組(乙個整型資料所佔的記憶體空間),也就是說p+i代表記憶體位址要移動p+i*c(c為p指向資料型別所佔的記憶體空間的位元組數),

所以如果指標變數沒有型別的話遇到這種情況時記憶體位址就不知道該移動多少位元組才能正確訪問到一下資料。

未完成......

C語言基礎知識彙總

c語言關鍵字 auto 宣告自動變數 break 跳出當前迴圈 case 開關語句分支 char 宣告字元型變數或函式返回值型別 const 宣告唯讀變數 continue 結束當前迴圈,開始下一輪迴圈 default 開關語句中的 預設 分支 do 迴圈語句的迴圈體 double 宣告雙精度浮點型...

C 基礎知識彙總 入門

六 內聯函式 七 auto關鍵字 c 11 八 基於範圍的for迴圈 c 11 九 指標空值nullptr c 11 使用cout標準輸出 控制台 和cin標準輸入 鍵盤 時,必須包含 iostream 標頭檔案以及std標準命名空間。使用c 輸入輸出更方便,不需增加資料格式控制,比如 整形 d,字...

基礎知識彙總

整型int,浮點型float,複合型complex 基本不使用 字串string,布林型bool,列表list,字典dict,集合set,元組tuple 可變資料型別 list dict set 當刪除第乙個元素的時候,後面的元素向前一定了一次,而for迴圈還是要向後走一步,這樣就錯過了在沒有刪除前...