亚洲精品中文字幕无乱码_久久亚洲精品无码AV大片_最新国产免费Av网址_国产精品3级片

C語(yǔ)言

C語(yǔ)言中的重要概念有哪些

時(shí)間:2024-08-24 03:04:42 C語(yǔ)言 我要投稿
  • 相關(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