當(dāng)前位置:首頁 > 嵌入式培訓(xùn) > 嵌入式學(xué)習(xí) > 講師博文 > 嵌入式學(xué)習(xí)——掌握基礎(chǔ)技術(shù)很重要
C語言學(xué)習(xí)目標(biāo)
掌握C語言的語法規(guī)則,數(shù)組,循環(huán),函數(shù),指針等。
要學(xué)會一些算法,比如冒泡排序,快速排序,遞歸等。
在學(xué)習(xí)的過程中理解什么是面向過程,為將來學(xué)習(xí)c艸,Java等面向?qū)ο笳Z言做準(zhǔn)備。
如何學(xué)習(xí)C語言
掌握基礎(chǔ)知識,為將來進(jìn)一步學(xué)習(xí)打下良好的基礎(chǔ)
上機(jī)實(shí)踐,通過大量的例題學(xué)習(xí)怎么設(shè)計(jì)算法,培養(yǎng)解題思路
養(yǎng)成良好的編程習(xí)慣,注釋一定要寫,不然一周后自己寫的代碼都不認(rèn)識了
這三行代碼作用
#include<stdio.h>//頭文件
int main()//主函數(shù),main函數(shù)程序的入口必有而且只能有一個
{
for (int i = 0; i < 10; i++)
{
printf("%d\n", i);//這個輸出函數(shù)不是C語言自帶的,而是包含在庫函數(shù)<stdio.h>里面
}
return 0;//將結(jié)果返回到函數(shù)調(diào)用處
}
怎么解決學(xué)習(xí)C語言過程中遇到的問題
問題分析:對上級分配的工作要進(jìn)行認(rèn)真的分析,研究所給出的條件,分析最后應(yīng)該達(dá)到的目標(biāo),找出解決問題的規(guī)律,選擇解題的方法。
設(shè)計(jì)算法:例如要解一個方程式,就要選擇用什么方法求解,并且把求解的每一步清晰的寫出來。
編寫程序:根據(jù)得到的算法,用c語言編寫出源代碼,在寫代碼的過程中盡可能的添加注釋。
編譯源程序:對源程序進(jìn)行編輯、編譯和連接,得到可執(zhí)行程序,如果編譯不通過,根據(jù)報(bào)錯提醒,解決報(bào)錯。
運(yùn)行程序、分析結(jié)果:能得到程序不一定意味著程序就是正確的,要對結(jié)果進(jìn)行分析,看它是否合理。
編寫程序文檔:許多程序是提供給別人使用的,提供給用戶使用的程序,必須有說明書。內(nèi)容包括:程序名稱、功能、運(yùn)行環(huán)境、程序的裝入和啟動、需要輸入的數(shù)據(jù),以及其他注意事項(xiàng)。
c語言代碼結(jié)構(gòu)
一個程序由一個或者多個源程序文件組成,一個規(guī)模較小的程序,往往只包括一個源程序文件,一個源程序文件包括3部分:
1、預(yù)處理指令,由預(yù)處理得到的結(jié)果與程序其他部分一起,組成一個完整的、可以用來編譯的最后的源程序,然后由編譯程序?qū)υ撛闯绦蛘竭M(jìn)行編譯,才能得到目標(biāo)程序。
2、全局聲明,即在函數(shù)之外進(jìn)行數(shù)據(jù)聲明。
3、函數(shù)定義,自己定義的函數(shù)
函數(shù)是c程序的主要組成部分
1、程序的幾乎全部工作都是由各個函數(shù)分別完成的,函數(shù)是c程序的基本單位,在設(shè)計(jì)良好的程序中,每個函數(shù)都用來實(shí)現(xiàn)一個或幾個特點(diǎn)的功能.
一個函數(shù)包括兩部分
1、函數(shù)首部,即函數(shù)的第一行,包括函數(shù)名、函數(shù)類型、函數(shù)屬性、函數(shù)參數(shù)、參數(shù)類型。
2、函數(shù)體,包括聲明部分和執(zhí)行部分。
函數(shù)總是從main函數(shù)開始的
1、不管main函數(shù)在整個程序中的位置如何,main函數(shù)可以放在程序的開頭,也可以放在程序的結(jié)尾,或在一些函數(shù)之前,或一些函數(shù)之后。
程序中對計(jì)算機(jī)的操作是由函數(shù)中的c語句完成的
1、如賦值,輸入輸出數(shù)據(jù)的操作都是由相應(yīng)的c語句實(shí)現(xiàn)。
在每個數(shù)據(jù)聲明和語句的最后必須有一個分號
1、分號是c語句的必要組成部分。
C語言本身不提供輸入輸出語句
1、輸入和輸出的操作是由庫函數(shù)scanf和printf函數(shù)來完成。
程序應(yīng)當(dāng)包含注釋
1、一個好的、有使用價(jià)值的源程序都應(yīng)當(dāng)加上必要的注釋,增加程序的可讀性。
常量:在程序運(yùn)行過程中,其值不能被改變的量稱為常量。
分為以下幾類:
1、整型常量
2、實(shí)型常量
3、字符常量(分為普通字符和轉(zhuǎn)義字符)
4、字符串常量
5、符號常量
變量:變量代表一個有名字的,具有特定屬性的一個存儲單元。
常變量:c99允許使用常變量,常變量具有變量的基本屬性只是不允許修改。
#include<stdio.h>//頭文件
#define PI 3.14//屬于常變量聲明了PI的值是3.14,PI的值就不能改變
int main()//主函數(shù)
{
int number = 5;//number是個變量,5是個常量
float number_2 = 1.234;
double number_3 = 3.5678;//number_2和number_3屬于實(shí)型變量,后面的值是常量
char character = 'a';//character是字符變量,'a'是字符常量
return 0;
}
浮點(diǎn)類型
1、單精度浮點(diǎn)類型:float
2、雙精度浮點(diǎn)類型:double
3、復(fù)數(shù)浮點(diǎn)型:float_comlex,double_comple,long long_comple (編譯系統(tǒng)為每一個float型變量分配4個字節(jié),數(shù)值以規(guī)范化的二進(jìn)制數(shù)指數(shù)形式存放在存儲單元中)(double型為了擴(kuò)大能表示的數(shù)值范圍,用8個字節(jié)存儲一個double型數(shù)據(jù),可以得到15位有效數(shù)字)
枚舉類型:enum
字符和字符代碼
1、字母
2、數(shù)字
3、專門符號
4、空格符
5、不能顯示的字符
字符變量
1、字符變量是用類型符char定義字符變量
整型變量 (注意:這里占多少個字節(jié)跟系統(tǒng)和編譯器規(guī)定有關(guān)!可以在編譯器上自己試試查看)
1、基本型:類型說明符為int在內(nèi)存中占2個字節(jié)或4個字節(jié)(vs2022中是4個字節(jié))
2、短整型:類型說明符為short int或short (vs2022中是2個字節(jié))
3、長整型:類型說明符為long int 一個long int型變量的值的范圍是-2的31次方~2的31次方-1,即-2147483648~2147483647.,(vs2022中是4個字節(jié))
4、雙長整型:long long int (vs2022中是8個字節(jié),這個是c99新增的類型)
標(biāo)識符:用來對變量、符號常量名、函數(shù)、數(shù)組、類型等命名的有效字符序列統(tǒng)稱為標(biāo)識符。
c語言規(guī)定標(biāo)識符只能由字母、數(shù)字和下劃線3種字符組成,且第1個字符必須為字母或下劃線。
C語言%求余
#include<stdio.h>
int main()
{
int num1, num2;
num1 = 4;
num2 = 3;//如果后一個數(shù)比前一個大,求余的值就還是前一個數(shù)
printf("兩數(shù)求余的值:%d\n", num1 % num2);
}
C語言算術(shù)表達(dá)式和運(yùn)算符的優(yōu)先級與結(jié)合性
1、在表達(dá)式求值時,先按運(yùn)算符的優(yōu)先級別順序執(zhí)行,例如先乘除后加減。如果在一個運(yùn)算對象兩側(cè)的運(yùn)算符的優(yōu)先級別相同,則按照結(jié)合方向“自左至右”即先左后右執(zhí)行。
c語言強(qiáng)制類型轉(zhuǎn)換運(yùn)算符
1、一般形式:(類型名)(表達(dá)式)
(double)a:將a轉(zhuǎn)換成double類型
(int)(x+y):將x+y的值轉(zhuǎn)換成int類型
c語言常用運(yùn)算符總結(jié)
1、算術(shù)運(yùn)算符:+ - / % ++ --
2、關(guān)系運(yùn)算符:> < == > = < !=
3、邏輯運(yùn)算符:! && ||
4、位運(yùn)算符:<< >> ~ | ^ &
5、賦值運(yùn)算符:=
6、條件運(yùn)算符:?:
7、逗號運(yùn)算符: ,
8、指針運(yùn)算符:*
9、求字節(jié)運(yùn)算符: sizeof
10、強(qiáng)制類型轉(zhuǎn)換運(yùn)算符: (需要強(qiáng)制轉(zhuǎn)換的類型)
11、成員運(yùn)算符:. ->
12、下標(biāo)運(yùn)算符:[]
13、函數(shù)調(diào)用運(yùn)算符:函數(shù)名()
c語言關(guān)系運(yùn)算符是什么
在c語言中,比較符稱為關(guān)系運(yùn)算符,所謂關(guān)系運(yùn)算就是比較運(yùn)算,將兩個數(shù)值進(jìn)行比較,判斷其比較的結(jié)果是否符合給的條件。
#define _CRT_SECURE_NO_WARNINGS //忽略安全檢測,不然使用scanf會報(bào)錯
#include<stdio.h>
int main()
{
int num;
scanf("%d", &num);
if (num<5)
{
printf("num小于5");
}
else
{
printf("unm不小于5");
}
}
c語言邏輯運(yùn)算符優(yōu)先次序
1、有3種邏輯運(yùn)算符:與(AND),或(OR),非(NOT)。在basic和pascal等語言可以在程序中直接用and,or,not作為邏輯運(yùn)算符。在c語言中不能在程序中直接使用,而是用其他符號代替。
2、!(非) &&(與) ||(或) 中“!”優(yōu)先級最高。
3、邏輯運(yùn)算符中的“&&”和“||”低于關(guān)系運(yùn)算符,“!”高于算術(shù)運(yùn)算符。
4、&&和||是雙目運(yùn)算符,它要求有兩個運(yùn)算對象(操作數(shù)),!是一目運(yùn)算符,只要求有一個運(yùn)算對象。
c語言邏輯表達(dá)式
邏輯表達(dá)式的值應(yīng)該是一個邏輯量“真”或“假”。C語言編譯系統(tǒng)在表示邏輯運(yùn)算結(jié)果時,以數(shù)值1代表“真”,以0代表“假”,但在判斷一個量是否為“真時”,以0代表“假”,以非0代表“真”。即將一個非零的數(shù)值認(rèn)作“真”。
c語言邏輯變量
這是c99所增加的一種數(shù)據(jù)類型?梢詫㈥P(guān)系運(yùn)算和邏輯運(yùn)算的結(jié)果存到一個邏輯型變量中,以便于分析和運(yùn)算。定義邏輯變量用類型符Bool。(vs2022沒有這個)
c語言條件運(yùn)算符(三目運(yùn)算符)
一般形式
表達(dá)式1:? 表達(dá)式2:: 表達(dá)式3
條件運(yùn)算符由兩個符號(?和:)組成,必須一起使用。要求有3個操作對象,稱為三目運(yùn)算符。
三目運(yùn)算符可以這樣理解,先計(jì)算出表達(dá)式1的值,表達(dá)式1后面的問號表示“該往哪里”,有兩條路,如果表達(dá)是1的值為真(非0),自然直接到表達(dá)式2,如為假(0值),就繞過表達(dá)式2,到表達(dá)式3.
條件表達(dá)式由三個運(yùn)算對象和條件運(yùn)算符組成
c語言使用條件運(yùn)算符注意事項(xiàng)
1、條件運(yùn)算符優(yōu)先于賦值運(yùn)算符
2、表達(dá)式“2”和表達(dá)式“3”不僅可以是數(shù)值表達(dá)式,還可以是賦值表達(dá)式或函數(shù)表達(dá)式。
3、條件表達(dá)式相當(dāng)于一個不帶關(guān)鍵字if的if語句,用它處理簡單選擇結(jié)構(gòu)可以使程序簡潔。
4、三目運(yùn)算符是C語言中唯一一個三目運(yùn)算符。
c語言printf用法
1、一般格式
printf(格式控制,輸出表列)
格式控制是用雙引號括起來的一個字符串,稱“轉(zhuǎn)換控制字符串”,簡稱“格式字符串”,
包含:(格式聲明:由%和格式字符組成,如%d、%f。)(普通字符:既需要在輸出時原樣輸出的字符。)
輸出表列是程序需要輸出的一些數(shù)據(jù),可以是常量、變量或表達(dá)式。
c語言printf注意事項(xiàng):輸出是以計(jì)算機(jī)為主體而言的,從計(jì)算機(jī)向輸出設(shè)備輸出數(shù)據(jù)稱為輸出,C語言本身不包含輸出語句,如果不加頭文件,代碼就會報(bào)錯。
c語言scanf函數(shù)
一般形式
scanf(格式控制,地址表列)
格式控制和printf函數(shù)一樣,地址表列是由若干個地址組成的表列,可以是變量的地址,或字符串的首地址。
(格式聲明只包含一部分:以%開始,以一個格式字符結(jié)束,中間可以插入附加的字符。)
使用c語言scanf函數(shù)的注意事項(xiàng):
1、scanf函數(shù)中的格式控制后面應(yīng)當(dāng)是變量地址,而不是變量名。
2、如果在格式控制字符串中除了格式聲明以外還有其他字符,則在輸入數(shù)據(jù)時在對應(yīng)的位置上應(yīng)輸入這些字符相同的字符。
3、在用%c格式聲明輸入字符時,空格字符和轉(zhuǎn)義字符中的字符都作為有效字符輸入。
4、在輸入數(shù)值數(shù)據(jù)時,如輸入空格、回車、tab鍵或遇到非法字符時會認(rèn)為你的輸入結(jié)束。
C語言putchar函數(shù)
想從計(jì)算機(jī)向顯示器輸出一個字符,可以調(diào)用系統(tǒng)函數(shù)庫中的putchar函數(shù)。
一般形式
putchar(c)
putchar是put character(給字符)的縮寫,其作用是輸出字符變量c的值,顯然它是一個字符。getchar函數(shù)的值就是從輸入設(shè)備得到的字符。getchar函數(shù)只能接受一個字符。如果想輸入多個字符就要用多個getchar函數(shù)。
c語言if語句的一般形式
一般形式
f(表達(dá)式)語句1
[else語句2]
if語句中的表達(dá)式可以是關(guān)系表達(dá)式、邏輯表達(dá)式,甚至還可以是數(shù)值表達(dá)式。
語句1和語句2可以是一個簡單的語句,也可以是一個復(fù)合語句,還可以是其他的if嵌套。
c語言if語句最常見的3種形式
1、沒有else子句部分
if(表達(dá)式)語句1
2、有else子句部分
if(表達(dá)式)
語句1
else
語句2
3、在else部分又嵌套多層的if語句
if(表達(dá)式1)語句1
else if(表達(dá)式2)語句2
else if (表達(dá)式3)語句3
......
語句1、語句2.....語句m等是if語句中的“內(nèi)嵌語句”,它們是if語句中的一部分。
if語句注意事項(xiàng):整個if語句可以寫在多行上,也可以寫在一行上。if語句無論寫在幾行上,都是一個整體,屬于同一語句。內(nèi)嵌語句也可以是一個if語句。在if語句中要對給定的條件進(jìn)行檢查,判斷所給定的條件是否成立。
c語言switch多分支語句
如果分支較多,嵌套的if語句層數(shù)多,程序繁長而且可讀性降低,因?yàn)閏語言提供switch語句直接處理多分支選擇。
一般形式
switch(表達(dá)式)
{
case 常量1:語句1
case 常量2:語句2
.....
case 常量n:語句n
default:語句n+1
}
例:#define _CRT_SECURE_NO_WARNINGS //忽略安全檢測,不然使用scanf會報(bào)錯
#include<stdio.h>//頭文件
int main()//主函數(shù)
{
char grade;//定義成績級別字符變量
printf("輸入成績級別:");//提示語句
scanf("%c", &grade);//鍵盤輸入
printf("成績段:");//提示語句
switch (grade)//switch 多分支
{
case'A':printf("85-100\n"); break;//輸出A的成績分布
case'B':printf("70-84\n"); break;//輸出B的成績分布
case'c':printf("60-69\n"); break;//輸出C的成績分布
case'D':printf("不及格小于60\n");//輸出D的成績分布
default:printf("輸入成績等級有誤\n");//輸出成績級別有誤
}
return 0;//函數(shù)返回值為0
}
switch多分支注意事項(xiàng):
1、switch后面括號內(nèi)的“表達(dá)式”,其值的類型應(yīng)為整數(shù)類型,包括字符型。
2、switch下面的花括號內(nèi)是一個復(fù)合語句。
3、可以沒有default標(biāo)號,此時如果沒有與switch表達(dá)式相匹配的case常量,則不執(zhí)行任何語句,流程轉(zhuǎn)到switch語句的下一個語句。
4、各個case標(biāo)號出現(xiàn)的次序不影響執(zhí)行結(jié)果,case標(biāo)號只起標(biāo)記作用。
5、每一個case常量必須互不相同。
6、在case子句中雖然包含了一個以上執(zhí)行語句,但可以不必用花括號括起來,會自動順序執(zhí)行本case標(biāo)號后面所以的語句。
C語言while語句
一般形式:while(表達(dá)式)語句
注意事項(xiàng):
1、其中的語句就是循環(huán)體,可以是一個簡單的語句,也可以是符復(fù)合語句。執(zhí)行循環(huán)體的次數(shù)是由循環(huán)條件控制的,這個循環(huán)條件就是上面一般形式中的“表達(dá)式”,也稱為循環(huán)條件表達(dá)式。
2、while循環(huán)可以簡單的記為,只要當(dāng)循環(huán)條件表達(dá)式為真(即給定的條件成立),就執(zhí)行循環(huán)體語句。
3、while循環(huán)特點(diǎn)是:先判斷條件表達(dá)式,后執(zhí)行循環(huán)體語句。
例:#include<stdio.h>//頭文件
int main()//主函數(shù)
{
int num;
num = 15;
while (num > 10)//循環(huán)條件
{
num--;
printf("%d\n", num);
}//循環(huán)體
}
c語言do while介紹
除了while語句以外,c語言還提供了do...while語句來實(shí)現(xiàn)循環(huán)。
一般形式:
do
語句
while (表達(dá)式)
例:#include<stdio.h>//頭文件
int main()//主函數(shù)
{
int num;//定義整型變量
num = 15;//給num賦值15
do//關(guān)鍵詞do
{
num--;
printf("%d\n", num);
} while (num > 10);//先運(yùn)行第8行和第9行的代碼然后再判斷num是否大于10如果符合條件的話會繼續(xù)執(zhí)行第8行和第9行的代碼(dowhile語句一定要有一個分號結(jié)束)
}
c語言for語句介紹
除了可以用while語句和do.....while語句實(shí)現(xiàn)循環(huán)外,c語言還提供for語句實(shí)現(xiàn)循環(huán)
指針(一般用%x十六進(jìn)制輸出)
直接訪問:通過變量名直接訪問地址
間接訪問:把變量的地址放到另一個變量中,使用時先找到后者的地址,從中取出前者的地址
指針變量:存放地址的變量
struct是自定義結(jié)構(gòu)體(sizeof是一個計(jì)算結(jié)構(gòu)類型所占內(nèi)存字節(jié)數(shù)的關(guān)鍵字)
strcpy是字符串拷貝
常用內(nèi)存管理函數(shù)有分配內(nèi)存空間函數(shù)malloc 、calloc釋放內(nèi)存空間函數(shù)free
動態(tài)內(nèi)存分配函數(shù)
void*malloc(unsigned size)
功能:在內(nèi)存的動態(tài)存貯區(qū)(堆)中分配一塊長度為size的連續(xù)空間。
返回值:指針,存放被 分配內(nèi)存的起始地址。若未申請地址,則返回null(0)。
void*:指向任何類型的數(shù)據(jù),在使用時,要進(jìn)行強(qiáng)制類型轉(zhuǎn)換。
例如:(int*)malloc(sizeof(int))
(struct student*)malloc(sizeof(struct student))
sizeof是一個運(yùn)算符作用是計(jì)算需要分配的空間的字節(jié)數(shù)
void free(void*ptr)
功能:釋放由malloc()申請的動態(tài)內(nèi)存空間,ptr存放該空間的首地址。
返回值:無。
p=(struct student*)malloc(sizof(struct student));
......
free(p);
實(shí)踐才能把知識變成技能,堅(jiān)持才有沉淀。