下載本文檔
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領
文檔簡介
1、2020/8/24,華中科技大學計算機學院,1,9.1 指針的概念與指針的使用,9.1.1 指針的概念 數(shù)據(jù)(變量、常量)(根據(jù)類型)占有一定數(shù)目的連續(xù)存儲單元; 數(shù)據(jù)的連續(xù)存儲單元首地址稱為數(shù)據(jù)的地址。 變量的地址稱為指針,存放地址數(shù)據(jù)的變量稱為指針變量。 指針也是一種變量,也要占用一定的內(nèi)存單元。指針的特殊之處在于它存放的是另一個變量所占存儲單元的起始地址。,2020/8/24,華中科技大學計算機學院,2,指針變量的類型由其基類型決定,基類型是指針變量所指(即所指向)變量的數(shù)據(jù)類型。因此,稱指向某種類型變量的指針為該類型的指針。 如:指向整型變量的指針稱為整型指針,指向字符型變量的指針稱為
2、字符指針等。,指針變量的類型,2020/8/24,華中科技大學計算機學院,3,ptr指向x,如果整型變量x的地址是0 xFEC0,x的值是0 xABCD,整型指針ptr的地址是0 xFEBC,整型指針ptr指向整型變量x的內(nèi)存存儲和指向情況可以由下圖描述:,2020/8/24,華中科技大學計算機學院,4,9.1.2 指針的聲明,聲明指針的一般形式: T *標識符1,*標識符2,, *標識符n; 其中,T是數(shù)據(jù)類型。*是指針說明符,用于將其說明的標識符說明為指針類型。標識符1,標識符2,標識符n, 例9.1:char *pc1,*pc2; int *pi; float *pf;,2020/8/2
3、4,華中科技大學計算機學院,5,指針變量也可以在聲明的時候?qū)ζ溥M行初始化,但必須用所指變量的地址進行初始化。初始化后的指針將指向以初值為地址的變量。 例9.2 聲明指針并初始化。 int x=10,*p=,2020/8/24,華中科技大學計算機學院,6,例9.3 給出以下一些復雜聲明,解釋其含義。,int (*p1)3; double *p25; char (*fp)(int,int); int *pf(float a); int (*fp_ary2)(char *,int *);,2020/8/24,華中科技大學計算機學院,7,9.1.3 指針的使用,在聲明指針變量的前提下,指針的使用首先要
4、獲取變量的地址作為指針值,然后要將該指針值賦給指針變量,建立指針變量與被指變量間的指向關系。接下來就是如何通過指針變量來間接訪問和操作指針所指的變量。,2020/8/24,華中科技大學計算機學院,8,1. 取地址運算符-單目語句來說明p是一個整型指針變量時,p的值是不確定的隨機值。此時稱p為懸掛指針。,2020/8/24,華中科技大學計算機學院,10,例9.5 設有下面說明: int i,*pi; char c,*pc; float x5,*pf; 則: pi=合法有效。,2020/8/24,華中科技大學計算機學院,11,3. 間訪運算符單目* 聲明指針的目的是希望通過指針實現(xiàn)對內(nèi)存中變量的快
5、速訪問,必須使用單目*這個間訪運算符才能實現(xiàn)利用指針對內(nèi)存變量的訪問。間訪的含義是間接訪問。單目*運算實際上是單目 int *px=,2020/8/24,華中科技大學計算機學院,16,px+=3; printf(after px plus 3:n); printf(px=%p *px=%dn,px,*px); px-=2; printf(after px minus 2:n); printf(px=%p *px=%dn,px,*px); printf(*(+px)=%dn,*(+px); printf(px=%p *px=%dn,px,*px); printf(*(px+)=%dn,*(px+
6、); printf(px=%p *px=%dn,px,*px); printf(*(-px)=%dn,*(-px); printf(px=%p *px=%dn,px,*px); printf(*(px-)=%dn,*(px-); printf(px=%p *px=%dn,px,*px); ,2020/8/24,華中科技大學計算機學院,17,9.2.2 指針的賦值運算和關系運算 1. 指針的賦值運算 指針的初始化和基本賦值操作前面已有敘述。下面主要進行一些歸納并給出應用的例子,其中利用指針的賦值運算以及類型強制來突破語言的一些制約因素的編程算法和思想可以在底層軟件開發(fā)時借鑒,達到匯編級別開發(fā)的自
7、由度。,2020/8/24,華中科技大學計算機學院,18,指針的賦值運算規(guī)則: (1) 同類型的指針才可以直接使用賦值操作符進行賦值操作。如: int a3=1,2,3,*p=a,*q=p; (2) 如果要實現(xiàn)不同基本類型指針之間的賦值運算,必須使用類型強制。利用指針的賦值運算以及類型強制可以實現(xiàn)一些特殊操作。,2020/8/24,華中科技大學計算機學院,19,例9.11 一個長整型數(shù)占4個字節(jié),其中每個字節(jié)又分成高4位和低4位。試從長整型數(shù)的低字節(jié)開始,依次取出每個字節(jié)的高4位和低4位并以ASCII碼的形式進行顯示。,#include stdio.h void main(void) long
8、 x=0 x1234ABCD,k; char *p=(char *) ,2020/8/24,華中科技大學計算機學院,20,2 指針的關系運算 指針的關系運算指對指針施行諸如:,=,以及!=這樣一些比較操作。指針屬于一種派生類型,它究竟屬于何種類型的指針要受所指變量的類型,也就是指針的基類型的限制。由于不同類型的變量在內(nèi)存中分配的存儲不同;并且對于不同的數(shù)據(jù)類型,定義于其上的操作和運算也不盡相同。因此,盡管所有指針的值都是二進制正整數(shù),從關系運算的操作語義上看,允許不同類型的指針進行比較沒有實際意義,并且只會給語言和程序帶來副作用。因此,C語言規(guī)定指針的關系運算只能限于同類型指針,不同類型指針之
9、間的關系運算被視為非法操作。,2020/8/24,華中科技大學計算機學院,21,9.3 指針作為函數(shù)的參數(shù),9.3.1 形參指針對實參變量的影響 例9.12 被調(diào)用函數(shù)中對形參的修改無法影響調(diào)用函數(shù)中實參變量的值舉例。 #include stdio.h void swap(int u,int v) int t; printf(in function swap, before swap,u=%d and v=%dn,u,v); t=u;u=v;v=t; printf(in function swap, after swap,u=%d and v=%dn,u,v); ,2020/8/24,華中科技
10、大學計算機學院,22,void main(void) int x,y; printf(input two integers for x and y please!n); scanf(%d%d, ,2020/8/24,華中科技大學計算機學院,23,程序運行中的輸入以及運行結(jié)果為: input two integers for x and y please! 10 20(鍵盤輸入) in function main, before swap,x=10 and y=20 in function swap, before swap,u=10 and v=20 in function swap, aft
11、er swap,u=20 and v=10 in function main, after swap,x=10 and y=20,2020/8/24,華中科技大學計算機學院,24,例9.13 以指針作為函數(shù)的參數(shù)實現(xiàn)變量值的交換。 #include stdio.h void swap(int *p1,int *p2) int t; t=*p1;*p1=*p2;*p2=t; ,2020/8/24,華中科技大學計算機學院,25,void main(void) int x,y; printf(input two integers for x and y please!n); scanf(%d%d,
12、,2020/8/24,華中科技大學計算機學院,26,程序運行中的輸入以及運行結(jié)果為: input two integers for x and y please! 12 45 before swap,x=12 and y=45 after swap,x=45 and y=12,2020/8/24,華中科技大學計算機學院,27,對于數(shù)組,由于數(shù)組名標識的數(shù)組的起始地址,故可直接作為指針類型的實參;除此之外,都必須以 各元素的訪問方式: x0、x1、x2、x3、x4 *(x+0)、*(x+1)、*(x+2)、*(x+3)、*(x+4) 各元素的指針: void shift(int *a,int n
13、) int k,len,sft; len=N-1-n; /* 數(shù)據(jù)的長度 */ sft=N-len; /* 右對齊移位的位數(shù) */ for(k=0;klen;k+) /* 右對齊移位 */ *(a+k)=*(a+k+sft); for(k=len;kN;k+) /* 右對齊移位的位數(shù) */ *(a+k)=0; /* 對沒有存放數(shù)據(jù)的位填充零 */ ,2020/8/24,華中科技大學計算機學院,31,void main(void) int xN,yN,zN+1,i,carry=0,flag; for(i=0;i=0 /* 數(shù)據(jù)長度小于N,右對齊移位 */,2020/8/24,華中科技大學計算機學
14、院,32,for(i=0;i=0;i-) /* 輸出結(jié)果。和中的前導字符0不輸出 */ if(flag=0 ,2020/8/24,華中科技大學計算機學院,33,2以指針變量為數(shù)組首地址時一維數(shù)組的指針表示,一般的,為了用指針變量表示數(shù)組中的元素,應該先聲明一個數(shù)組,再聲明一個與數(shù)組名類型相同的指針變量,然后通過初始化或者賦值操作使指針變量值向數(shù)組中的元素。這樣就可以指針變量來快速訪問數(shù)組中的其他元素。 例如,先聲明指針變量, 然后通過賦值語句將數(shù)組的起始地址賦給指針變量,使指針變量指向數(shù)組中下標為0的元素。 int a6,*p; p=a;或者p= 一般地,此時稱指針變量p指向數(shù)組a。,2020
15、/8/24,華中科技大學計算機學院,34,例9.16 顯示輸出指向數(shù)組a的指針變量p的地址、值,數(shù)組名a的值,a0的地址。數(shù)組a中每個元素的地址和值,以及p依次指向數(shù)組中各個元素時的取值和所指元素的值。,#include stdio.h void main(void) int i,a5=1,2,3,4,5,*p=a; printf(address of p is %pn, ,2020/8/24,華中科技大學計算機學院,35,3. 指向數(shù)組元素的指針變量的運算操作,指向數(shù)組的指針變量的運算操作可以分為三類。 一是對指針變量或由指針變量組成的地址表達式進行運算,目的是快速定位到數(shù)組中的指定元素。
16、二是間訪操作,即訪問指針變量或由指針變量組成的地址表達式所指向的數(shù)組元素。 三是對間訪后的數(shù)組元素施行運算。 這些運算中往往涉及+和*操作,+和*操作在C中位于第二優(yōu)先級,結(jié)合性是右結(jié)合,當兩者同時出現(xiàn)的時候需要嚴格通過結(jié)合性來進行分析判斷。,2020/8/24,華中科技大學計算機學院,36,設有說明:char s20,*pc;對于字符指針pc,下面的操作合法:,pc=s對字符指針變量pc賦值,使其指向字符數(shù)組s(即s0). pc+i 結(jié)果為pc后面第i個元素的地址。 *(pc+i) 結(jié)果為pc后面第i個元素。 *+pc 結(jié)果為pc加1之后所指元素。 +*pc 結(jié)果為pc所指元素加1。 *pc
17、+ 結(jié)果為pc所指元素,然后pc加1。 (*pc)+ 結(jié)果為pc所指元素,然后pc所指元素加1。 void main(void) double xSIZE,ySIZE,*px,*py; for(px=x;pxx+SIZE;px+) /* x+SIZE是元素xSIZE的地址 */ scanf(%lf,px); getchar(); for(py=y;py ,2020/8/24,華中科技大學計算機學院,40,9.4.3 用指向數(shù)組基本元素的指針表示多維數(shù)組 用指向數(shù)組基本元素的指針變量訪問數(shù)組元素指:如果數(shù)組基本元素的數(shù)據(jù)類型為T,則指向數(shù)組基本元素的指針的數(shù)據(jù)類型為T *。一旦該指針指向了一個對
18、應數(shù)組的元素,就可以象用數(shù)組名一樣來用該指針來表示數(shù)組元素。同時對該指針還可以施行運算,使它指向數(shù)組中的其它元素。 對于二維整型數(shù)組uMN,設有聲明:int *p= 則其vijk元的地址可以寫成(p+i*M*N+j*N+k)。而用指針p間訪其uij元的形式為: *(p+i*M*N+j*N+k)。,2020/8/24,華中科技大學計算機學院,41,例9.18 用指向數(shù)組基本元素的指針變量實現(xiàn)三維數(shù)組元素的輸入和輸出。,#include stdio.h #define I 2 #define J 3 #define K 4 void main(void) int vIJK,*p,n=1; int
19、i,j,k; p= ,2020/8/24,華中科技大學計算機學院,42,9.5 指針數(shù)組,9.5.1 指針數(shù)組的聲明及使用 1. 指針數(shù)組的聲明 聲明指針數(shù)組的一般形式是: cv T * cv 標識符常量表達式=初值表; 其中,T是數(shù)據(jù)類型,表示數(shù)組元素為T類型的指針,可以指向T類型的變量。cv是const、volatile或者const volatile,它是可選項。標識符是指針數(shù)組名。常量表達式是指針數(shù)組的大小?!?初值表”是可選項,用于初始化指針數(shù)組。,2020/8/24,華中科技大學計算機學院,43,char *pstr2=123,456; 該聲明語句說明pstr是一個有2個元素的字符
20、指針數(shù)組。其中,p0指向字符串123,p1指向字符串456,p0和p1的類型都是char *。例如聲明語句: const int x=1,y=2; const int *ps2; ps0= 它說明p是一個指向常量字符串的字符型常量指針數(shù)組。此時,p的元素本身不能修改,p的元素所指對象也不能修改。,2020/8/24,華中科技大學計算機學院,44,例9.19 理解指針數(shù)組含義的編程舉例。,#include stdio.h void main(void) int x=1,y=2,z=3,i; int *p3; p0= ,2020/8/24,華中科技大學計算機學院,45,2.指針數(shù)組的使用 1)指針
21、數(shù)組元素的引用 指針數(shù)組的引用指對指針數(shù)組中元素的引用。對指針數(shù)組中元素可以進行同類型指針允許的全部操作。對指針數(shù)組中的元素可以賦值、間訪、以及施行指針運算。例如: int a=1,2,3,b=4,5,6,*p2; 則可:p0=a; p1=b; *p0=12; +*p1;*p1+ 2)指針數(shù)組要先賦值,后使用 適當選擇解釋p279 例9.20-例9.23,2020/8/24,華中科技大學計算機學院,46,9.5.2 多重指針 指針p由于占用存儲單元而有自己地址,因此也可以被另外的指針pp指向。同時,指針pp同樣可以被另一個指針ppp所指向。這樣就形成了多重指針的概念。如果p是指向T類型變量的指
22、針,則p的地址或存儲p的地址的變量pp被稱為T類型的雙重指針或T類型的二級指針。類似,ppp則被稱為T類型的三重指針或T類型的三級指針。一般的,在重數(shù)大于1的情況下,n重指針就是以n-1重指針變量的地址為其值的指針變量。,2020/8/24,華中科技大學計算機學院,47,聲明一個T類型的n重指針的一般形式為: T *p; “*”表示有n顆“*”,p是T類型的n重指針。 void main(void) int x=12345,*p= ,2020/8/24,華中科技大學計算機學院,48,*9.6 帶參數(shù)的main函數(shù),9.6.1 命令行參數(shù) 命令行參數(shù)(command-line arguments
23、)指在操作系統(tǒng)環(huán)境下執(zhí)行一個程序時所提供的參數(shù)。 例如在DOS環(huán)境下的c:copy abc.txt def.txt就是一個命令行 聲明具有命令行參數(shù)的main函數(shù)的一般形式是: 類型 main(int argc,char *argv) /函數(shù)體 ,2020/8/24,華中科技大學計算機學院,49,例9.26 回顯命令行參數(shù)并顯示命令行參數(shù)個數(shù)的程序?qū)嵗?#include stdio.h void main(int argc, char* argv) int n=0; while(nargc) printf(“%s”, argvn); (nargc-1)?printf( ):printf(“n
24、”); n+; printf(the number of command-line arguments are %dn,argc); getchar(); 視情況介紹例9.27,例9.28,2020/8/24,華中科技大學計算機學院,50,設編譯連接之后,可執(zhí)行程序的名字為show C: show I like C programming.,顯示: show I like C+ programming. the number of command-line arguments are 5,2020/8/24,華中科技大學計算機學院,51,9.7 函數(shù)的指針,9.7.1 函數(shù)指針的聲明 聲明函數(shù)
25、指針的一般形式是: 類型 (*函數(shù)指針名)(形參表); 其中,(*函數(shù)指針名)表示括號內(nèi)的標識符是一個函數(shù)指針。類型則表示函數(shù)指針所指函數(shù)的返回類型,形參表表示函數(shù)指針所指函數(shù)的形式參數(shù)的類型與個數(shù)。 函數(shù)指針要通過初始化或賦值使其指向特定的函數(shù),然后才能通過函數(shù)指針來調(diào)用它所指的函數(shù)。對函數(shù)指針賦值的一般形式是: 函數(shù)指針名=函數(shù)名;,2020/8/24,華中科技大學計算機學院,52,例9.29 函數(shù)指針的應用舉例。 #include stdio.h void f1(int x) printf(function f1 is called!n); printf(x=%dn,x); void f
26、2(int x,int y) printf(function f2 is called!n); printf(x=%dty=%dn,x,y); ,2020/8/24,華中科技大學計算機學院,53,void main(void) void (*pf1)(int x); void (*pf2)(int x,int y); pf1=f1; pf2=f2; pf1(5); pf2(10,20); (*pf1)(50); (*pf2)(100,200); ,2020/8/24,華中科技大學計算機學院,54,自學部分: *9.7.2 函數(shù)指針的應用 例9.30 讀取從鍵盤輸入正文,再將正文以行為單位排序后
27、輸出。通過命令行參數(shù)-n決定排序方法。如果有命令行參數(shù)-n,則將輸入行按照數(shù)值大小進行排序;否則將按照字典順序排序。 *9.7.3 利用函數(shù)指針求開普勒方程的近似根,2020/8/24,華中科技大學計算機學院,55,9.8 指針函數(shù),在C語言中,函數(shù)返回的只能是值。這個值可以是一般的數(shù)值,也可以是某種類型的指針值。如果函數(shù)的返回值是指針類型的值,該函數(shù)稱為指針函數(shù)。 9.8.1 指針函數(shù)的聲明與定義 聲明指針函數(shù)原型的一般形式是: 類型 *函數(shù)名(形參表); 如:char * strcpy(char *t,char *s); 聲明了函數(shù)strcpy是一個字符指針函數(shù)。即:該函數(shù)的返回值是字符指
28、針。,2020/8/24,華中科技大學計算機學院,56,9.8.2 指針函數(shù)的使用 利用指針函數(shù)返回的指針,可以對返回的指針所指向的對象進行進一步的操作。如果該指針指向一個數(shù)組,實際就間接解決了函數(shù)返回多值的問題。 例9.32 查找子串的指針函數(shù)應用舉例。 #include stdio.h char *strstr(char *,char *t); void main(void) char s1=abcdefghijk,s2=fgh,*p; p=strstr(s1,s2); printf(%pt%sn, ,2020/8/24,華中科技大學計算機學院,57,char *strstr(char *
29、s,char *t) char *ps=s,*pt,*pc; while(*ps!=0) for(pt=t,pc=ps;*pt!=0 ,2020/8/24,華中科技大學計算機學院,58,*9.9 指向數(shù)組的指針,9.9.1 指向數(shù)組的指針的聲明與定義 指向數(shù)組的指針又稱為數(shù)組的指針。數(shù)組的指針是指:指針指向的是一個數(shù)組,而非指向數(shù)組中的基本元素。對于常用的整型二維數(shù)組和指針p和p1,有聲明: int u23,*p= /* 函數(shù)說明,形參說明為指向數(shù)組元素的指針*/ 以實參為數(shù)組元素的地址調(diào)用fun函數(shù): int u23,v234; fun(u0,2*3); /*u0是u00的地址 */ fun
30、(v00,2*3*4); /*v00是元素v000的地址 */ ,2020/8/24,華中科技大學計算機學院,68,以實參為指向數(shù)組元素的指針變量調(diào)用fun函數(shù): int u23,v234,*p; p= /*函數(shù)調(diào)用,p指向元v000 */ ,2020/8/24,華中科技大學計算機學院,69,2.形參為指向下一級數(shù)組的指針 形參為指向下一級數(shù)組的指針時,實參應為數(shù)組名或指向下一級數(shù)組的指針。 例如: void f1(int (*p1)3,int n); /* 指向一維數(shù)組的指針p1為形參 */ void f2(int (*p2)34,int n); /* 指向二維數(shù)組的指針p2為形參 */,2
31、020/8/24,華中科技大學計算機學院,70,以實參為數(shù)組名調(diào)用f1函數(shù)和f2函數(shù): int u23,v234; f1(u,2*3); /* 調(diào)用函數(shù)f1,數(shù)組名u作為實參 */ f2(v,2*3*4); /* 調(diào)用函數(shù)f2,數(shù)組名v作為實參 */ 以實參為指向下一級數(shù)組的指針調(diào)用f1函數(shù)和f2函數(shù): int u23,v234,(*p1)3,(*p2)34; p1=u; f1(p1,2*3); /* 以指向一維數(shù)組的指針p1為實參 */ p2=v; f2(p2,2*3*4); /*以指向二維數(shù)組的指針p2為實參 */ ,2020/8/24,華中科技大學計算機學院,71,例9.36 日期轉(zhuǎn)換問
32、題。輸入一個年、月、日表示的日期,將其轉(zhuǎn)換為該年的第幾天。如果輸入某年的第幾天,將其轉(zhuǎn)換為該年某月某日并輸出。 此題視情況講解,2020/8/24,華中科技大學計算機學院,72,*9.10 用指針編寫字符串操作函數(shù),9.10.1 字符指針與字符串 在C語言中,字符數(shù)組主要用于構(gòu)造字符串。字符串常量在存儲方面也完全與字符數(shù)組的存儲方式相同。 字符串是一維字符數(shù)組,可以用指向一維字符數(shù)組的字符指針來訪問和操縱字符串。用指針訪問字符數(shù)組元素首先需要聲明字符指針變量,通過初始化或者賦值使字符指針變量指向字符串,然后就可以通過字符指針來訪問字符串中對應的字符。程序中字符串的表示概括起來有下面幾種方法。,
33、2020/8/24,華中科技大學計算機學院,73,(1) 聲明一個字符數(shù)組并對其初始化形成字符串,通過數(shù)組名和下標引用字符串和字符。,例如: char str80=This is a string.; 其中,字符數(shù)組str占80個字節(jié),最多可存儲79個字符,必須為字符串的終結(jié)符0保留一個字節(jié)的存儲空間。字符串常量This is a string. 是初值。,2020/8/24,華中科技大學計算機學院,74,(2) 先聲明一個字符數(shù)組,調(diào)用字符串輸入函數(shù)對其賦值形成字符串,再通過數(shù)組名和下標引用字符串和字符。,例如: char str80=This is a string.; 其中,字符數(shù)組st
34、r占80個字節(jié),最多可存儲79個字符,必須為字符串的終結(jié)符0保留一個字節(jié)的存儲空間。字符串常量This is a string. 是初值。,2020/8/24,華中科技大學計算機學院,75,(3) 聲明一個字符指針變量并初始化,通過字符指針變量使用下標或間訪操作訪問字符串或字符。 如聲明: char *s=This is a string.; 字符指針變量s(簡稱字符指針),再用字符串This is a string. 的起始地址,即字符T的地址初始化s,使s指向字符在內(nèi)存中連續(xù)存放的This is a string.字符串。 通過s2=a;*(s+3)=t;則將字符串改為That is a
35、string.。因此,一旦字符指針s指向了字符串,s就可以象數(shù)組名一樣的使用,用來訪問和操縱它所指向的字符串。,2020/8/24,華中科技大學計算機學院,76,(4) 聲明一個字符數(shù)組和一個字符指針變量,并使字符指針指向字符數(shù)組。此時既可以通過數(shù)組名和下標,也可以通過字符指針、下標或間訪操作符*來實現(xiàn)對字符串或字符的訪問和操縱。如聲明: char str80,*ps=str; 它先說明了有80個字節(jié)的字符數(shù)組str,接著說明一個字符指針變量ps,并且用字符數(shù)組的起始地址str(數(shù)組名就是數(shù)組的起始地址)對其進行初始化,使ps指向字符數(shù)組str。,2020/8/24,華中科技大學計算機學院,7
36、7,9.10.2 字符串函數(shù)的實現(xiàn),下面根據(jù)ISO/IEC 9899:1999(E)中頭文件string.h中關于字符串函數(shù)規(guī)定來實現(xiàn)常用的字符串函數(shù);然后將它們做成為自己的庫文件mystring.lib,使得在其他程序中可以直接使用這些函數(shù)。同時,通過這種方法,也可以使自己寫的代碼供他人使用。 1.解釋p303 頭文件mystring.h 2.解釋p304-p306各字符串操作函數(shù).(函數(shù)strtok的編寫自學 ),2020/8/24,華中科技大學計算機學院,78,*9.11 用typedef定義類型表達式,9.11.1 類型表達式 總的來看,C語言中的表達式可以分成兩類。一類是可求值表達式
37、,可以稱為值表達式,它的基本特征是可以被CPU處理和計算。值進一步又可以分為左值和右值,地址是左值的特征之一,但僅僅是形成左值的必要條件,數(shù)組名就是一個典型的例子,它雖然表征數(shù)組的首地址,但是卻不能被賦值。左值的另外一個特征是必須在內(nèi)存中分配有內(nèi)存單元,這樣才能夠被賦值。,2020/8/24,華中科技大學計算機學院,79,C中另外一類表達式就是類型表達式。類型表達式是由類型說明符和數(shù)據(jù)類型名所組成的式子??捎糜陬愋捅磉_式的類型說明符有:()、*。類型說明符()用于說明函數(shù)以及改變解釋的優(yōu)先級;類型說明符用于說明數(shù)組;類型說明符*用于說明指針。數(shù)據(jù)類型名也可以分為兩類,一類是基本數(shù)據(jù)類型名,如:
38、int,char,double等等。另一類是構(gòu)造類型名,如枚舉類型,以及第10章中介紹的結(jié)構(gòu)類型,聯(lián)合類型等。,2020/8/24,華中科技大學計算機學院,80,在解釋復雜聲明時,類型說明符和數(shù)據(jù)類型名要按照表9.2中優(yōu)先級與結(jié)合性所規(guī)定的先后順序進行解釋。,2020/8/24,華中科技大學計算機學院,81,9.11.2 用typedef定義類型表達式 類型表達式可以出現(xiàn)在兩個地方,一是出現(xiàn)在聲明語句中,另外是用typedef關鍵字定義的語句中。 1.在聲明語句中出現(xiàn)的類型表達式 在聲明語句中,去掉對象標識符,剩余的部分就是一個類型表達式。例如: int *p3;去掉對象標識符p就得到: in
39、t *3; 該式子就是一個類型表達式。,2020/8/24,華中科技大學計算機學院,82,如何解釋這個類型表達式呢?根本的法寶就是對類型說明符 ()、*以及類型說明符和數(shù)據(jù)類型名的優(yōu)先級與結(jié)合性的理解。根據(jù)優(yōu)先級與結(jié)合性可以得到下面的解釋順序: 3 * int 假設該類型表達式作用于一個標識符,則該標識符首先與優(yōu)先級最高的類型說明符作用。因此,進一步有: p 3 * int ,2020/8/24,華中科技大學計算機學院,83,由第步得:p是一個有3個元素的數(shù)組; 由第步得:p是一個有3個元素的指針數(shù)組; 由第步得:p是一個有3個元素的int類型的指針數(shù)組。 即:p數(shù)組中的每一個元素的類型都是i
40、nt *,可用于指向一個int類型的變量。,2020/8/24,華中科技大學計算機學院,84,可用于指向一個int類型的變量。設有整型變量x,y,z。以及p0=p2= 將UINT和size_t都定義成為unsigned int類型,用UINT和size_t說明的對象將都是無符號整型對象。,2020/8/24,華中科技大學計算機學院,86,對于復雜的類型表達式,標識符往往出現(xiàn)在類型表達式中間,暫且稱這種含標識符和類型表達式的式子為類型定義表達式,則用typedef定義類型的一般形式是: typedef 類型定義表達式; 該語句的功能是用類型定義表達式中的標識符為類型表達式命名。例如: typed
41、ef char *(*p_to_fun)(char * ,char *); char *(*p_to_fun)(char * ,char *)是類型定義表達式. char *(*)(char * ,char *)是類型表達式. p_to_fun是該類型表達式的名字.,2020/8/24,華中科技大學計算機學院,87,p_to_fun可以用于說明一個函數(shù)指針,且該函數(shù)指針所指函數(shù)是一個有兩個字符指針形參的字符指針函數(shù)。例如: p_to_fun ptof; 則該語句與 char *(* ptof)(char *,char *);等價。 由于strstr函數(shù)的函數(shù)原型是char *strstr(ch
42、ar *s,char *t);因此可以對ptof作如下賦值: ptof = strstr; 此時,指針ptof指向strstr函數(shù)。 設有char s1=University,s2=sit;,則用表達式ptof(s1,s2)或(*ptof)(s1,s2)就可以調(diào)用strstr函數(shù)。,2020/8/24,華中科技大學計算機學院,88,又例如: typedef int *(*Array10)(int *);,則Array代表類型表達式int *(*10)(int *)。 聲明語句:Array ptof_ary; 與聲明int * (*ptof_ary10)(int *);等價。 值得注意的是: A
43、rray是類型表達式int *(*10)(int *)名字,它代表數(shù)據(jù)類型int *(*10)(int *),并且可以用來說明其他標識符。 而ptof_ary則是有10個元素的函數(shù)指針數(shù)組,即每個元素都是一個函數(shù)指針,所指函數(shù)有一個int *的形參且返回類型是int *。,2020/8/24,華中科技大學計算機學院,89,在類型表達式中,*、和()可以有多個,也允許嵌套。但要遵守以下規(guī)則: (1)數(shù)組的元素不能是函數(shù),但可以是函數(shù)的指針。 (2)函數(shù)的返回值不能是數(shù)組或函數(shù),但可以是指向數(shù)組的指針或指向函數(shù)的指針。,2020/8/24,華中科技大學計算機學院,90,*9.12 復雜說明的解釋,先看下面的聲明語句: char *(*(*f(char *(*)(int)2)(); 首先根據(jù)優(yōu)先級和結(jié)合性可以得到聲明語句的解釋順序如下: f (char *(*)(int)*2*( )char * 第步 f是一個函數(shù);f函數(shù)的形參為一個函數(shù)指針,該函數(shù)指針所指函數(shù)有一
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 古代婢女考核制度
- 企管考核制度
- 商務部考核制度
- 杉樹支教考核制度
- 學科組考核制度
- 申請考核制度
- 實 驗考核制度
- 韶鋼考核制度
- 物業(yè)外圍考核制度
- 授課考核制度
- 金太陽陜西省2028屆高一上學期10月月考物理(26-55A)(含答案)
- GB/T 18711-2025選煤用磁鐵礦粉試驗方法
- 2025年青海省事業(yè)單位招聘考試教師物理學科專業(yè)知識試卷解析
- 成都城投集團招聘筆試試題
- 2025年安全生產(chǎn)知識教育培訓考試試題及標準答案
- 企業(yè)安全費用可用于安全生產(chǎn)檢查
- 2025年廣西壯族自治區(qū)中央遴選真題及參考答案(b類)
- 品牌管理指南的建模指南
- 氣動安全知識培訓課件
- 境外傭金管理辦法
- 采購違規(guī)管理辦法
評論
0/150
提交評論