- 相關(guān)推薦
C語(yǔ)言中的重要概念有哪些
學(xué)習(xí)是一個(gè)循序漸進(jìn)的過(guò)程,需要同學(xué)們不斷的學(xué)習(xí)和努力。下面yjbys考試網(wǎng)小編為大家分享C語(yǔ)言中的幾個(gè)重要概念,希望能幫助大家更好的復(fù)習(xí)所學(xué)的知識(shí)。
一、C語(yǔ)言的指針
1.指針說(shuō)明
指針是包含另一變量的地址變量。
(1)int *p
p是一個(gè)指針,指向一個(gè)整形數(shù)。
(2)int *p()
p是一個(gè)函數(shù),該函數(shù)返回一個(gè)指向整數(shù)的指針。
(3)int (*p)()
p是一個(gè)指針,該指針指向一個(gè)函數(shù),這個(gè)函數(shù)返回一個(gè)整數(shù)。
(4)int *p[]
p是一個(gè)數(shù)組,該數(shù)組的每一個(gè)元素是指向整數(shù)的指針C語(yǔ)言中的幾個(gè)重要概念C語(yǔ)言中的幾個(gè)重要概念。
(5)int (*p)[]
p是一個(gè)指針,該指針指向一個(gè)數(shù)組,這個(gè)數(shù)組的每一個(gè)元素是一個(gè)整數(shù)。
(6)int *(*p)()
p是一個(gè)指針,該指針指向一個(gè)函數(shù),這個(gè)函數(shù)返回一個(gè)指向整數(shù)的指針。
2.指針的初始化(賦地址)
(1)通過(guò)符號(hào)&取變量(包括結(jié)構(gòu)變量、數(shù)組第一個(gè)元素)的地址賦給指針;
(2)把數(shù)組名賦給指針;
(3)把函數(shù)名賦給指向函數(shù)的指針;
(4)動(dòng)態(tài)分配內(nèi)存
例:struct c{double r,i;};
struct c *p;
p=(struct c *)malloc(sizeof(struct c));
3.指針與數(shù)組、函數(shù)的關(guān)系
(1)對(duì)于一維數(shù)組 int a[i] 或指針 int *a
a+i 指向 a[i]
(2)對(duì)于字符串 char s[i] 或指針 char *s
s+i 指向第 i個(gè)字符 s[i]
(3)對(duì)于二維數(shù)組int a[i][j]
*a+j 指向 a[0][j]
*(a+i) 指向 a[i][0]
*(a+i)+j 指向 a[i][j]
例:對(duì)于 a[2][3]={1,2,3,4,5,6,}; 有 *(*(a+1)+1)=5;
(4)對(duì)于字符串?dāng)?shù)組char p[i][j] 或字符型指針數(shù)組char *p[i]
*p+j 指向第 0個(gè)字符串的第 j個(gè)字符
*(p+i) 指向第 i個(gè)字符串的第 0個(gè)字符
*(p+i)+j 指向第 i個(gè)字符串的第 j個(gè)字符
例:對(duì)于 *p[]={"ABC","DEF"}; 有 *(*(p+1)+1)='E';
例:對(duì)于 char p[][3]={"ABC","DEF"}; 有 *(*(p+1)+1)='E';
(5)對(duì)于指針數(shù)組int *a[i]
a[i] 指向 變量i
即 *a[i]=變量i 或 a[i]=&變量i
(6)對(duì)于結(jié)構(gòu)struct XY
{int x;int *y}*p;
p是指向結(jié)構(gòu)XY的指針
(*p).x 或 p->x 是表示 x 的內(nèi)容
(*p).y 或 p->y 是表示指針 y 的值(地址)
*(*p).y 或 *p->y 是表示 y 所指的內(nèi)容
&(*p).x 或 &p->x 是表示 x 的地址
(7)指向函數(shù)的指針
對(duì)于 void func(char *str)
{…}; //定義了一個(gè)函數(shù)
void (*p)(char*);//定義了一個(gè)函數(shù)指針
p=func; //讓指針指向函數(shù)
則(*p)("…"); //用指針p可以調(diào)用函數(shù)func
(8)指向多個(gè)不同函數(shù)的指針數(shù)組
對(duì)于void function_1() {…};
…
void function_4() {…}; //定義了四個(gè)函數(shù)
typedef void(*menu_fcn)();//定義了指向函數(shù)的指針
menu_fcn command[4]; //定義了指針數(shù)組
command[0]=function_1;
…
command[3]=function_4; //讓指針數(shù)組指向四個(gè)函數(shù)
則command[0](); //用指針數(shù)組中的一個(gè)元素調(diào)用一個(gè)函數(shù)
4.指針的分類(lèi)
(1)近指針(near):
近指針為16位指針,它只含有地址的偏移量部分。近指針用于不超過(guò)64K 字節(jié)的單個(gè)數(shù)據(jù)段或代碼段。在微、小和中編譯模式下產(chǎn)生的數(shù)據(jù)指針是近指針(缺省狀態(tài));在微、小和中編譯模式下產(chǎn)生的碼指針(指向函數(shù)的指針)是近指針(缺省狀態(tài))。
(2)遠(yuǎn)指針(far)
遠(yuǎn)指針為32位指針,指針的段地址和偏移量都在指針內(nèi)。可用于任意編譯模式。每次使用遠(yuǎn)指針時(shí)都要重裝段寄存器。遠(yuǎn)指針可尋址的目標(biāo)不能超過(guò)64K ,因?yàn)檫h(yuǎn)指針增減運(yùn)算時(shí),段地址不參與運(yùn)算。在緊湊、大和巨模式下編譯產(chǎn)生的數(shù)據(jù)指針是遠(yuǎn)指針(缺省狀態(tài))C語(yǔ)言中的幾個(gè)重要概念計(jì)算機(jī)考試。
(3)巨指針(huge)
巨指針為32位指針,指針的段地址和偏移量都在指針內(nèi)。可用于任意編譯模式。遠(yuǎn)指針尋址的目標(biāo)可以超過(guò)64K 。巨指針是規(guī)則化的指針。
5.指針的轉(zhuǎn)換
(1)遠(yuǎn)指針轉(zhuǎn)換成巨指針
使用以下函數(shù)
void normalize(void far * * p)
{
*p=(void far *)(((long)*p&0xffff000f)+(((long)*p&0x0000fff00<<12));
}
6.指針的使用
(1)將浮點(diǎn)數(shù)轉(zhuǎn)換成二進(jìn)制數(shù)
float ff=16.5;
unsigned char *cc;
(float*)cc=&ff;
//此時(shí)cc的內(nèi)容為"00008441"
//即cc第一個(gè)字節(jié)=0;第二個(gè)字節(jié)=0;第三個(gè)字節(jié)=0x84;第四個(gè)字節(jié)=0x41;
(2)將二進(jìn)制數(shù)轉(zhuǎn)換成浮點(diǎn)數(shù)
float ff;
unsigned char *cc;
cc=(unsigned char*)malloc(4);
cc=(unsigned char*)&ff;
*(cc+0)=0;
*(cc+1)=0;
*(cc+2)=0x84;
*(cc+3)=0x41;
//此時(shí)ff=16.5
free(cc);
二、C 語(yǔ)言的函數(shù)
1.用戶自定義函數(shù)格式
類(lèi)型 函數(shù)名(形式參數(shù)表)
參數(shù)說(shuō)明
{
……
}
2.函數(shù)的調(diào)用方式
(1)傳值方式
①傳給被調(diào)用函數(shù)的是整型、長(zhǎng)整型、浮點(diǎn)型或雙精度型變量。被調(diào)用的函數(shù)得定義相應(yīng)的變量為形參。
、趥鹘o被調(diào)用函數(shù)的是結(jié)構(gòu)變量。被調(diào)用函數(shù)得定義結(jié)構(gòu)變量為形參。
、蹅鹘o被調(diào)用函數(shù)的是結(jié)構(gòu)變量的成員。被調(diào)用函數(shù)得定義與該成員同類(lèi)的變量為形參。
(2)傳址方式
①傳給被調(diào)用函數(shù)的是變量的地址C語(yǔ)言中的幾個(gè)重要概念C語(yǔ)言中的幾個(gè)重要概念。被調(diào)用函數(shù)得定義指針變量為形參。
、趥鹘o被調(diào)用函數(shù)的是數(shù)組的地址即數(shù)組名。被調(diào)用的函數(shù)得定義數(shù)組或指針變量為形參。
③傳給被調(diào)用函數(shù)的是函數(shù)的地址即函數(shù)名稱。被調(diào)用函數(shù)得定義指向函數(shù)的指針變量為形參。
、軅鹘o被調(diào)用函數(shù)的是結(jié)構(gòu)的地址。被調(diào)用函數(shù)得定義結(jié)構(gòu)指針為形參。
3.函數(shù)調(diào)用(傳值方式)結(jié)果的返回
(1)返回的是數(shù)值
要求被調(diào)用的函數(shù)類(lèi)型與接收返回值的變量類(lèi)型相同。
(2)返回的是指針
要求被調(diào)用的函數(shù)是指針函數(shù),其指向的類(lèi)型與接收的指針變量指向類(lèi)型相同。
(3)不返回任何值
被調(diào)用的函數(shù)是void型
三、C 語(yǔ)言的信息壓縮法
1.使用位運(yùn)算符
要把 5個(gè)數(shù)據(jù)的值壓縮到一個(gè)字(16位)中,假定其中三個(gè)(f1、f2、f3)是標(biāo)記(真或偽)各占一位;第四個(gè)是叫type的整數(shù),其取值范圍為 1到12,需要 4位的存儲(chǔ)器;最后一個(gè)叫作index 的整數(shù),其取值范圍為從 0到 500,需占 9位C語(yǔ)言中的幾個(gè)重要概念計(jì)算機(jī)考試。為此定義一個(gè)整型變量:unsigned int packed_data,可包含此 5個(gè)值。下圖是位域分配。
typeindex
f1f2f3┌──┐┌───────┐
┌┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┐
└┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┘
把 n的 4個(gè)低位的值置入packed_data 的type域中,用下面的語(yǔ)句:
packed_data=(packed_data & ~(0xf<<9))|((n&0xf)<<9);
其中位或符號(hào)|左邊是將type域置 0,右邊是取 n的低 4位后左移9 位到type域中。
從packed_data 的type域中提取數(shù)值并把它賦予 n的語(yǔ)句是:
n=(packed_data>>9) & 0xf;
2.使用位域結(jié)構(gòu)
(1)定義一個(gè)叫做 packed_struct的結(jié)構(gòu),含有 5個(gè)成員
struct packed_struct
{
unsigned int f1:1
unsigned int f2:1;
unsigned int f3:1;
unsigned int type:4;
unsigned int index:9;
};
(注:在結(jié)構(gòu)中還可以放入普通數(shù)據(jù)類(lèi)型,如char c;等)
(2)定義一個(gè)變量
struct packed_struct packed_data;
(3)把packed_data 的type 域置于n的低位,用語(yǔ)句
packed_data.type=n;
(4)從packed_data 中提取type域(按要求,把它移到低位),并把它賦予 n,用語(yǔ)句
n=packed_data.type;
3.使用聯(lián)合
(1)一個(gè)無(wú)符號(hào)整型數(shù)與一個(gè)結(jié)構(gòu)(其中包含許多無(wú)符號(hào)變量)共用一存儲(chǔ)區(qū),當(dāng)無(wú)符號(hào)整型數(shù)被賦值后,可通過(guò)結(jié)構(gòu)變量獲得各位的值。
例如,定義一個(gè)聯(lián)合
union {
unsigned equi;
struct {
unsigned boot :1;
unsigned copr :1;
unsigned rsize:2;
unsigned vmode:2;
unsigned dnum :2;
unsigned:1;
unsigned cnum :3;
unsigned gnum :1;
unsigned:1;
unsigned pnum :2;
}beq;
}eq;
當(dāng)調(diào)用BIOS INT 11H中斷后,將AX的值賦給eq.equi,就可以從eq.beq.boot得到PC機(jī)有無(wú)系統(tǒng)盤(pán)的信息;從eq.beq.copr得到PC機(jī)有無(wú)浮點(diǎn)運(yùn)算部件的信息。......
(2)兩個(gè)結(jié)構(gòu)共享同一存儲(chǔ)區(qū)域
例如:union REGS
struct WORDREGS{unsigned int ax,bx,cx,dx,si,di,cflag,flags};
struct BYTEREGS{unsigned char al,ah,bl,bh,cl,ch,dl,dh};
union REGS {struct WORDREGS x;struct BYTEREGS h;}
四 、位運(yùn)算
1.數(shù)的編碼—補(bǔ)碼
(1).正數(shù)的補(bǔ)碼與原碼同。
(2).負(fù)數(shù)的補(bǔ)碼為
①第一位(符號(hào)位)為 1;
、谑S嘣a位數(shù)逐位取反;
③然后對(duì)整個(gè)數(shù)加 1。
2.位邏輯運(yùn)算的特殊用途
(1).取一個(gè)數(shù)中的某些字節(jié)
例a & 0x00ff得到a的低字節(jié),a & 0xff00得到a的高字節(jié)。
┌─┬───┬────┬────────┐
│數(shù)│十進(jìn)制│十六進(jìn)制│補(bǔ)碼│
├─┼───┼────┼────────┤
│ a││0x2cac│0010110010101100│
│││0x00ff│0000000011111111│
├─┴───┼────┼────────┤
│ 按位與 │ ox00ac │0000000010101100│
│ 運(yùn)算結(jié)果 │││
└─────┴────┴────────┘
(2).將一個(gè)數(shù)的某些特定位置1
例a | 0x0f使a的低4位改為1。
┌─┬───┬────┬────────┐
│數(shù)││十六進(jìn)制│補(bǔ)碼│
├─┼───┼────┼────────┤
│a ││0x0030│0000000000110000│
│││0x000f│0000000000001111│
├─┴───┼────┼────────┤
│按位或││0000000000111111│
│運(yùn)算結(jié)果│││
└─────┴────┴────────┘
(3).將某數(shù)特定位置翻轉(zhuǎn)
例a ^ 0x000f使a的低4位翻轉(zhuǎn)(0變1;1變0)。
┌─┬───┬────┬────────┐
│數(shù)││十六進(jìn)制│補(bǔ)碼│
├─┼───┼────┼────────┤
│a ││ 0x007a │0000000001111010│
│││ 0x000f │0000000000001111│
├─┴───┼────┼────────┤
│ 按位異或 ││0000000001110101│
│ 運(yùn)算結(jié)果 │││
└─────┴────┴────────┘
(4)將a的右起第2位反向變化(1變0,0變1)
a=a^0x02;//(0x02=00000010),異或的意義是"同值為0"
(5).將兩個(gè)數(shù)(整型數(shù))的值互換
例a=a^b;b=b^a;a=a^b; //三步使得a、b的值互換
3.移位運(yùn)算的特殊用途
(1).將某數(shù)除以2(右移1位)
例a>>2 使得a被4除
、賹(duì)于 signed a=-8,a>>2
a=-8
┌─┬─┬─┬─┬─┬─┬─┬─┐
│1 │1 │1 │1 │1 │0 │0 │0 │
└─┴─┴─┴─┴─┴─┴─┴─┘
├─┬─┐──>└───┐
┌─┬─┬─┬─┬─┬─┬─┬─┐
│1 │1 │1 │1 │1 │1 │1 │0 │
└─┴─┴─┴─┴─┴─┴─┴─┘
a=-2
、趯(duì)于unsigned a=248,a>>2
a=248
┌─┬─┬─┬─┬─┬─┬─┬─┐
│1 │1 │1 │1 │1 │0 │0 │0 │
└─┴─┴─┴─┴─┴─┴─┴─┘
└───┐ ──> └───┐
┌─┬─┬─┬─┬─┬─┬─┬─┐
│0 │0 │1 │1 │1 │1 │1 │0 │
└─┴─┴─┴─┴─┴─┴─┴─┘
補(bǔ)0──┴─┘a=62
(2).將某數(shù)乘以2(左移1位)
注左移時(shí)signed 與unsigned變量的情況一樣,均要補(bǔ)0。
(3)將x的右起第n(n>=0)位置0
x&=~(1《n); 若x是long,則x&=~((long)1《n);
(4)將x的右起第n(n>=0)位置1
x|=1《n;
若x是長(zhǎng)整形數(shù)則 x|=(long)1《n;
五、C語(yǔ)言訪問(wèn)CPU寄存器的方法
1.使用聯(lián)合REGS,和函數(shù) int86() / int86x() / intr()
REGS是用來(lái)在進(jìn)行 DOS軟中斷調(diào)用時(shí)向各個(gè)寄存器傳輸數(shù)據(jù)或從各個(gè)寄存器取出返回值。
union REGS 示意圖
structstruct
WORDREGSBYTEREGS
┌ ┌───────┬──────┐──┬── ┐
│ ││ al │ 1 byte│
│ │ax├──────┤──┴─ 2 bytes
│ ││ ah │ │
│ ├───────┼──────┤───── ┘
│ ││ bl │
│ │bx├──────┤
│ ││ bh │
│ ├───────┼──────┤
│ ││ cl │
│ │cx├──────┤
│ ││ ch │
│ ├───────┼──────┤
│ ││ dl │
│ │dx├──────┤
│ ││ dh │
union regs├───────┼──────┤
│ │││
│ │si││
│ │││
│ ├───────┤│
│ │││
│ │di││
│ │││
│ ├───────┤│
│ │││
│ │cflag ││
│ │││
│ ├───────┤│
│ │││
│ │flags ││
│ │││
└ └───────┴──────┘
│x兩個(gè)結(jié)構(gòu)變量h│
└──共享同一存儲(chǔ)域──┘
2.使用偽變量和函數(shù)geninterrupt()
Turbo C 允許使用偽變量直接訪問(wèn)相應(yīng)的8086寄存器。偽變量的類(lèi)型有兩種。
、 unsigned int : _AX、 _BX、 _CX、 _DX、 _CS、 _DS、 _SS、 _ES、 _SP、 _BP、 _DI、 _SI
② unsigned char: _AL、 _AH、 _BL、 _BH、 _CL、 _CH、 _DL、 _DH
六、C語(yǔ)言使用內(nèi)存和寄存器的方法
1.段和段寄存器
CS用來(lái)存放代碼段的段地址;DS用來(lái)存放全局變量和靜態(tài)變量所在段(數(shù)據(jù)段)的段地址;SS用來(lái)存放局部變量,參數(shù)所在段(堆棧)的段地址。 此外,還有堆段,是動(dòng)態(tài)分配的內(nèi)存。
2.微模式編譯時(shí)段的使用情況
只有一個(gè)段,從底往高依此裝入代碼,靜態(tài)變量和全局變量,堆。從高往低裝入堆棧。
3.小模式編譯時(shí)段的使用情況
數(shù)據(jù)、堆棧和近堆共用一個(gè)段,代碼用一個(gè)段,還有一個(gè)遠(yuǎn)堆(用far指針存取)。
4.中模式編譯時(shí)段的使用情況
中模式有多個(gè)代碼段,其余與小模式一樣。函數(shù)指針用far指針。
5.緊湊模式編譯時(shí)段的使用情況
代碼,靜態(tài)數(shù)據(jù),堆棧,堆(只有遠(yuǎn)堆)各有自己的段。靜態(tài)數(shù)據(jù)的總量不得超過(guò)64K
6.大模式編譯時(shí)段的使用情況
靜態(tài)數(shù)據(jù),堆,堆棧的分配與緊湊模式一樣;代碼段的分配與中模式一樣。數(shù)據(jù)指針和函數(shù)指針都是遠(yuǎn)指針C語(yǔ)言中的幾個(gè)重要概念計(jì)算機(jī)考試。靜態(tài)數(shù)據(jù)的總量不得超過(guò)64K。
7.巨模式編譯時(shí)段的使用情況
來(lái)自不同源文件的代碼放在不同的段內(nèi),來(lái)自不同源文件的靜態(tài)數(shù)據(jù)也放在不同的段內(nèi),只有堆棧是合在一起的。
8.運(yùn)行庫(kù)函數(shù)分配的內(nèi)存:
常規(guī)內(nèi)存區(qū)
遠(yuǎn)堆(數(shù)據(jù)段之外) 用_fmalloc()分配,得到32位指針
├─────────┤
64│堆(未使用的內(nèi)存)│用malloc()分配,得到16位的位移地址
KB├─────────┤
數(shù)│棧(局部變量)│
據(jù)├─────────┤
段│全局和靜態(tài)變量│
├─────────┤
七、用C語(yǔ)言寫(xiě)中斷服務(wù)程序(如果中斷服務(wù)程序不牽涉到中斷鏈以及 DOS和其本身的重入問(wèn)題。) ---Turbo C
1.函數(shù)類(lèi)型為interrupt 的中斷服務(wù)程序定義如下:
#include
void interrupt 函數(shù)名(bp,di,si,ds,es,dx,cx,bx,ax,ip,cs,flags);
unsigned int bp,di,si,ds,es,dx,cx,bx,ax,ip,cs,flags;
2.得先保留原中斷函數(shù)地址
void interrupt (*保留函數(shù)名)( );
保留函數(shù)名=getvect(0x中斷號(hào));
3.在main函數(shù)中用自定義的中斷服務(wù)程序替換原來(lái)的程序
setvect(0x中斷號(hào),函數(shù)名);
4.在main函數(shù)中激活自定義的中斷服務(wù)程序
(1)先設(shè)置要用到的寄存器的值(用偽變量),
(2)geninterrupt(0x中斷號(hào));
若替換的是計(jì)時(shí)中斷程序,因PC機(jī)內(nèi)的計(jì)時(shí)器每秒產(chǎn)生18.2次中斷,則每秒自動(dòng)執(zhí)行18.2次新的中斷程序。
5.事后得將原中斷函數(shù)地址裝回向量表中
setvect(0x中斷號(hào),保留函數(shù)名);
【C語(yǔ)言中的重要概念有哪些】相關(guān)文章:
C語(yǔ)言中的幾個(gè)重要概念12-04
C語(yǔ)言中函數(shù)的區(qū)分有哪些04-27
C語(yǔ)言中指針的概念03-16
C語(yǔ)言中各種類(lèi)型的指針的概念總結(jié)11-24
C語(yǔ)言中void有什么作用03-15
C語(yǔ)言的缺點(diǎn)有哪些12-04
C語(yǔ)言中volatile的含義12-03
C 語(yǔ)言中宏的使用12-03
C語(yǔ)言中的鏈接編寫(xiě)05-26