軟件研究室培訓(xùn)(C語言)_第1頁
軟件研究室培訓(xùn)(C語言)_第2頁
軟件研究室培訓(xùn)(C語言)_第3頁
軟件研究室培訓(xùn)(C語言)_第4頁
軟件研究室培訓(xùn)(C語言)_第5頁
已閱讀5頁,還剩36頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

1、C語言1主要內(nèi)容一、 學(xué)習(xí)編程語言的一些建議 二、 指針三、 預(yù)處理器四、 結(jié)構(gòu)、聯(lián)合和枚舉五、 sizeof六、 參考書籍和資料2(1)多動(dòng)手 學(xué)習(xí)編程唯一方法是編寫調(diào)試程序。看再多的書,效果也比不上設(shè)計(jì)調(diào)試一個(gè)簡單程序。(2)養(yǎng)成良好的編程習(xí)慣 養(yǎng)成好習(xí)慣很難。所以良好的編程習(xí)慣要從一開始培養(yǎng)。(3)注意細(xì)節(jié) 不應(yīng)漏過任何一個(gè)技術(shù)細(xì)節(jié)。只有細(xì)節(jié)的日積月累,才能有技術(shù)上的提高。 (4)了解開發(fā)環(huán)境 在學(xué)習(xí)編程語言的同時(shí),也需要了解編程語言的開發(fā)、使用環(huán)境。如硬件平臺(tái)(51、MSP430、PC)、操作系統(tǒng)(uCOS、Linux、DOS)、集成開發(fā)環(huán)境(Keil C,Borland C)等。(5

2、)多看書、勤思考 很多國外的經(jīng)典書籍是由擁有幾十年經(jīng)驗(yàn)的質(zhì)深程序員編寫的。這些書里最重要的是融入了作者多年的編程經(jīng)驗(yàn)。多看書,再結(jié)合自身平時(shí)的積累,不斷思考總結(jié)是提高編程技術(shù)最有效的辦法。第一章 學(xué)習(xí)編程語言的一些建議3第二章 指 針2.1 指針的基本概念2.1.1 指針是什么? 指針是一個(gè)變量,它的值是另外一個(gè)變量的地址。例12.1.2 指針的類型 指針?biāo)鎯?chǔ)的那個(gè)變量類型,就稱為指針的類型。 例 2 有三個(gè)不同類型的指針: int I2, *pI = &I0; 右邊的三個(gè)運(yùn)算有何不同? pI+; char C2, *pC = &C0; pC+; float F2, *pF = &F0; p

3、F+;0 x00C7指針變量 int *p0 x00C7變量 int a上面例中的兩個(gè)0 x00C7有什么區(qū)別?42.1.3 指針的三個(gè)要素 指針指向的地址(指針的內(nèi)容);指針指向的地址上的內(nèi)容;指針本身的地址。 例 3: int A, *pA, *ppA; pA = &A; ppA = &pA;在復(fù)雜的指針都可以通過下表來分析: &ppA ppA *ppA *ppA &pA pA *pA &A A第二章 指 針5第二章 指 針2.1.4 指針的大小(指針變量占用的內(nèi)存空間) 與所用的CPU尋址空間大小和類型有關(guān),而與指針類型無關(guān)。 8位CPU的指針長度為12個(gè)字節(jié)(51單片機(jī)的情況較為復(fù)雜,

4、是13個(gè)字節(jié)); 16位CPU的指針長度為2個(gè)字節(jié)(如MSP430); 32位CPU的指針長度為4個(gè)字節(jié)(如Intel 80386)。 上面所述是通常情況,并不是全部符合。第二章 指 針2.1.5 指針的初始化 變量在沒有賦值之前,其值不定的。對(duì)于指針變量,可以表述為:指向不明。程序訪問了一個(gè)沒有初始化的指針: int* p;p 的內(nèi)存是隨機(jī)的一個(gè)數(shù),比如: 0 x3FF0073D程序隨即訪問內(nèi)存地址:0 x3FF0073D0 x3FF0073D 是哪里的內(nèi)存?說不定正好是Windows老大要用的內(nèi)存,你竟敢訪問! Windows一生氣,藍(lán)屏。一個(gè)指向不明的指針,是非常危險(xiǎn)的! 因此,指針在使

