第2章 C語言基礎
1 變量的數(shù)據(jù)類型(bit、char、int、long、float)
2 變量存儲空間(code、data 、xdata)
3 變量存儲類型(auto、static)
4 變量作用域
5 運算符
6 分支結(jié)構(gòu)
7 循環(huán)結(jié)構(gòu)
8 函數(shù)
1 變量的數(shù)據(jù)類型(bit、char、int、long、float)
常用變量定義舉例:
bit a; // bit位型變量長度是1個位,取值范圍是0和1,通常用作程序中的標志位。
unsigned char b; // 正數(shù)運算,占用內(nèi)存1個字節(jié)(8位,運算范圍:0 ~ 255)
unsigned | int c; | // 正數(shù)運算,占用內(nèi)存2個字節(jié)(2*8=16位,運算范圍:0 ~ 65535 ) |
unsigned | long d; | // 正數(shù)運算,占用內(nèi)存4個字節(jié)(4*8=32位) |
float f; |
| // 帶小數(shù)點的數(shù)值運算 |
數(shù)據(jù)類型 | 符號 | 說明 | 字節(jié)數(shù) | 表示形式 | 數(shù)值范圍 |
位 型 | 無 |
| 1/8 | bit、sbit | 0或1 |
字符型 |
| ||||||||||||||||||||
整數(shù)型 |
|
實型 | 有 | 有效值24位 | 4 | float | (±16777215)× 10±127 |
2 變量存儲空間(code、data 、xdata)
code :變量存放在程序存儲器空間,最主要的用途是存放表格數(shù)據(jù)。 比如:unsigned char code Table[]={0x12,0x23,… ,0x34};P0 = Table[ i ]; data :變量存放在內(nèi)部RAM ,訪問速度快。
xdata :變量存放在外部RAM, 訪問速度慢(單片機內(nèi)部擴展的xdata 速度仍然很
快)
如果定義變量時沒有說明存儲空間,此時變量存儲空間由keil環(huán)境確定,單擊工具 欄按鈕options for target,選擇target選項卡,在Memory model后就可以選擇變 量默認存儲空間。
void fun()
{
3 變量存儲類型(auto、static)
auto unsigned char x;
static unsigned char y=5; //初次運行時進行初始化賦值1次
x++;
y++;
}
auto:只用于函數(shù)內(nèi)部變量定義,單片機在執(zhí)行這個函數(shù)的時為它分配內(nèi)存地址, 當函數(shù) 執(zhí)行完畢返回后,auto變量就會被銷毀,再次進入這個函數(shù)時,它的初值是不確定的,
auto變量是局部變量,只允許在定義它的函數(shù)內(nèi)使用,由于auto變量在定義它的函數(shù)外的
任何地方都是不可見的,所以允許我們在這個函數(shù)外的其它地方或者是其它的函數(shù)內(nèi)定義 同名的變量,它們之間不會發(fā)生沖突,因為他們都有自己的區(qū)域性,由于函數(shù)內(nèi)部變量默
認存儲類型就是動態(tài)型auto,所以實際代碼中一般都省略了這個關(guān)鍵字。
static:在函數(shù)內(nèi)部,static允許一個變量在重新進入這個函數(shù)時能夠保持原來的值不 變,在函數(shù)內(nèi)部用static定義的變量在函數(shù)初次運行時進行初始化賦值1次, 且只操作一 次,以后每次調(diào)用函數(shù)時不再重新賦初值而只引用上次函數(shù)調(diào)用結(jié)束時的值,在函數(shù)內(nèi)部 使用static定義的變量是局部變量, 只能在定義該變量的函數(shù)內(nèi)使用該變量。
4 變量作用域
如果一個變量在某個文件或函數(shù)范圍內(nèi)是有效的,則稱該文件或函數(shù)為該變量的作用 域,在此作用域內(nèi)可以使用該變量,所以又稱變量在此作用域內(nèi)“可見”,通常,變量的 作用域都是通過它在程序中的位置隱式說明的。
局部變量 :
① 在一個函數(shù)內(nèi)部定義的變量是局部變量,只能在函數(shù)內(nèi)部使用,在main主函數(shù)內(nèi)部 定義的變量也是局部變量,其它函數(shù)也不能使用主函數(shù)中的變量。
② 局部變量在沒有賦值以前的值是不確定的,是以前殘留在內(nèi)存里的隨機值,所以在定
義局部變量的時候一定要初始化。
③ 不同函數(shù)中可以使用同名變量,它們作用域不同,因此不會發(fā)生沖突。
④局部變量在函數(shù)被調(diào)用的過程中動態(tài)占有存儲單元,調(diào)用結(jié)束立即釋放。
全局變量 :
① 在函數(shù)外部定義的變量是全局變量,其作用域是變量定義位置開始至整個程序文件結(jié) 束,實際中全局變量一般是在程序的開頭位置定義。
② 全局變量在沒有賦值以前系統(tǒng)默認為0。
③局部變量若與全局變量同名,則在局部變量的作用域內(nèi),全局變量存在,但不可見, 全局變量的作用被屏蔽。
④全局變量在程序運行過程中一直占用RAM存儲單元。
5 運算符
C語言中的常用運算符可以歸納為下列7大類:
算術(shù)運算符 ( +、 -、 *、 /、 %、 ++、 -- )
關(guān)系運算符 ( <, >, <=, >=, ==, != )輸入數(shù)值,輸出0或1 邏輯運算符 ( && 、||、 ! ) 輸入數(shù)值,輸出0或1 位操作運算符( & 、| 、~ 、^ 、<< 、 >> )輸入數(shù)值,輸出數(shù)值 賦值運算符 ( = )
特殊運算符 ( & 、 * ) 分隔符主要包括這幾個:[ ] ( ) { } , : ;
(1) if (表達式)
{
6 分支結(jié)構(gòu)
語句塊;
}
示例: if (a >=3)
{
b = 0;
}
說明:① 如果表達式的結(jié)果為真(0代表“假”,用非0代表“真”),則執(zhí)行語句塊,否則執(zhí)行if語
句后面的語句(即語句塊后面的語句)。
(2) if (表達式)
{
}
else
{
}
語句塊1;
語句塊2;
示例: if (a >=3)
{
b = 0;
}
else
{
b = 1000;
}
switch(變量表達式)
{
case 常量表達式1:
{ 語句塊1;}
break; // 必須使用break跳出當前switch結(jié)構(gòu)。
case 常量表達式2:
{ 語句塊2;}
break; // 必須使用break跳出當前switch結(jié)構(gòu)。
case 常量表達式n:
{ 語句塊n;}
break; // 特別提示:default前也必須有break。
default:
{ 語句塊n+1;}
break; //必須使用break跳出當前switch結(jié)構(gòu)。
}
補充說明:
① “變量表達式”結(jié)果必須是字符型、整型或長整型,而不能是浮點型,否則編譯錯誤。
② “break;”語句可放在{ 語句塊X} 外,如上面格式所示,也可放在{ 語句塊X}內(nèi)的最后 一行。
③ 多個case語句可以共享一組執(zhí)行語句,例如下面的語句case 1與case 2執(zhí)行同一個語 句塊。
case 1:
case 2:{ 語句塊;}
(1) while (表達式)
{
7 循環(huán)結(jié)構(gòu)
語句塊;
}
說明:如果表達式的結(jié)果為真(0代表“假”,用非0代表“真”),則執(zhí)行語句塊,否則執(zhí)
行while語句后面的語句(即語句塊后面的語句)。
特殊的: while (1) 構(gòu)成1個無限循環(huán)過程。
(2) do
{
很常用
語句塊;
}
while (表達式); // 當表達式的值為真(非0都算作真)時繼續(xù)執(zhí)行循環(huán)體
{
語句塊;
}
for循環(huán)的等效結(jié)構(gòu)如下。
for (循環(huán)變量初值;循環(huán)條件;循環(huán)變量增值)
{
語句塊;
}
特殊的:for (;;); // 構(gòu)成1個無限循環(huán)過程
示例1:void print_message()
{
8 函 數(shù)
print (“How do you do! ” );
}
無參數(shù)函數(shù)定義格式: 返回值類型 函數(shù)名()
{
變量聲明;
語句塊 ;
return (變量或表達式);
}
可以不用
示例2:int max (int x,int y)
{
int z ;
z = x > y ? x:y;
return (z);
}
帶參數(shù)函數(shù)定義格式:
返回值類型 函數(shù)名(類型 形參1,類型 形參2,…)
{
變量聲明;
語句塊 ;
return (變量或表達式);
}
Ø 有些函數(shù)即將執(zhí)行完畢時會返回一個值,函數(shù)定義時的“返回值類型”應該與函數(shù)內(nèi)部
return語句行的變量數(shù)據(jù)類型相同,也就是說只要按變量類型來定義“返回值類型”就 行了,若函數(shù)不需要返回值,“返回值類型”要寫作“void”,此時函數(shù)內(nèi)部也不需要 return語句。
Ø return語句功能是立即從所在的函數(shù)中退出, 返回到調(diào)用它的程序中去,同時還能返回 一個值給調(diào)用它的函數(shù),一個函數(shù)中可以有多個return 語句(如分支結(jié)構(gòu)),執(zhí)行到 哪各return 語句則哪個return 語句起作用。
Ø 形式參數(shù)是指調(diào)用函數(shù)時要傳入到函數(shù)體內(nèi)參與運算的變量,形式參數(shù)必須指定類型, 它可以有任意多個或沒有(由于單片機RAM存儲空間有限,所以實際上達不到任意多 個),當不需要形式參數(shù)時括號內(nèi)可為空或?qū)懭搿皏oid”表示,但括號不能少。
調(diào)用格式(1)函數(shù)名(變量或常數(shù)1,變量或常數(shù)2,…);
示例:Switch (x,y) ;print_message(); 調(diào)用格式(2) V = 函數(shù)名(變量或常數(shù)1,變量或常數(shù)2,…);
示例:z = max (5,9)
說明:當函數(shù)有多個參數(shù)時各參數(shù)要用逗號隔開。
Ø 傳值調(diào)用方式:主調(diào)函數(shù)的實參可以是常數(shù)、變量、數(shù)組元素(比如array[ i ])、結(jié)構(gòu)體
成員變量(比如student.name),傳遞過去的是常數(shù)、變量、數(shù)組元素或結(jié)構(gòu)體成員變量 里面的值,不管被調(diào)函數(shù)里面內(nèi)容如何,調(diào)用結(jié)束后主調(diào)函數(shù)參數(shù)都不會發(fā)生變化。
Ø 傳地址調(diào)用方式:當用數(shù)組名作為函數(shù)實參時,是將數(shù)組所在內(nèi)存單元首地址傳遞給函 數(shù),而不是將整個數(shù)組元素都復制到被調(diào)函數(shù)中去,被調(diào)函數(shù)直接操作數(shù)組內(nèi)的元素,所 以被調(diào)函數(shù)的操作會影響到主調(diào)函數(shù)的實參,這里是傳地址調(diào)用。例如:
int array[]={10,12,20,18,9,11,}; MaxNum=avrage(array,6);
注意:
① 函數(shù)定義行結(jié)尾不能有分號,函數(shù)調(diào)用語句結(jié)尾必須有分號。
② 主調(diào)函數(shù)的實參與被調(diào)函數(shù)的形參個數(shù)和類型必須一致,否則在傳值的過程中發(fā)生自動類 型轉(zhuǎn)換可能導致最終結(jié)果不正確。
③ 如果被調(diào)函數(shù)書寫在主調(diào)函數(shù)之后,則應在文件的開頭(即所有函數(shù)外的最上端)聲明被 調(diào)函數(shù),聲明方法是將函數(shù)定義的一整行復制到文件開頭并在行尾添加分號即可。
歡迎光臨 (http://m.zg4o1577.cn/bbs/) | Powered by Discuz! X3.1 |