C語言程序設計基礎知識點歸納面試
C語言程序設計基礎知識點
一、函數是C語言的基本構成單位。main函數是C語言程序的惟一入口。
二、C語言程序開發過程。
編譯過程:將以.c或.cpp結尾的源程序文件通過編譯成計算機能識別的二進制文件目標文件,編譯過程當中,編譯器會檢查每條語句的語法錯誤。
連接過程:鏈接器將所生成的目標文件連接生成最後可直接運行的的執行文件。
三、算法:解決問題的具體步驟的描述。
算法的特性:
---有窮性:算法必須在有限步驟後結束,並且每一步都在有限時間內完成。
---肯定性:每條指令無二義性。相同的輸入只能獲得相同的輸出。
---可行性:算法描述中的操做和功能均可以經過已實現的基本運算執行有限次來實現。
---輸入:算法有零個或多個輸入。
---輸出:算法至少有一個或多個輸出。
四、變量命名規則:
大小寫字母、數字和下劃線組成,能夠以字母或下劃線開頭,不能使C語言的關鍵字。
五、數據類型:基本數據類型有int,char,float,double,void
整形: int 佔4個字節16位。-32768~32767
無符號整形: unsigned int 佔4個字節16位。0~65537
短整型: short int 佔2個字符8位。
無符號短整型:unsigned short 佔2個字節8位。
長整型: long int 佔4個字節32位。
無符號長整型:unsigned long int 佔4個字字節32位。
float和double類型的異同:
--同:都是C語言的浮點數據類型,帶精度的數據類型。
--異:
佔用內存不一樣:單精度浮點型佔用4個字節,雙精度浮點型佔用8個字節。
有效數位不一樣:float有效數位8個,double有效數位16個。
char類型:內存中以ASCII碼存放,在其取值範圍內能夠與整數一塊兒使用,如:char c = 'A' + 10;則c爲K。
常見的字符對應的ASCII碼:'0':48,'A':65,'a':97
大小寫字母ASCII值相差32。
六、運算符
算術運算符:+ - * / % ++ -- (注:%兩邊的對象都須要是正數)
賦值運算符:= += -= *= /= %=
關係運算符:> < >= <= == !=
邏輯運算符:&& || !
三元運算符:表達式1 ?表達式2 :表達式3
運算符優先級:
( ): 自左向右結合
! ++ -- sizeof: 自右向左結合
* / %: 自左向右結合
+ - : 自左向右結合
< > <= >=:自左向右結合
== !=: 自左向右結合
&& ||: 自左向右結合
= += -= *= /= %= 自左向右結合
七、類型轉換
自動轉換:不一樣數據類型的數據進行運算時,由編譯器自動完成。轉換規則:由短整型和字符型向整形轉換,整形向無符號整形轉換,無符號整形向長整型轉換,長整型和單精度浮點型向雙精度浮點型轉換。(字節少的向字節多的轉換)
強制類型轉換:(類型名)變量名或數值。若是是高向低轉換則會丟失多餘的精度。低精度向高精度轉換,多餘的補上0。
八、輸入輸出
(1)printf函數
常見格式控制字符
%d:將參數按整形輸出。
%c:按字符輸出。
%s:輸出字符串。
%f:帶小數點形式輸出。
%md:輸出數據佔m個位寬,數據長度左補空格,超出按原樣輸出。
%m.nf:n表示小數位數。
(2)putchar( ): 向終端輸出一個字符。注意:使用沒有換行符。
(3)puts( ): 向終端輸出字符串。int puts(const char *string);
(4)scanf( ): 輸入。int scanf(const char * restrict format,...); 注:從終端中輸入空格,會使scanf獲取終端,空格後面的捨棄。
(5)getchar( ):向終端接受一個字符。getc(stdin)
(6) gets( ):向終端接受一個字符串。char *gets(char *string);注意:gets不檢測字符串string的大小,容易形成溢出,且LinuxC不支持該函數,可使用fgets代替。fgets(s, size, stdin)。
九、程序結構設計
(1)程序的三種基本機構:順序結構,分支結構,循環結構。
(2)分支結構:if if-else switch-case
注意1:if-else語句的二義性,C語言規定else永遠與最近的if配對。合理的編程規範,if-else每個語句塊均使用{ }括出。
注意2:switch括號中要求數據類型爲整形或字符表達式。注意case後面要有break跳出,否則會一直往下執行,知道找到一個break跳出或者繼續往下執行完default。
(3)循環結構:while( ) do-while( ); for( )
(4)continue:只能在循環裏面試用,做用:結束該次循環,直接執行下一次循環。
(5)break:結束該層循環。
十、數組
數組的特色:
數組在內存中連續存儲多個元素的結構,一個數組存放的元素的地址是連續的。
數組的大小是固定的,全部的元素的數據類型是相同的。
數組的定義和初試化:
定義:數據類型 數組名[數組大小];
一維數組初始化:
int array[10] = {10,9,8,7,6,5,4,3,2,1};
int array[10]={10,9,8,7,6,5,4,3,2,1,0};//越界
數組初試化元素個數小於數組大小,後面默認爲0。 二維數組初始化:
int array[2][3]={ {1,2,3}, {4,5,6} };
定義二維數組能夠省略第一維的值,但不能省略第二維的值。二維數組的存放順序是按行存放。
如:int array[][3]={ {1,2,3}, {4,5,6} };//定義2行3列數組
int array[2][]={ {1,2,3}, {4,5,6} };//錯誤,不能省列值。
數組的使用:數組的索引是從0開始。
一維數組:array[序列號]
二維數組:array[行序列號][列序列號]
十一、字符串
(1)字符串是由雙引號括起來的存放在連續內存地址的任意字符。
C語言中沒有特定的字符串變量,一般使用數組存放字符串。
字符串的定義方式:
char string = "Hello";//使用指針定義一個字符串常量
char string[]="Hello";//使用數組定義一個字符串。
(2)字符數組與字符串的區別:
定義:
字符數組:存儲字符的數組。
字符串數組:一種特殊的字符數組,存放以\0結尾。
長度:字符數組大小與字符數相同,字符串數組的大小等於字符數加上結束符'\0'。
(3)字符串處理函數:
拷貝
char *strcpy(char* dest, const char *src):拷貝字符串,注意該函數沒有限定大小,容易越界,
char *strncpy(char *dest,char *src,size_t n);拷貝字符串,對strcpy進行優化,限制了拷貝長度,注意若是長度size與dest數組大小相等時,會缺乏結束符\0。
int sprintf( char *buffer, const char *format [, argument] … );
建議使用sprintf函數拷貝字符串。
void memcpy(void *dest, const void *src, size_t n); 內存塊拷貝,須要注意的是第一第二個參數須要是指針。
strcat:字符串鏈接。
extern char *strcat(char *dest, const char *src);
strcmp(str1, str2):字符串比較。相同返回0。
strlen( s1[], s2[]):字符串長度。
十二、指針
指針也是一個變量,只不過該變量存放的是另一個對象的內存地址。
聲明和初始化:指針變量類型 *指針變量名。使用指針時,須要在定義的同時進行聲明,防止出現野指針。指針變量名=NULL;
指針的運算:指針變量 = 地址;
int a[5]; int *p = a;定義數組名爲a的數組,將數組的首地址賦值給p。p指向數組的第一個元素。&a[0]表示數組的第一個元素的地址。
數組第1個元素的地址: a,&a[0],p
數組第i+1個元素的地址:a+i, &a[i], p+i, &p[i]
數組的第一個元素的值: a[0], p[0], *a, *p
數組的第i+1個元素的值: a[i], p[i], *(a+i), *(p+i)
++ -- :使用一次遞增遞減,指針就移動一個單位,一個類型爲T的指針的移動。
指針加上或減去某個整數值n:指針將移動n個單位。
1三、typedef :typedef 類型名 標識符
typedef只是將已經存在的類型用一個新的名字來表明。typedef能夠爲各類類型說明一個新名,但不能用來爲變量名說明一個新名。
1四、枚舉:enum 枚舉名 {符號1,符號2...}
枚舉類型爲一組在邏輯上密不可分的整形提供便於記憶的符號。默認狀況下第一個枚舉符號值爲0,日後一個加1。
1五、結構
結構是一種構造數據類型,它是由若干數據項組合而成的複雜的數據對象,這些數據項稱爲結構成員。
定義結構:struct structrename
{
datatype variable1;
datatype variable2;
...
};
聲明結構變量:struct 結構名 結構變量名;
表示結構變量成員:變量名.成員名;
1六、預處理命令
宏定義:#define 標識符 字符串:在編譯時,將用字符串替換程序中出現的全部標識符。如:#define PI 3.14
文件包含處理:
#include「文件名」:系統將先在用戶當前目錄下查找文件,找不到將在系統目錄下找。
#include<文件名>:<>系統只在系統目錄中查找該文件。算法