5、用前一定要初始化;在使用前一定要確定指針是非空的! 6第二章 指 針2.2 數(shù)組與指針 對(duì)于數(shù)組的兩個(gè)概念: 1. C語言中只有一維數(shù)組,數(shù)組的大小必須在編譯時(shí)作為一個(gè)常數(shù)確定下來。數(shù)組的元素可以是任何類型,甚至是數(shù)組,由此可以方便地得到多維數(shù)組; 2. 數(shù)組的任何操作,即使采用數(shù)組下標(biāo)進(jìn)行的運(yùn)算都等于對(duì)應(yīng)的指針運(yùn)算。可以用指針行為替代數(shù)組下標(biāo)的運(yùn)算。例4 : int a4, *p; p = a; /等價(jià)于 p =&a0; *(a+2) = 0; /等價(jià)于 a2 = 0; p2 = 0; /等價(jià)于 a2 = 0; 7 但數(shù)組不同于指針: 數(shù)組名 a是指向數(shù)組起始位置的“常量”。 因此,不能對(duì)數(shù)

6、組名進(jìn)行賦值操作。 例 5: int a4, *p; p = a; /正確 a = p; /錯(cuò)誤 p+; /正確 a+; /錯(cuò)誤 第二章 指 針8第二章 指 針2.3 空指針與通用指針(1). 空指針是個(gè)特殊指針值,也是唯一對(duì)任何指針類型都合法的指針值。一個(gè)指針變量具有空指針值,表示它當(dāng)時(shí)沒指向有意義的東西,處于閑置狀態(tài)??罩羔樦涤? 表示,這個(gè)值絕不會(huì)是任何程序?qū)ο蟮牡刂贰=o一個(gè)指針賦值0 就表示要它不指向任何有意義的東西。為了提高程序的可讀性,標(biāo)準(zhǔn)庫定義了一個(gè)與0 等價(jià)的符號(hào)常量NULL,程序里可以寫: p = NULL; /注意不要與空字符NUL混淆,NUL等價(jià)于0或者: p = 0;注

7、意: 在編程時(shí),應(yīng)該將處于閑置的指針賦為空指針; 在調(diào)用指針前一定要判斷是否為空指針,只有在非空情況下才能調(diào)用。9(2).通用指針通用指針可以指向任何類型的變量。通用指針的類型用(void *)表示,因此也稱為void 指針。下面的第三行定義了兩個(gè)通用指針:int n, *p;double *q;void *gp1, *gp2;可以直接把任何變量的地址賦給通用指針。例如,有了上面定義,下面賦值是合法的:gp1 = (void *) &n;可以把通用指針的值賦給普通的指針。如果被賦值指針與通用指針?biāo)缸兞康念愋筒环?,需要寫?qiáng)制轉(zhuǎn)換:p = (int *)gp1;第二章 指 針10第二章 指 針2

8、.4 函數(shù)指針2.4.1 函數(shù)指針的定義函數(shù)指針即指向函數(shù)地址的指針。利用該指針可以知道函數(shù)在內(nèi)存中的位置。因此也可以利用函數(shù)指針調(diào)用函數(shù)。函數(shù)指針的定義方法: (* )(.)例如:int (*func)(void )這里,func就是一個(gè)函數(shù)指針。注意:int *func(void)和int (*func)(void)的區(qū)別int *func(void); /這是返回一個(gè)整型指針的函數(shù) int (*func)(void); /這是一個(gè)函數(shù)指針112.4.2 函數(shù)指針的使用 例6 :假定有下面的函數(shù)聲明 int ptr;int fn(int);int (*fp)(int);指出下面的語句是否合

