C語言庫函數(shù),常用庫函數(shù)有:
成都創(chuàng)新互聯(lián)公司長期為上1000家客戶提供的網(wǎng)站建設(shè)服務(wù),團(tuán)隊(duì)從業(yè)經(jīng)驗(yàn)10年,關(guān)注不同地域、不同群體,并針對不同對象提供差異化的產(chǎn)品和服務(wù);打造開放共贏平臺(tái),與合作伙伴共同營造健康的互聯(lián)網(wǎng)生態(tài)環(huán)境。為錫林浩特企業(yè)提供專業(yè)的成都網(wǎng)站建設(shè)、網(wǎng)站制作,錫林浩特網(wǎng)站改版等技術(shù)服務(wù)。擁有10余年豐富建站經(jīng)驗(yàn)和眾多成功案例,為您定制開發(fā)。
1、scanf格式輸入函數(shù)
2、printf格式輸出函數(shù)
3、systemdos命令函數(shù)
4、sort排序
5、main主函數(shù)
6、fgets文件讀取字符串函數(shù)
7、fputs文件寫入字符串函數(shù)
8、fscanf文件格式讀取函數(shù)
9、fprintf文件格式寫入函數(shù)
10、fopen打開文件函數(shù)
11、getchar輸入字符函數(shù)
12、putchar輸出字符函數(shù)
13、malloc動(dòng)態(tài)申請內(nèi)存函數(shù)
14、free釋放內(nèi)存函數(shù)
15、abs求絕對值數(shù)學(xué)函數(shù)
16、sqrt求平方根數(shù)學(xué)函數(shù)
擴(kuò)展資料
語言組成:
1、數(shù)據(jù)類型
C的數(shù)據(jù)類型包括:整型、字符型、實(shí)型或浮點(diǎn)型(單精度和雙精度)、枚舉類型、數(shù)組類型、結(jié)構(gòu)體類型、共用體類型、指針類型和空類型。
2、常量與變量
常量其值不可改變,符號常量名通常用大寫。
變量是以某標(biāo)識符為名字,其值可以改變的量。標(biāo)識符是以字母或下劃線開頭的一串由字母、數(shù)字或下劃線構(gòu)成的序列,請注意第一個(gè)字符必須為字母或下劃線,否則為不合法的變量名。變量在編譯時(shí)為其分配相應(yīng)存儲(chǔ)單元。
3、數(shù)組
如果一個(gè)變量名后面跟著一個(gè)有數(shù)字的中括號,這個(gè)聲明就是數(shù)組聲明。字符串也是一種數(shù)組。它們以ASCII的NULL作為數(shù)組的結(jié)束。要特別注意的是,方括內(nèi)的索引值是從0算起的。
4、指針
如果一個(gè)變量聲明時(shí)在前面使用 * 號,表明這是個(gè)指針型變量。換句話說,該變量存儲(chǔ)一個(gè)地址,而 *(此處特指單目運(yùn)算符 * ,下同。C語言中另有 雙目運(yùn)算符 *) 則是取內(nèi)容操作符,意思是取這個(gè)內(nèi)存地址里存儲(chǔ)的內(nèi)容。指針是 C 語言區(qū)別于其他同時(shí)代高級語言的主要特征之一。
參考資料來源:百度百科-函數(shù)
1.入門程序
#include stdio.h
int main()
{
printf("Hello World!");
return 0;
}
2.數(shù)據(jù)類型
數(shù)據(jù)類型:
1.基本數(shù)據(jù)類型:
1.1. 整型:int 4個(gè)字節(jié)
1.2. 字符型:char 1個(gè)字節(jié)
1.3. 實(shí)型(浮點(diǎn)型)
1.3.1.單精度型:float 4個(gè)字節(jié)
1.3.2.雙精度型:double 8個(gè)字節(jié)
2.構(gòu)造類型:
2.1.枚舉類型
2.2.數(shù)組類型
2.3.結(jié)構(gòu)體類型
2.4.共用體類型
3.指針類型:
4.空類型:
3.格式化輸出語句
%d:十進(jìn)制整數(shù);
%c:單個(gè)字符;
%s:字符串;
%f:6位小數(shù);
#include stdio.h
int main()
{
int age = 18;
float height = 1.85;
char unit = 'm';
printf("小明今年%d歲\n", age);
printf("小明身高%f%c\n", height, unit);
printf("小明現(xiàn)在在慕課網(wǎng)上學(xué)習(xí)IT技術(shù)\n");
return 0;
}
學(xué)好C++才是入職大廠的敲門磚! 當(dāng)年要是有這課,我的C++也不至于這樣
已失效
4.常量
值不發(fā)生改變的量成為常量;
定義字符常量(注意后面沒有;)
#include stdio.h
#define POCKETMONEY 10 //定義常量及常量值
int main()
{
printf("小明今天又得到%d元零花錢\n", POCKETMONEY);
return 0;
}
5.運(yùn)算符
5.1.算數(shù)運(yùn)算符:+,-,*,/,%,++,--;前++/--,先運(yùn)算,再取值.后++/--,先取值,再運(yùn)算;
5.2.賦值運(yùn)算符:
5.3.關(guān)系運(yùn)算符;
5.4.邏輯運(yùn)算符;
5.5.三目運(yùn)算符:
表達(dá)式1 ? 表達(dá)式2 : 表達(dá)式3;
6.水仙花數(shù)計(jì)算
輸出所有三位數(shù)的水仙花數(shù)字
所謂“水仙花數(shù)”是指一個(gè)三位數(shù),其各位數(shù)字立方和等于該數(shù),如:153就是一個(gè)水仙花數(shù),153=111+555+333。
#include stdio.h
int main()
{
//定義三位數(shù)num,個(gè)位數(shù)sd,十位數(shù)td,百位數(shù)hd
int num, sd, td, hd;
//循環(huán)所有三位數(shù)
for( num=100 ; num1000 ; num++ )
{
//獲取三位數(shù)字num百位上的數(shù)字
hd = num/100 ;
//獲取三位數(shù)字num十位上的數(shù)字
td = num/10%10 ;
//獲取三位數(shù)字num個(gè)位上的數(shù)字
sd = num%10 ;
//水仙花數(shù)的條件是什么?
if(num ==hd*hd*hd+td*td*td+sd*sd*sd )
{
printf("水仙花數(shù)字:%d\n", num);
}
}
return 0;
}
7.打印正三角形的*
#include stdio.h
int main()
{
int i, j, k;
for(i=1; i5; i++)
{
/* 觀察每行的空格數(shù)量,補(bǔ)全循環(huán)條件 */
for( j=i ; j5 ; j++ )
{
printf(" "); //輸出空格
}
/* 觀察每行*號的數(shù)量,補(bǔ)全循環(huán)條件 */
for( k=0 ; k2*i-1 ; k++ )
{
printf("*"); //每行輸出的*號
}
printf("\n"); //每次循環(huán)換行
}
return 0;
}
8.臭名遠(yuǎn)揚(yáng)的goto語句
很少使用
#include stdio.h
int main()
{
int sum = 0;
int i;
for(i=1; i=10; i++)
{
printf("%d\n", i);
if(i==3){
goto LOOP;//滿足條件就執(zhí)行g(shù)oto語句
}
}
//執(zhí)行g(shù)oto
LOOP:printf("結(jié)束for循環(huán)了...."); //請選擇合適位置添加標(biāo)識符
return 0;
}
9.形參與實(shí)參
形參:形參是在定義函數(shù)名和函數(shù)體的時(shí)候使用的參數(shù),目的是用來接收調(diào)用該函數(shù)時(shí)傳入的參數(shù);
實(shí)參:實(shí)參是在調(diào)用時(shí)傳遞該函數(shù)的參數(shù)。
函數(shù)的形參和實(shí)參具有以下特點(diǎn):
形參只有在被調(diào)用時(shí)才分配內(nèi)存單元,在調(diào)用結(jié)束時(shí),即刻釋放所分配的內(nèi)存單元。因此,形參只有在函數(shù)內(nèi)部有效。函數(shù)調(diào)用結(jié)束返回主調(diào)函數(shù)后則不能再使用該形參變量。
實(shí)參可以是常量、變量、表達(dá)式、函數(shù)等,無論實(shí)參是何種類型的量,在進(jìn)行函數(shù)調(diào)用時(shí),它們都必須具有確定的值,以便把這些值傳送給形參。因此應(yīng)預(yù)先用賦值等辦法使實(shí)參獲得確定值。
在參數(shù)傳遞時(shí),實(shí)參和形參在數(shù)量上,類型上,順序上應(yīng)嚴(yán)格一致,否則會(huì)發(fā)生類型不匹配”的錯(cuò)誤。
10.函數(shù)返回值注意
注意:void函數(shù)中可以有執(zhí)行代碼塊,但是不能有返回值,另void函數(shù)中如果有return語句,該語句只能起到結(jié)束函數(shù)運(yùn)行的功能。其格式為:return;
11.遞歸
#include stdio.h
int getPeachNumber(int n) //這里要定義n,要不編譯器會(huì)報(bào)錯(cuò)!
{
int num;
if(n==10)
{
return 1;
}
else
{
num = (getPeachNumber(n+1)+1)*2;
printf("第%d天所剩桃子%d個(gè)\n", n, num);
}
return num;
}
int main()
{
int num = getPeachNumber(1);
printf("猴子第一天摘了:%d個(gè)桃子。\n", num);
return 0;
}
12.變量存儲(chǔ)類別 !
12.1.生存周期劃分存儲(chǔ)方式
C語言根據(jù)變量的生存周期來劃分,可以分為靜態(tài)存儲(chǔ)方式和動(dòng)態(tài)存儲(chǔ)方式。
靜態(tài)存儲(chǔ)方式:是指在程序運(yùn)行期間分配固定的存儲(chǔ)空間的方式。靜態(tài)存儲(chǔ)區(qū)中存放了在整個(gè)程序執(zhí)行過程中都存在的變量,如全局變量。
動(dòng)態(tài)存儲(chǔ)方式:是指在程序運(yùn)行期間根據(jù)需要進(jìn)行動(dòng)態(tài)的分配存儲(chǔ)空間的方式。動(dòng)態(tài)存儲(chǔ)區(qū)中存放的變量是根據(jù)程序運(yùn)行的需要而建立和釋放的,通常包括:函數(shù)形式參數(shù);自動(dòng)變量;函數(shù)調(diào)用時(shí)的現(xiàn)場保護(hù)和返回地址等。
12.2.存儲(chǔ)類型劃分
C語言中存儲(chǔ)類別又分為四類:自動(dòng)(auto)、靜態(tài)(static)、寄存器的(register)和外部的(extern) ;
用關(guān)鍵字auto定義的變量為自動(dòng)變量,auto可以省略,auto不寫則隱含定為“自動(dòng)存儲(chǔ)類別”,屬于動(dòng)態(tài)存儲(chǔ)方式。
用static修飾的為靜態(tài)變量,如果定義在函數(shù)內(nèi)部的,稱之為靜態(tài)局部變量;如果定義在函數(shù)外部,稱之為靜態(tài)外部變量。
注意:靜態(tài)局部變量屬于靜態(tài)存儲(chǔ)類別,在靜態(tài)存儲(chǔ)區(qū)內(nèi)分配存儲(chǔ)單元,在程序整個(gè)運(yùn)行期間都不釋放;靜態(tài)局部變量在編譯時(shí)賦初值,即只賦初值一次;如果在定義局部變量時(shí)不賦初值的話,則對靜態(tài)局部變量來說,編譯時(shí)自動(dòng)賦初值0(對數(shù)值型變量)或空字符(對字符變量)
為了提高效率,C語言允許將局部變量的值放在CPU中的寄存器中,這種變量叫“寄存器變量”,用關(guān)鍵字register作聲明。
注意:只有局部自動(dòng)變量和形式參數(shù)可以作為寄存器變量;一個(gè)計(jì)算機(jī)系統(tǒng)中的寄存器數(shù)目有限,不能定義任意多個(gè)寄存器變量;局部靜態(tài)變量不能定義為寄存器變量。
用extern聲明的的變量是外部變量,外部變量的意義是某函數(shù)可以調(diào)用在該函數(shù)之后定義的變量。
#includ stdio.h
//來源公眾號:C語言與CPP編程
int main()
{
//定義外部局部變量
extern int x;
return 0;
}
int x=100;
13.內(nèi)部函數(shù)外部函數(shù) !
在C語言中不能被其他源文件調(diào)用的函數(shù)稱為內(nèi)部函數(shù) ,內(nèi)部函數(shù)由static關(guān)鍵字來定義,因此又被稱為靜態(tài)函數(shù),形式為:
static [數(shù)據(jù)類型] 函數(shù)名([參數(shù)])
這里的static是對函數(shù)的作用范圍的一個(gè)限定,限定該函數(shù)只能在其所處的源文件中使用,因此在不同文件中出現(xiàn)相同的函數(shù)名稱的內(nèi)部函數(shù)是沒有問題的。
在C語言中能被其他源文件調(diào)用的函數(shù)稱為外部函數(shù) ,外部函數(shù)由extern關(guān)鍵字來定義,形式為:
extern [數(shù)據(jù)類型] 函數(shù)名([參數(shù)])
C語言規(guī)定,在沒有指定函數(shù)的作用范圍時(shí),系統(tǒng)會(huì)默認(rèn)認(rèn)為是外部函數(shù),因此當(dāng)需要定義外部函數(shù)時(shí)extern也可以省略。 extern可以省略; 14.數(shù)組 數(shù)組:一塊連續(xù)的,大小固定并且里面的數(shù)據(jù)類型一致的內(nèi)存空間, 數(shù)組的聲明:數(shù)據(jù)類型 數(shù)組名稱[長度n]
數(shù)據(jù)類型 數(shù)組名稱[長度n] = {元素1,元素2,元素3,......};
數(shù)據(jù)類型 數(shù)組名稱[] = {元素1,元素2,元素3,......};
數(shù)類類型 數(shù)組名稱[長度n]; 數(shù)組名稱[0] = 元素1;數(shù)組名稱[1] = 元素2;...... 注意: 1、數(shù)組的下標(biāo)均以0開始; 2、數(shù)組在初始化的時(shí)候,數(shù)組內(nèi)元素的個(gè)數(shù)不能大于聲明的數(shù)組長度; 3、如果采用第一種初始化方式,元素個(gè)數(shù)小于數(shù)組的長度時(shí),多余的數(shù)組元素初始化為0; 4、在聲明數(shù)組后沒有進(jìn)行初始化的時(shí)候,靜態(tài)(static)和外部(extern)類型的數(shù)組元素初始化元素為0,自動(dòng)(auto)類型的數(shù)組的元素初始化值不確定。
15.數(shù)組遍歷
#include stdio.h
int main()
{
int arr[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
int i;
for(i=0;i10;i++)
{
printf("%d\n",arr[i]);
}
return 0;
}
數(shù)組的冒泡排序
冒泡排序的思想:相鄰元素兩兩比較,將較大的數(shù)字放在后面,直到將所有數(shù)字全部排序。
字符串與數(shù)組
在C語言中,是沒有辦法直接定義子字符串?dāng)?shù)據(jù)類型的,需使用數(shù)組來定義所要的字符串,形式如下:
char 字符串名稱[長度] = "字符串內(nèi)容";
char 字符串名稱[長度] = {'字符串1','字符串2',....,'字符串n','\0'};
注:
[]中的長度可以省略不寫;
采用第二種方式最后一個(gè)元素必須是'\0',表示結(jié)束;
第二種方式不能寫中文!; 輸出字符串時(shí),要使用:printf("%s",字符數(shù)組名);或puts(字符數(shù)組名);
16.字符串函數(shù)
strlen(s):獲取字符串s的長度;
strcmp(s1,s2):比較字符串;比較的時(shí)候會(huì)把字符串轉(zhuǎn)換成ASCII碼再進(jìn)行比較,返回結(jié)果為0表示s1和s2的ASCII碼值相等,返回結(jié)果為1表示s1比s2的ASCII碼大,返回結(jié)果為-1表示s1比s2的ACSII碼小;
strcpy(s1,s2):字符串拷貝;s2會(huì)取代s1中的內(nèi)容;
strcat(s1,s2)將s2拼接到s1后面;注意:s1的length要足夠才可以!
atoi(s1)將字符串轉(zhuǎn)為整數(shù)!
17.多維數(shù)組
數(shù)據(jù)類型 數(shù)組名稱[常量表達(dá)式1]...[常量表達(dá)式n];
多維數(shù)組的初始化與一維數(shù)組的初始化類似也是分兩種:
數(shù)據(jù)類型 數(shù)組名稱[常量表達(dá)式1][常量表達(dá)式2]...[常量表達(dá)式n] = {{值1,..,值n},{值1,..,值n},...,{值1,..,值n}};
數(shù)據(jù)類型 數(shù)組名稱[常量表達(dá)式1][常量表達(dá)式2]...[常量表達(dá)式n]; 數(shù)組名稱[下標(biāo)1][下標(biāo)2]...[下標(biāo)n] = 值;
多維數(shù)組初始化要注意以下事項(xiàng):
采用第一種始化時(shí)數(shù)組聲明必須指定列的維數(shù)。因?yàn)橄到y(tǒng)會(huì)根據(jù)數(shù)組中元素的總個(gè)數(shù)來分配空間,當(dāng)知道元素總個(gè)數(shù)以及列的維數(shù)后,會(huì)直接計(jì)算出行的維數(shù);
采用第二種初始化時(shí)數(shù)組聲明必須同時(shí)指定行和列的維數(shù)。
18.多維度數(shù)組的遍歷
使用嵌套循環(huán)
注意:多維數(shù)組的每一維下標(biāo)均不能越界!
19.結(jié)構(gòu)體
C 數(shù)組允許定義可存儲(chǔ)相同類型數(shù)據(jù)項(xiàng)的變量,結(jié)構(gòu)是 C 編程中另一種用戶自定義的可用的數(shù)據(jù)類型,它允許您存儲(chǔ)不同類型的數(shù)據(jù)項(xiàng)。
結(jié)構(gòu)用于表示一條記錄,假設(shè)您想要跟蹤圖書館中書本的動(dòng)態(tài),您可能需要跟蹤每本書的下列屬性:
Title
Author
Subject
Book ID
定義結(jié)構(gòu)
為了定義結(jié)構(gòu),您必須使用 struct 語句。struct 語句定義了一個(gè)包含多個(gè)成員的新的數(shù)據(jù)類型,struct 語句的格式如下:
struct tag {
member-list
member-list
member-list ?
...
} variable-list ;
tag 是結(jié)構(gòu)體標(biāo)簽。
member-list 是標(biāo)準(zhǔn)的變量定義,比如 int i; 或者 float f,或者其他有效的變量定義。
variable-list 結(jié)構(gòu)變量,定義在結(jié)構(gòu)的末尾,最后一個(gè)分號之前,您可以指定一個(gè)或多個(gè)結(jié)構(gòu)變量。下面是聲明 Book 結(jié)構(gòu)的方式:
struct Books
{
char ?title[50];
char ?author[50];
char ?subject[100];
int ? book_id;
} book;
在一般情況下,tag、member-list、variable-list 這 3 部分至少要出現(xiàn) 2 個(gè)。以下為實(shí)例:
//此聲明聲明了擁有3個(gè)成員的結(jié)構(gòu)體,分別為整型的a,字符型的b和雙精度的c
//同時(shí)又聲明了結(jié)構(gòu)體變量s1
//這個(gè)結(jié)構(gòu)體并沒有標(biāo)明其標(biāo)簽
struct
{
int a;
char b;
double c;
} s1;
//此聲明聲明了擁有3個(gè)成員的結(jié)構(gòu)體,分別為整型的a,字符型的b和雙精度的c
//結(jié)構(gòu)體的標(biāo)簽被命名為SIMPLE,沒有聲明變量
struct SIMPLE
{
int a;
char b;
double c;
};
//用SIMPLE標(biāo)簽的結(jié)構(gòu)體,另外聲明了變量t1、t2、t3
struct SIMPLE t1, t2[20], *t3;
//也可以用typedef創(chuàng)建新類型
typedef struct
{
int a;
char b;
double c;
} Simple2;
//現(xiàn)在可以用Simple2作為類型聲明新的結(jié)構(gòu)體變量
Simple2 u1, u2[20], *u3;
訪問結(jié)構(gòu)成員
為了訪問結(jié)構(gòu)的成員,我們使用成員訪問運(yùn)算符(.)。成員訪問運(yùn)算符是結(jié)構(gòu)變量名稱和我們要訪問的結(jié)構(gòu)成員之間的一個(gè)句號。您可以使用 struct 關(guān)鍵字來定義結(jié)構(gòu)類型的變量。下面的實(shí)例演示了結(jié)構(gòu)的用法:
#include stdio.h
#include string.h
//來源公眾號:C語言與CPP編程
struct Books
{
char ?title[50];
char ?author[50];
char ?subject[100];
int ? book_id;
};
int main( )
{
struct Books Book1; ? ? ? ?/* 聲明 Book1,類型為 Books */
struct Books Book2; ? ? ? ?/* 聲明 Book2,類型為 Books */
/* Book1 詳述 */
strcpy( Book1.title, "C Programming");
strcpy( Book1.author, "Nuha Ali");
strcpy( Book1.subject, "C Programming Tutorial");
Book1.book_id = 6495407;
/* Book2 詳述 */
strcpy( Book2.title, "Telecom Billing");
strcpy( Book2.author, "Zara Ali");
strcpy( Book2.subject, "Telecom Billing Tutorial");
Book2.book_id = 6495700;
/* 輸出 Book1 信息 */
printf( "Book 1 title : %s\n", Book1.title);
printf( "Book 1 author : %s\n", Book1.author);
printf( "Book 1 subject : %s\n", Book1.subject);
printf( "Book 1 book_id : %d\n", Book1.book_id);
/* 輸出 Book2 信息 */
printf( "Book 2 title : %s\n", Book2.title);
printf( "Book 2 author : %s\n", Book2.author);
printf( "Book 2 subject : %s\n", Book2.subject);
printf( "Book 2 book_id : %d\n", Book2.book_id);
return 0;
}
學(xué)好C++才是入職大廠的敲門磚! 當(dāng)年要是有這課,我的C++也不至于這樣
已失效
20.共用體
共用體是一種特殊的數(shù)據(jù)類型,允許您在相同的內(nèi)存位置存儲(chǔ)不同的數(shù)據(jù)類型。您可以定義一個(gè)帶有多成員的共用體,但是任何時(shí)候只能有一個(gè)成員帶有值。共用體提供了一種使用相同的內(nèi)存位置的有效方式。
#include stdio.h
#include string.h
union Data
{
int i;
float f;
char ?str[20];
};
int main( )
{
union Data data; ? ? ? ?
printf( "Memory size occupied by data : %d\n", sizeof(data));
return 0;
}
21.指針
#include stdio.h
int main ()
{
int ?var = 20; ? /* 實(shí)際變量的聲明 */
int ?*ip; ? ? ? ?/* 指針變量的聲明 */
ip = var; ?/* 在指針變量中存儲(chǔ) var 的地址 */
printf("Address of var variable: %p\n", var ?);
/* 在指針變量中存儲(chǔ)的地址 */
printf("Address stored in ip variable: %p\n", ip );
/* 使用指針訪問值 */
printf("Value of *ip variable: %d\n", *ip );
return 0;
}
22.文件讀寫
寫入文件
#include stdio.h
int main()
{
FILE *fp = NULL;
fp = fopen("/tmp/test.txt", "w+");
fprintf(fp, "This is testing for fprintf...\n");
fputs("This is testing for fputs...\n", fp);
fclose(fp);
}
讀取文件
#include stdio.h
int main()
{
FILE *fp = NULL;
char buff[255];
fp = fopen("/tmp/test.txt", "r");
fscanf(fp, "%s", buff);
printf("1: %s\n", buff );
fgets(buff, 255, (FILE*)fp);
printf("2: %s\n", buff );
fgets(buff, 255, (FILE*)fp);
printf("3: %s\n", buff );
fclose(fp);
}
C語言與C++學(xué)習(xí)路線
23.排序算法
十大經(jīng)典排序算法(動(dòng)態(tài)演示+代碼)
24.查找算法
九種查找算法
25.面試知識
C語言與C++面試知識總結(jié)
26.字符串操作
字符串操作的全面總結(jié)
27.?C語言常用標(biāo)準(zhǔn)庫解讀
C語言常用標(biāo)準(zhǔn)庫解讀
28. C語言最常用的貪心算法
C語言最常用的貪心算法就這么被攻克了
29. 常見的C語言內(nèi)存錯(cuò)誤及對策
常見的C語言內(nèi)存錯(cuò)誤及對策
30. C語言實(shí)現(xiàn)面向?qū)ο蟮脑?/p>
C語言實(shí)現(xiàn)面向?qū)ο蟮脑?/p>
31. C語言/C++內(nèi)存管理
看完這篇你還能不懂C語言/C++內(nèi)存管理?
32. 再談C語言指針
再談指針:大佬給你撥開 C 指針的云霧
C語言函數(shù)指針之回調(diào)函數(shù)
C語言指針詳解(文末有福利)
33. C語言預(yù)處理命令
長文詳解:C語言預(yù)處理命令
34. C語言高效編程與代碼優(yōu)化
C語言高效編程與代碼優(yōu)化
35. C語言結(jié)構(gòu)體
C語言之結(jié)構(gòu)體就這樣被攻克了!值得收藏!
36. 原碼, 反碼, 補(bǔ)碼 詳解
原碼, 反碼, 補(bǔ)碼 詳解
37. C語言宏定義
簡述C語言宏定義的使用
38. c語言之共用體union、枚舉、大小端模式
c語言之共用體union、枚舉、大小端模式
1. 最好是先看看標(biāo)準(zhǔn)文檔,在cppreference.com這網(wǎng)站也能查看,打開文檔里面有各標(biāo)準(zhǔn)庫函數(shù)、宏的列表以及詳細(xì)介紹,C和C++的都有,如英文讀不懂的話可以選擇中文版。內(nèi)置的系列函數(shù),查找文檔就一目了然,還有非常詳盡的參數(shù)、功能、返回值等說明以及各種格式化說明符的用法。
2. 對于初學(xué)C語言底層實(shí)現(xiàn)并不需要深入了解,如想了解的話可以研究一下glibc之類的實(shí)現(xiàn)。
學(xué)習(xí)任何知識,循序漸進(jìn)總是最好的方式。不幸的是,很多人明知這個(gè)道理,卻總是想走所謂的捷徑。如果你是一個(gè)剛剛開始學(xué)習(xí)編程的中學(xué)生,或者你是一個(gè)剛剛進(jìn)入計(jì)算機(jī)學(xué)院的本科生,又或者你是一個(gè)決心在計(jì)算機(jī)領(lǐng)域有所建樹的初學(xué)者,你一定迫切地想知道,學(xué)習(xí)計(jì)算機(jī)技術(shù),究竟應(yīng)該從哪里下手。
我的建議是:數(shù)學(xué)、英語、C語言。
數(shù)學(xué)和英語的重要性已經(jīng)不需要我來強(qiáng)調(diào),大家也許從幼兒園就開始學(xué)習(xí)它們了,請時(shí)刻把它們放在最重要的位置,無論你是否學(xué)習(xí)計(jì)算機(jī)。
為什么C語言如此重要?我們從學(xué)習(xí)方法開始說起。書本上描述的東西,倘若不經(jīng)過我們的親自實(shí)踐,是難以被徹底消化吸收的。計(jì)算機(jī)組成原理講解了浮點(diǎn)數(shù)的格式,如果我們能看到并分析內(nèi)存或寄存器中某個(gè)浮點(diǎn)數(shù)的表示,那比單純的紙上談兵要強(qiáng)一千倍;數(shù)據(jù)結(jié)構(gòu)與算法似乎很難,如果你能把書上的例子實(shí)現(xiàn)出來,然后把習(xí)題做完,只需啃完一本好書,你也可以是算法高手;操作系統(tǒng)原理其實(shí)不僅僅是原理,只有做一些內(nèi)核方面的實(shí)驗(yàn)才能真正有深刻理解;還有許多新潮的技術(shù),比如JavaEE、PHP、Ajax、.NET等等等等,很多高手學(xué)習(xí)這些技術(shù)只需要很短的時(shí)間,不必說,他們肯定是C語言的高手。C語言幾乎是一切計(jì)算機(jī)技術(shù)的通用工具,包括計(jì)算機(jī)的各種基本理論。沒有精通C語言的決心,就不要涉足計(jì)算機(jī)領(lǐng)域。
為什么是C語言而不是C++不是Java不是其它?因?yàn)镃語言最簡單。你需要掌握一個(gè)語言工具,但也許并不需要“面向?qū)ο蟆?、“模板”、“函?shù)重載”等等一大堆概念。C語言足夠低級,非常非常地貼近計(jì)算機(jī)的底層結(jié)構(gòu),不會(huì)讓你迷失在概念的汪洋大海。除了“指針”,C語言沒有真正意義上的難點(diǎn),而“指針”,恰恰是理解計(jì)算機(jī)底層結(jié)構(gòu)精髓的關(guān)鍵所在。
不必思考應(yīng)該學(xué)什么,等把C語言精通了,你自己便會(huì)知道下一步如何去走。如果你對操作系統(tǒng)內(nèi)部感興趣,你便可以試著研究一下Unix的內(nèi)核,除了C語言,你還需要一些匯編語言和保護(hù)模式的知識;如果你對算法感興趣,那么恭喜你,C語言足夠使用了;如果你對Windows編程感興趣,去看看《Windows程序設(shè)計(jì)》吧,作者清楚的告訴你“只需要C語言的基礎(chǔ)”;如果你對任何其它語言感興趣,盡管去學(xué)吧,不過還是建議先學(xué)C++,因?yàn)槟阈枰恍懊嫦驅(qū)ο蟆钡闹R。
學(xué)習(xí)C語言不是一朝一夕的事情,但也不需要花費(fèi)十年時(shí)間才能精通。如何以最小的代價(jià)學(xué)習(xí)并精通C語言是本文的主題。請注意,即使是“最小的代價(jià)”,也絕不是什么捷徑,而是以最短的時(shí)間取得最多的收獲,同時(shí)也意味著你需要經(jīng)歷艱苦的過程。
一、要讀就讀好書,否則不如不讀
所有初學(xué)者面臨的第一個(gè)問題便是:如何選擇教材。好的開始是成功的一半,選擇一本優(yōu)秀的教材是事半功倍的關(guān)鍵因素。不幸的是,學(xué)校通常會(huì)幫你指定一本很差勁的C語言課本;而幸運(yùn)的是,你還可以再次選擇。
大名鼎鼎的譚浩強(qiáng)教授出了一本《C語言程序設(shè)計(jì)》,據(jù)說發(fā)行量有超過400萬,據(jù)我所知,很多學(xué)校都會(huì)推薦這本書作為C語言課本。雖然本人的名字(譚浩宇)跟教授僅僅一字之差,但我是無比堅(jiān)定地黑他這本書的。這本書不是寫給計(jì)算機(jī)專業(yè)的學(xué)生的,而是給那些需要考計(jì)算機(jī)等級考試的其它專業(yè)學(xué)生看的。這本書的主要缺點(diǎn)是:例子程序非常不專業(yè),不能教給你程序設(shè)計(jì)應(yīng)該掌握的思考方式;程序風(fēng)格相當(dāng)?shù)夭缓?,?huì)讓你養(yǎng)成亂寫代碼的惡習(xí);錯(cuò)誤太多,曾經(jīng)有人指出過這本書的上百個(gè)錯(cuò)誤,其中不乏關(guān)鍵的概念性錯(cuò)誤。好了,這本書我也不想說太多了,有興趣大家可以百度一下:)
Kernighan和Ritchie的《The C Programming Language》(中譯名《C程序設(shè)計(jì)語言》)堪稱經(jīng)典中的經(jīng)典,不過舊版的很多內(nèi)容都已過時(shí),和現(xiàn)在的標(biāo)準(zhǔn)C語言相去甚遠(yuǎn),大家一定要看最新的版本,否則不如不看。另外,即使是最經(jīng)典最權(quán)威的書,也沒有辦法面面俱到,所以手邊常備一本《C語言參考手冊》是十分必要的?!禖語言參考手冊》就是《C Reference Manual》,是C語言標(biāo)準(zhǔn)的詳細(xì)描述,包括絕大多數(shù)C標(biāo)準(zhǔn)庫函數(shù)的細(xì)節(jié),算得上是最好的標(biāo)準(zhǔn)C語言的工具書。順便提一句,最新的《C程序設(shè)計(jì)語言》是根據(jù)C89標(biāo)準(zhǔn)修訂的,而《C語言參考手冊》描述的是C99標(biāo)準(zhǔn),二者可能會(huì)有些出入,建議按照C99標(biāo)準(zhǔn)學(xué)習(xí)。還有一本《C和指針》,寫得也是相當(dāng)?shù)夭诲e(cuò),英文名是《Pointers on C》,特別地強(qiáng)調(diào)指針的重要性,算是本書的一個(gè)特點(diǎn)吧。不過這本書并不十分適合初學(xué)者,如果你曾經(jīng)學(xué)過C語言,有那么一些C語言的基礎(chǔ)但又不是很扎實(shí),那么你可以嘗試一下這本書。我相信,只要你理解了指針,C語言便不再神秘。
如果你已經(jīng)啃完了一本C語言教材,想要更進(jìn)一步,那么有兩本書你一定要看。首先是《C Traps and Pitfalls》(中譯名《C陷井與缺陷》),很薄的一本小冊子,內(nèi)容非常非常地有趣。要注意一點(diǎn),這本書是二十多年前寫成的,里面提到的很多C語言的缺陷都已被改進(jìn),不過能夠了解一些歷史也不是什么壞事。然后你可以挑戰(zhàn)一下《Expert C Programming》(中譯名《C專家編程》),書如其名,這本書頗具難度,一旦你仔細(xì)讀完并能透徹理解,你便可以放心大膽地在簡歷上寫“精通C語言”了。
切記一個(gè)原則,不要讀自己目前還看不懂的書,那是浪費(fèi)生命。如果你看不懂,那你一定是缺失了某些必需基礎(chǔ)知識。此時(shí),你要仔細(xì)分析自己需要補(bǔ)充哪些內(nèi)容,然后再去書店尋找講述的這些內(nèi)容的書籍。把基礎(chǔ)知識補(bǔ)充完畢再回頭來學(xué)習(xí),才會(huì)真正的事半功倍。