C語(yǔ)言重要概念![轉(zhuǎn)貼]
阿擺 發(fā)表于 2006-1-12 17:14:00
?。谜Z(yǔ)言的重要概念
一、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ù)的指針。
(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)??捎糜谌我饩幾g模式。每次使用遠(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))。
(3)巨指針(huge)
巨指針為32位指針,指針的段地址和偏移量都在指針內(nèi)??捎糜谌我饩幾g模式。遠(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.用戶(hù)自定義函數(shù)格式
類(lèi)型 函數(shù)名(形式參數(shù)表)
參數(shù)說(shuō)明
{
……
}
2.函數(shù)的調(diào)用方式
(1)傳值方式
?、賯鹘o被調(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)的變量為形參。
?。?)傳址方式
?、賯鹘o被調(diào)用函數(shù)的是變量的地址。被調(diào)用函數(shù)得定義指針變量為形參。
?、趥鹘o被調(diào)用函數(shù)的是數(shù)組的地址即數(shù)組名。被調(diào)用的函數(shù)得定義數(shù)組或指針變量為形參。
?、蹅鹘o被調(diào)用函數(shù)的是函數(shù)的地址即函數(shù)名稱(chēng)。被調(diào)用函數(shù)得定義指向函數(shù)的指針變量為形參。
④傳給被調(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型。