9、法?,為什么?。fp = fn; /正確,將函數(shù)fn的地址賦給fpfp = fn(5); /錯(cuò)誤,返回給fp的結(jié)果不是一個(gè)函數(shù)地址。fp = &ptr; / 錯(cuò)誤,ptr的地址不在程序代碼區(qū),兩種數(shù)據(jù)類型不能轉(zhuǎn)換。 從上面的例子可以看出:(1) 不能將普通變量的地址賦給函數(shù)指針;(2) 不能將函數(shù)的調(diào)用賦給函數(shù)指針(3) 可以將函數(shù)名賦給一個(gè)函數(shù)指針第二章 指 針12第二章 指 針2.4.2 函數(shù)指針的用途一旦函數(shù)可以通過指針被傳遞、被記錄,這開啟了許多應(yīng)用,特別是下列三者:多態(tài) (polymorphism):指用一個(gè)名字定義不同的函數(shù),這函數(shù)執(zhí)行不同但又類似的操作,從而實(shí)現(xiàn)“一個(gè)接口,多種方

10、法”。多線程 (multithreading):將函數(shù)指針傳進(jìn)負(fù)責(zé)建立多線程的 API 中:例如 Win32 的 CreateThread(.pF.)。 回調(diào) (call-back):所謂的回調(diào)機(jī)制就是:當(dāng)發(fā)生某事件時(shí),自動(dòng)呼叫某段程序代碼。事件驅(qū)動(dòng) (event-driven) 的系統(tǒng)經(jīng)常透過函數(shù)指針來實(shí)現(xiàn)回調(diào)機(jī)制,例如 Win32 的 WinProc 其實(shí)就是一種回調(diào),用來處理窗口的訊息。 132.4.3 函數(shù)指針數(shù)組例7 :在一個(gè)計(jì)算器的例子中,有如下一些語句:switch(oper)caseADD:result=add(op1,op2);break;caseSUB:result=sub

11、(op1,op2); break; . 對(duì)于一個(gè)復(fù)雜的計(jì)算器,switch語句將非常長。我們可以用函數(shù)指針數(shù)組來完成。 doubleadd(double,double);doublesub(double,double);.double(*oper_func)(double,double)=add,sub,.;第2個(gè)步驟是用下面語句替換前面整條switch語句:result=oper_funcoper(op1,op2);oper從數(shù)組中選擇正確的函數(shù)指針,而函數(shù)調(diào)用操作符將執(zhí)行這個(gè)函數(shù)。第二章 指 針14第三章 預(yù)處理器 3.1 預(yù)處理器的作用 可以將預(yù)處理器看作為一個(gè)文本編輯器。它只對(duì)程序的文

12、本起作用,而不會(huì)進(jìn)行其他任何依賴于C語言語法的工作。它負(fù)責(zé)在正式編譯前將源程序進(jìn)行轉(zhuǎn)換,替換宏定義、刪去無需編譯的代碼、插入包含的文件等等。 出于幾個(gè)主要原因,預(yù)處理器為我們提供了一些簡化的途徑: 首先,可以通過改變一個(gè)數(shù)字并重新編譯程序來改變一個(gè)特殊量的所有實(shí)例。 其次,可以定義一些東西,它們看起來象函數(shù)但沒有函數(shù)調(diào)用所需的運(yùn)行開銷。例如,putchar()和getchar()通常實(shí)現(xiàn)為宏以避免對(duì)每一個(gè)字符的輸入輸出都要進(jìn)行函數(shù)調(diào)用。15第三章 預(yù)處理器 3.2 #define 3.2.1 帶參數(shù)的宏定義 當(dāng)需要有一個(gè)程序塊,看上去和用起來像函數(shù)一樣,但是沒有函數(shù)調(diào)用時(shí)的開銷時(shí),可以采用宏定

13、義。宏定義可以象函數(shù)一樣帶參數(shù),如: 例 8: #define Add(a,b) (a)+(b) 注意: (1) 括號(hào)的作用 預(yù)防由運(yùn)算符優(yōu)先級(jí)引起有關(guān)的問題。 例 9: #define Add(a,b) a+b Average = Add(Num1, Num2) / 2; 例中,運(yùn)算式最終由預(yù)處理器展開為: Average = Num1+Num2 / 2;16 (2) 不要忽視空格的作用 例10: #define f (x) (x)-1) Num = f(Num); 上面這個(gè)語句會(huì)被展開成什么,a還是b,為什么? a. Num = (Num)-1); b. Num = (x) (x)-1)(

14、Num); (3) 宏不是類型定義 例11:#define PWORD int * typedef PBYTE char *; PWORD pA, pB; /pB是什么類型? PBYTE pC, pD; /pD是什么類型?第三章 預(yù)處理器173.3 #include 和#include “ ” 有什么區(qū)別?#include :在使用時(shí),編譯器將會(huì)到指定的系統(tǒng)或標(biāo)準(zhǔn)頭文件目錄查找頭文件。通常用于標(biāo)準(zhǔn)或系統(tǒng)提供的頭文件。#include “ ”:在使用“ ”時(shí),編譯器將會(huì)到用戶創(chuàng)建的項(xiàng)目文件所在目錄查找頭文件。通常用于程序自己的頭文件。例12: #include #include #include

15、 “disp.h” #include “output.h”第三章 預(yù)處理器18第三章 預(yù)處理器3.4 條件編譯(1). 條件編譯可以按照不同的編譯條件,組織成不同的代碼。例13: #define MCS51 #ifdef MCS51 Baud = 9600; #elif MSP430 Baud = 4800; #elif PC104 Baud = 115200; #endif 19(2). 條件編譯可用于調(diào)試。將用于調(diào)試的語句放入條件編譯中。例14: #define DEBUG TotalNum = a + b; #ifdef DEBUG printf(“The total num is: %

16、d”,TotalNum); #endif 當(dāng)程序調(diào)試結(jié)束后,只需將 #define DEBUG一句取消,即可將程序中所有的調(diào)試語句刪去。第三章 預(yù)處理器20(3). 在通用的模塊中,可以通過條件編譯實(shí)現(xiàn)功能的可裁減。例14: #define TMR_SET_EN #ifdef TMR_SET_EN void TMR_Set(char tmr_init, char tmr_mod, char tmr_fnct) #endif 如果不需要TMR_Set功能,只需將 #define TMR_SET_EN語句刪除即可。輕松實(shí)現(xiàn)TMR模塊的可裁減特性。第三章 預(yù)處理器21(4). 在宏定義時(shí),避免重復(fù)定

17、義。例15: #ifndef TRUE #define TRUE 1 #endif #ifndef FALSE #define FALSE 0 #endif 第三章 預(yù)處理器22;。23第四章 結(jié)構(gòu)、聯(lián)合和枚舉4.1 結(jié)構(gòu)體結(jié)構(gòu)是由若干(可不同類型的)數(shù)據(jù)項(xiàng)組合而成的復(fù)合數(shù)據(jù)對(duì)象,這些數(shù)據(jù)項(xiàng)稱為結(jié)構(gòu)的成分或成員。(1) 字段C 語言的結(jié)構(gòu)還提供了一種定義字段的機(jī)制,使人在需要時(shí)能把幾個(gè)結(jié)構(gòu)成員壓縮到一個(gè)基本數(shù)據(jù)類型成員里存放,這可以看作是一種數(shù)據(jù)壓縮表示方式。例16: struct pack unsigned a:2; unsigned b:8; unsigned c:6; pk1, pk2;

18、結(jié)構(gòu)變量pk1或者pk2的三個(gè)成員將總共占用16位存儲(chǔ),其中a占用2 位,b占用8 位,c占用6 位。24(2)結(jié)構(gòu)體內(nèi)部的成員的對(duì)齊 在計(jì)算結(jié)構(gòu)體長度(尤其是用sizeof)時(shí),需要注意! 根據(jù)不同的編譯器和處理器,結(jié)構(gòu)體內(nèi)部的成員有不同的對(duì)齊方式,這會(huì)引起結(jié)構(gòu)體長度的不確定性。例17: #include structa chara1; chara2; chara3; A;structb shorta2; chara1; B;void main(void) printf(“%d,%d,%d,%d”, sizeof(char), sizeof(short), sizeof(A), sizeof

19、(B);在Turbo C 2.0中結(jié)果都是1,2,3,3在VC6.0中是1,2,3,4第四章 結(jié)構(gòu)、聯(lián)合和枚舉25第四章 結(jié)構(gòu)、聯(lián)合和枚舉 字節(jié)對(duì)齊的細(xì)節(jié)和編譯器實(shí)現(xiàn)相關(guān),但一般而言,滿足三個(gè)準(zhǔn)則:1) 結(jié)構(gòu)體變量的首地址能夠被其最寬基本類型成員的大小所整除;2) 結(jié)構(gòu)體每個(gè)成員相對(duì)于結(jié)構(gòu)首地址的偏移量(offset)都是成員大小的整數(shù)倍,如有需要編譯器會(huì)在成員之間加上填充字節(jié)(internal adding);3) 結(jié)構(gòu)體的總大小為結(jié)構(gòu)體最寬基本類型成員大小的整數(shù)倍,如有需要編譯器會(huì)在最末一個(gè)成員之后加上填充字節(jié)(trailing padding)。 對(duì)于上面的準(zhǔn)則,有幾點(diǎn)需要說明:1)結(jié)構(gòu)

20、體某個(gè)成員相對(duì)于結(jié)構(gòu)體首地址的偏移量可以通過宏offsetof()來獲得,這個(gè)宏也在stddef.h中定義,如下:#define offsetof(s,m) (size_t)&(s *)0)-m)2) 基本類型是指前面提到的像char、short、int、float、double這樣的內(nèi)置數(shù)據(jù)類型,這里所說的“數(shù)據(jù)寬度”就是指其sizeof的大小。由于結(jié)構(gòu)體的成員可以是復(fù)合類型,比如另外一個(gè)結(jié)構(gòu)體,所以在尋找最寬基本類型成員時(shí),應(yīng)當(dāng)包括復(fù)合類型成員的子成員,而不是把復(fù)合成員看成是一個(gè)整體。但在確定復(fù)合類型成員的偏移位置時(shí)則是將復(fù)合類型作為整體看待。26第四章 結(jié)構(gòu)、聯(lián)合和枚舉4.2 聯(lián)合體 在

21、一個(gè)結(jié)構(gòu)(變量)里,結(jié)構(gòu)的各成員順序排列存儲(chǔ),每個(gè)成員都有自己獨(dú)立的存儲(chǔ)位置。聯(lián)合變量的所有成員共享從同一片存儲(chǔ)區(qū)。因此一個(gè)聯(lián)合變量在每個(gè)時(shí)刻里只能保存它的某一個(gè)成員的值。(1)聯(lián)合變量的初始化聯(lián)合變量也在可以定義時(shí)直接進(jìn)行初始化,但這個(gè)初始化只能對(duì)第一個(gè)成員做。例如下面的描述定義了一個(gè)聯(lián)合變量,并進(jìn)行了初始化:例18: union data char n; float f; ; union data u1 = 3; /只有u1.n被初始化274.3 枚舉 枚舉是一種用于定義一組命名常量的機(jī)制,以這種方式定義的常量一般稱為枚舉常量。 一個(gè)枚舉說明不但引進(jìn)了一組常量名,同時(shí)也為每個(gè)常量確定了一個(gè)

22、整數(shù)值。缺省情況下其第一個(gè)常量自動(dòng)給值0,隨后的常量值順序遞增。(1)給枚舉常量指定特定值 與給變量指定初始值的形式類似。如果給某個(gè)枚舉量指定了值,跟隨其后的沒有指定值的枚舉常量也將跟著順序遞增取值,直到下一個(gè)有指定值的常量為止。 例如寫出下面枚舉說明: enum color RED = 1, GREEN, BLUE, WHITE = 11, GREY, BLACK= 15; 這時(shí),RED、GREEN,、BLUE 的值將分別是1、2、3,WHITE、GREY的值將分別是11、12,而BLACK 的值是15。第四章 結(jié)構(gòu)、聯(lián)合和枚舉28(2)用枚舉常量作為數(shù)組長度 例19: typedef en

23、umWHITE, RED, BLUE, YELLOW, BLACK, COLOR_NUM COLOR; float BallSizeCOLOR_NUM; 上例中當(dāng)顏色數(shù)量發(fā)生變化時(shí),只需在枚舉類型定義中加入或刪去顏色。無需修改COLOR_NUM的定義。與大量使用#define相比既簡潔又可靠。 如: typedef enum WHITE, RED, BLUE,COLOR_NUM COLOR;第四章 結(jié)構(gòu)、聯(lián)合和枚舉29第五章 sizeof5.1 sizeof的定義和使用sizeof 是C/C+中的一個(gè)操作符(注意!不是函數(shù)!就像return一樣)。其作用就是返回一個(gè)對(duì)象或者類型所占的內(nèi)存字節(jié)數(shù)

24、。sizeof有三種使用形式,如下:1) sizeof(var); / sizeof( 變量 ); 2) sizeof(type_name); / sizeof( 類型 );3) sizeof var; / sizeof 變量;所以,int i;sizeof(i); / oksizeof i; / oksizeof(int); / oksizeof int; / error為求形式統(tǒng)一,不建議采用第3種寫法,忘掉它吧!305.2 數(shù)組的sizeof 數(shù)組的sizeof值等于數(shù)組所占用的內(nèi)存字節(jié)數(shù),如:例21:char* ss = 0123456789; sizeof(ss); / 結(jié)果 4 ,

25、 ss是指向字符串常量的字符指針 sizeof(*ss); / 結(jié)果 1 ,*ss是第一個(gè)字符 char ss = 0123456789; sizeof(ss); / 結(jié)果 11 , 計(jì)算到0位置,因此是101 sizeof(*ss); / 結(jié)果 1 , *ss是第一個(gè)字符 char ss100 = 0123456789; sizeof(ss); / 結(jié)果 100 , 表示在內(nèi)存中的大小 1001 strlen(ss); / 結(jié)果 10 , strlen是到0為止之前的長度 int ss100 = 0123456789; sizeof(ss); /結(jié)果200 , ss表示在內(nèi)存中的大小 100

26、2 strlen(ss); /錯(cuò)誤,strlen的參數(shù)只能是char*且必須以0結(jié)尾第五章 sizeof31第五章 sizeof5.3 結(jié)構(gòu)體的sizeof 參見(結(jié)構(gòu)體內(nèi)部的成員的字節(jié)對(duì)齊)5.4 當(dāng)數(shù)組作為函數(shù)的參數(shù)時(shí), sizeof的使用 編譯器把數(shù)組參數(shù)當(dāng)作指針對(duì)待, 因而在使用sizeof時(shí),報(bào)告的是指針的大小。例22: char S = “1234567890”; size_t foo(char *s) return(sizeof(s); void main(void) size_t sz = foo(S); /sz = 4(PC),sz = 2(MSP430) size_t sz

27、1 = sizeof(S); /sz1 = 11; 32第六章 可移植性6.1 數(shù)據(jù)類型的大小 在C和C+里,基本數(shù)據(jù)類型大小并沒有明確的規(guī)定,僅給出下列一些規(guī)則: sizeof(char) = sizeof(short) = sizeof(int) = sizeof(long); sizeof(float) = sizeof(double); char至少是8位,short和int至少是16位,long至少是32位。如: 在8051上int為16位,占2個(gè)字節(jié); 在PC機(jī)上int為32位。占4個(gè)字節(jié)。 因此,我們建議用類似下面的類型定義來替代:typedef unsigned char BO

28、OLEAN;typedef unsigned char INT8U;typedef signed char INT8S;typedef unsigned int INT16U;typedef signed int INT16S;typedef unsigned long INT32U;typedef signed long INT32S;typedef float FP32;typedef double FP64;33第六章 可移植性6.2 char的符號(hào)問題 char數(shù)據(jù)類型到底是有符號(hào)還是無符號(hào),C和C+并沒有給出明確規(guī)定。 不同編譯器和平臺(tái),對(duì)char是否有符號(hào)規(guī)定不一。 無符號(hào)char

29、的范圍為 0255; 有符號(hào)char的范圍為 128127。 因此,在移植時(shí)會(huì)出現(xiàn)溢出(無符號(hào)有符號(hào))或負(fù)數(shù)變?yōu)檎龜?shù)(有符號(hào)無符號(hào))。解決辦法: 在變量無需用到負(fù)數(shù)時(shí),明確定義其為 unsigned char或是INT8U; 在變量可能用到負(fù)數(shù)時(shí),明確定義其為 signed char或是INT8S。6.3 結(jié)構(gòu)體對(duì)齊問題參見(結(jié)構(gòu)體內(nèi)部的成員的字節(jié)對(duì)齊)34第六章 可移植性6.4 字節(jié)順序 大多數(shù)微處理器的存儲(chǔ)結(jié)構(gòu)是8 位地址空間。 字節(jié)許多數(shù)據(jù)項(xiàng)地址數(shù)字和字符串太長,不能用單個(gè)字節(jié)保存必須用一系列連續(xù)字節(jié)保存當(dāng)使用用多字節(jié)保存的數(shù)據(jù)時(shí),字節(jié)順序就成為一個(gè)問題。 對(duì)字節(jié)順序的兩個(gè)通行的方法被廣

30、泛使用: 第一個(gè)方法是調(diào)用小ENDIAN 就是低字節(jié)首先保存。例如一個(gè)16 位整數(shù)值0 x1234 用小ENDIAN 方法保存兩個(gè)連續(xù)的字節(jié)如下 地址 內(nèi)容+0+10 x340 x12 第二個(gè)方法是調(diào)用大ENDIAN 就是高字節(jié)先保存低字節(jié)后保存例如一個(gè)16 位整數(shù)值0 x1234 用大ENDIAN 方法保存兩個(gè)連續(xù)的字節(jié)如下 地址 內(nèi)容址+0 +1+0 +10 x120 x34356.5 使用標(biāo)準(zhǔn)庫 盡量使用C語言定義的標(biāo)準(zhǔn)庫。這樣,從一個(gè)系統(tǒng)移植到另一個(gè)系統(tǒng),你的代碼很有希望還能具有同樣的行為方式。 8051 的LCALL 指令保存下一個(gè)指令在堆棧中地址的低字節(jié)首先推入堆棧因此地址是以小E

31、NDIAN 格式保存; 所有別的16 位和32 位值以大ENDIAN 格式保存高字節(jié)先保存例如LJMP和LCALL 指令期望地址以大ENDIAN 格式保存; 浮點(diǎn)數(shù)根據(jù)IEEE-754 格式保存以大ENDIAN 格式首先保存高字節(jié) 如果8051 嵌入應(yīng)用平臺(tái)和別的CPU通訊必須知道其所用的字節(jié)順序。第六章 可移植性36第六章 參考書籍和資料6.1 C語言初級(jí)教材(1)C程序設(shè)計(jì)語言(The C Programming Language) 作者:Brian W.Kernighan, Dennis M.Ritchie 簡介:本書是由C語言的設(shè)計(jì)者Brian W. Kernighan和Dennis

32、M. Ritchie編寫的一部介紹標(biāo)準(zhǔn)C語言及其程序設(shè)計(jì)方法的權(quán)威性經(jīng)典著作。一本必讀的程序設(shè)計(jì)語言方面的參考書。(2)C Primer Plus中文版(C Primer Plus) 作者:Stephen Prata 簡介:作為核心計(jì)算機(jī)技術(shù)成熟、完整的參考書籍,Primer Plus系列歷經(jīng)十?dāng)?shù)年不衰,通過學(xué)習(xí)C Primer Plus(第五版)中文版,你將奠定堅(jiān)實(shí)的C編程基礎(chǔ)。(3)C和指針(Pointers on C) 作者:Kenneth A.Reek 簡介:本書提供與C語言編程相關(guān)的全面資源和深入討論。全書覆蓋了數(shù)據(jù)、語句、操作符和表達(dá)式、指針、函數(shù)、數(shù)組、字符串、結(jié)構(gòu)和聯(lián)合等幾乎所有重要的C編程話題。書中給出了很多編程技巧和提示。376.2 C語言進(jìn)階書籍(1)C陷阱與缺陷(C Traps and Pitfalls) 作者:Andrew Koenig 簡介:作者以自己1985年在Bell實(shí)驗(yàn)室時(shí)發(fā)表的一篇論文為基礎(chǔ),結(jié)合自己的工作經(jīng)驗(yàn)擴(kuò)展成為這本對(duì)C程序員具有珍貴價(jià)

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論