




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、第6章指針,返回總目錄,目錄,6.1指針與變量,6.2指針與數(shù)組,6.3指針與函數(shù),6.5習(xí)題六,6.4問題與解答,返回總目錄,基本要求: )熟悉指針的基本概念、指針變量的定義、引用與運(yùn)算; )熟悉“指向指針的指針”; )掌握“指針與數(shù)組”、“指針與函數(shù)”的相關(guān)操作。 學(xué)習(xí)重點: )指針的概念、“指針與數(shù)組”、“指針與函數(shù)”的相關(guān)操作。 ;,6.1指針與變量,6.1.0 引言,返回目錄,學(xué)習(xí)C語言, 如果你不能用指針編寫有效、正確而靈活的程序, 可以認(rèn)為你沒有學(xué)好C語言。地址、指針、數(shù)組及其相互關(guān)系是C語言中最具特色的部分。規(guī)范地使用指針, 可以使程序更加簡潔明了, 因此, 我們要學(xué)會在各種情
2、況下正確地使用指針。,地址的概念與取地址運(yùn)算,內(nèi)存按字節(jié)編址,每個字節(jié)單元都有一個地址。 程序中定義的任何變量,在編譯時都會在內(nèi)存中分配一個確定的地址單元。 我們怎樣知道機(jī)器將某種數(shù)據(jù)放在內(nèi)存的什么地方呢?可用求地址運(yùn)算符 看出其地址。注意,這個地址并不是始終不變的,這是由系統(tǒng)來安排的,我們無法預(yù)先知道。,6.1指針與變量,6.1.1 指針的基本概念,地址的概念與取地址運(yùn)算,6.1指針與變量,6.1.1 指針的基本概念,C語言規(guī)定:如果變量占用連續(xù)的多個字節(jié),則第一個字節(jié)的地址就是該變量的地址。例如定義: shorta=10; floatb=10; 則編譯系統(tǒng)給變量分配的內(nèi)存空間如圖6.1所示
3、。 從圖6.1中可以看出,變量a的內(nèi)存地址為2000,而變量b的內(nèi)存地址為2002。,地址的概念與取地址運(yùn)算,6.1指針與變量,6.1.1 指針的基本概念,程序在引用變量時,首先獲得變量的地址,這還只是變量的首地址,然后還要根據(jù)變量的數(shù)據(jù)類型決定要從首地址開始連續(xù)取幾個字節(jié)來獲取變量的值。 若定義如圖6.1,現(xiàn)程序要獲取變量b的值,則先確定變量首地址為2002,然后由變量b的數(shù)據(jù)類型float知變量占4個字節(jié),所以從首地址開始連續(xù)取4個字節(jié)的數(shù)據(jù)即為變量b的值。,指針與變量,6.1指針與變量,6.1.1 指針的基本概念,使用一個變量可以直接通過變量名,這種方式稱為“直接存取方式”。 還可以將變
4、量的地址存入另一“特殊”變量中,然后就可以通過該“特殊”變量來存取變量的值,這種存取變量的方式稱為“間接存取方式”。而存放地址的變量就好像存放了一個指針,指向要存取值的變量,故稱為“指針變量”??赏暾胤Q為“指向變量的指針變量”。,指針與變量,6.1指針與變量,6.1.1 指針的基本概念,指針:一個變量的地址 指針變量:專門存放變量地址的變量叫,2000,指針,指針變量,變量的內(nèi)容,變量的地址,指針變量的定義,6.1指針與變量,6.1.2 指針變量的定義與引用,指針變量也是變量,在使用之前必須先定義。定義時也可對其賦初值。指針變量的定義格式為: 類型說明符 *指針變量名=初值; 例如: int
5、 *p; 定義一個指針變量p,p指向的變量的數(shù)據(jù)類型為“整型(int)”。,指針變量的定義,6.1指針與變量,6.1.2 指針變量的定義與引用,在定義指針變量時,應(yīng)注意以下幾點: (1)類型說明符表示該指針變量所指向的變量的數(shù)據(jù)類型。如int、float、double、char等。 (2)定義指針變量時,指針變量名前必須有一個“*”號, 表示定義的變量是指針變量。 (3)指針變量在定義時允許對其賦初值。如: inta=8; int *p= 需要特別指出的是:這里是用 -直接訪問,10,例 *p=20; -間接訪問,20,6.1指針與變量,指針變量的引用,6.1.2 指針變量的定義與引用,6.1
6、指針與變量,指針變量的引用,6.1.2 指針變量的定義與引用,6.1指針與變量,指針移動(和整型表達(dá)式進(jìn)行運(yùn)算),6.1.3 指針的運(yùn)算,在使用指針過程中,通過移動指針(P)來實現(xiàn)對不同數(shù)據(jù)單元的訪問操作。對不同的類型,移動的單位長度不同。單位長度一般是指針?biāo)赶虻淖兞康臄?shù)據(jù)類型長度。下面是指針參與運(yùn)算時實現(xiàn)指針移動的三種常用表達(dá)式格式: 格式一:P=P+n;(或P=P- n;) 格式二:P+;(或P- - ;) 格式三:+P;(或 - -P;) 其中,n是一個整數(shù),也可以是一個整型表達(dá)式。格式一的作用是使指針P向前(或向后)移動n個單位長度;而格式二和格式三的作用都是使指針P向前(或向后)移
7、動1個單位長度。,6.1指針與變量,指針移動(和整型表達(dá)式進(jìn)行運(yùn)算),6.1.3 指針的運(yùn)算,例如定義: shorta10, b20, *p= 之后,指針變量p的值不是2000+1=2001,而是2000+2=2002。,6.1指針與變量,指針賦值,6.1.3 指針的運(yùn)算,將一個指針變量的值賦給另一個指針變量。結(jié)果是兩個指針指向同一個地址單元。 例如,inta=10,*p, *q; p = 則指針變量p和q的值都是變量a的地址,也就是說,指針變量p和q指向了同一個變量a,如圖6.6所示。,6.1指針與變量,6.1.3 指針的運(yùn)算,例6.1寫出下面程序的運(yùn)行結(jié)果。 #include main()
8、 int a=10; int *p,*q; p= ,6.1指針與變量,6.1.3 指針的運(yùn)算,本程序的一次運(yùn)行結(jié)果如下: 指針p的值為p=fff4(是個地址) 指針p所指向的變量的值為*p=10 指針p的值賦給指針q后,指針q的值為q=fff4 指針p的值賦給指針q后,指針q所指向的變量的值為*q=10 注意:在不同機(jī)器上運(yùn)行時給指針p分配的內(nèi)存地址是不同的。,6.1指針與變量,6.1.4 指向指針的指針,若某指針變量中存放的不是(普通)變量的地址,而是另一個指針變量的地址,則該指針變量便被稱為指向指針變量的指針變量,可以簡稱為“指向指針的指針”。 在有些C語言教材中,“指向指針的指針”常被稱
9、為“二級指針”,相應(yīng)的,指向(普通)變量的指針則被稱為“一級指針”。 事實上,如果指針變量存放的是數(shù)組的地址或函數(shù)的地址,則該指針變量便被稱為指向“數(shù)組”的指針變量或指向“函數(shù)”的指針變量。這將在后面的有關(guān)章節(jié)中進(jìn)行詳細(xì)介紹。,6.1指針與變量,6.1.4 指向指針的指針,二級指針變量的定義(及賦初值)格式為: 類型說明符 *指針變量名=初值; 定義二級指針變量時,應(yīng)注意: (1) 二級指針變量定義時前面必須有兩個“*”號,指向的變量的數(shù)據(jù)類型由“類型說明符”確定。 (2) 在定義的同時可以賦初值。初值必須是一級指針變量的地址,通常形式為“ -直接訪問,10,例 *p=20; -間接訪問,20
10、,9000,8000,變量q= -二級間接訪問,30,二級指針變量,6.1指針與變量,6.1.4 指向指針的指針,多級指針,例 三級指針 int *p; 四級指針 char *p;,多級指針的定義與引用跟二級指針相似,由于在實際應(yīng)用中很少使用,這里不作介紹。有興趣可以自己編寫相應(yīng)程序進(jìn)行驗證。,6.2指針與數(shù)組,6.2.0 引言,數(shù)組在內(nèi)存中占用連續(xù)的存儲空間,數(shù)組名代表的是數(shù)組的首地址。 可定義一個指針變量,通過賦值或函數(shù)調(diào)用參數(shù)傳遞的方式,把數(shù)組名或數(shù)組的第1個元素的地址賦值給該指針變量,該指針變量就指向了該數(shù)組首元素。 當(dāng)一個指針指向數(shù)組首元素后,對數(shù)組所有元素的訪問,既可以使用數(shù)組下標(biāo)
11、,也可以使用指針,返回目錄,6.2指針與數(shù)組,6.2.0 引言,在本節(jié)中,我們首先特別指出指向“數(shù)組元素”的指針與指向“數(shù)組“的指針這兩個概念是有區(qū)別的: 如果指針只是指向數(shù)組中的某個元素,指針移動是以元素為單位,則該指針便屬于指向“數(shù)組元素”的指針; 而如果指針指向的是某個數(shù)組,指針移動是以數(shù)組為單位的,則該指針便屬于指向“數(shù)組”的指針,6.2指針與數(shù)組,6.2.1 指向數(shù)組元素的指針,可以定義一個指針變量,讓這個指針變量存儲數(shù)組中某個“數(shù)組元素”的地址,則該指針便指向該“數(shù)組元素”。然后通過該指針變量便可對數(shù)組中元素進(jìn)行各種操作。,6.2指針與數(shù)組,6.2.1 指向數(shù)組元素的指針,(1)在
12、定義的同時為指針變量賦初值 例如: inta10; int*p = ,1. 使指針變量指向“數(shù)組元素”的方法,6.2指針與數(shù)組,6.2.1 指向數(shù)組元素的指針,(2)在程序的執(zhí)行語句部分為指針變量賦值 例如: inta10,b25; int *p, *q; p = ,1. 使指針變量指向“數(shù)組元素”的方法,6.2指針與數(shù)組,6.2.1 指向數(shù)組元素的指針,注意:定義指向數(shù)組元素的指針變量,其指針類型應(yīng)與數(shù)組元素類型相同。 例如定義: floata10; int*p = 中的第二個語句就是錯誤的,因為定義的指針p是一個整型指針,它是指向整型數(shù)據(jù)的,而數(shù)組元素是實型數(shù)據(jù),類型不相同。編譯時雖然只會
13、出現(xiàn)“warning C4133: initializing : incompatible types - from float * to int * ”之類的警告信息,但執(zhí)行結(jié)果卻是錯誤的。所以使用時千萬要小心。,1. 使指針變量指向“數(shù)組元素”的方法,6.2指針與數(shù)組,6.2.1 指向數(shù)組元素的指針,當(dāng)指針p指向一維數(shù)組中某個元素后,可以用指針p訪問一維數(shù)組的所有元素。,2. 通過指針引用一維數(shù)組元素,6.2指針與數(shù)組,6.2.1 指向數(shù)組元素的指針,(1) 指向一維數(shù)組首元素的指針 假設(shè)指針p指向一維數(shù)組a的第1個元素a0,則: p+1:使p指向下一個元素a1。 p+i:使p指向元素ai
14、。,2. 通過指針引用一維數(shù)組元素,注意: p+1不是將p值簡單加1。如果數(shù)組元素是短整型(short int),p+1表示p的地址加2;如果數(shù)組元素是實型(float),p+1表示p的地址加4;如果數(shù)組元素是字符型,p+1表示p的地址加1。 可以使用*(p+i)訪問元素ai。 因為p和a都表示數(shù)組首地址,所以p+i也可以記作a+i。指向元素ai。 指向數(shù)組的指針變量也可以帶下標(biāo),如,pi與*(p+i)和*(a+i)等價,表示元素ai。,6.2指針與數(shù)組,6.2.1 指向數(shù)組元素的指針,2. 通過指針引用一維數(shù)組元素,6.2指針與數(shù)組,6.2.1 指向數(shù)組元素的指針,例如:定義 inta5,
15、*p; p=a; 或 p= 后,可通過指針引用數(shù)組元素,如圖6.10所示。 由上可知:當(dāng)指針變量p指向一維數(shù)組a的第一個元素a0以后,數(shù)組的第i+1個數(shù)組元素ai有如下四種寫法: ai pi *(a+i) *(p+i) ai的地址也對應(yīng)有四種寫法: p= 后,可通過指針引用數(shù)組元素,如圖6.11所示。 由上可知:當(dāng)指針變量p指向一維數(shù)組a的第3個元素a2以后,數(shù)組的第i+1個數(shù)組元素ai有如下四種寫法: ai pi-2 *(a+i) *(p+i-2) ai的地址也對應(yīng)有四種寫法: char str120,str220=How are you!; for(i=0;(str1i=str2i)!=0
16、;i+); puts(str1); ,例6.2字符串復(fù)制:實現(xiàn)將字符數(shù)組str2中的字符串復(fù)制到字符數(shù)組str1中。,6.2指針與數(shù)組,6.2.1 指向數(shù)組元素的指針,例6.2字符串復(fù)制:實現(xiàn)將字符數(shù)組str2中的字符串復(fù)制到字符數(shù)組str1中。,方法二:用指針名接下標(biāo)來訪問數(shù)組元素。 #include main( ) int i; char str120,str220=How are you!; char *p1=str1,*p2=str2; for(i=0;(p1i=p2i)!=0;i+); puts(str1); ,6.2指針與數(shù)組,6.2.1 指向數(shù)組元素的指針,例6.2字符串復(fù)制:實
17、現(xiàn)將字符數(shù)組str2中的字符串復(fù)制到字符數(shù)組str1中。,方法三:用指針名加偏移量計算出的地址來訪問數(shù)組元素。 #include main( ) int i; char str120,str220=How are you!; char *p1=str1,*p2=str2; for(i=0;(*(p1+i)=*(p2+i)!=0;i+); puts(str1); ,6.2指針與數(shù)組,6.2.1 指向數(shù)組元素的指針,例6.2字符串復(fù)制:實現(xiàn)將字符數(shù)組str2中的字符串復(fù)制到字符數(shù)組str1中。,方法四:用數(shù)組名加偏移量計算出的地址來訪問數(shù)組元素。 #include main( ) int i; c
18、har str120,str220=How are you!; for(i=0;(*(str1+i)=*(str2+i)!=0;i+); puts(str1); ,6.2指針與數(shù)組,6.2.1 指向數(shù)組元素的指針,使用指針訪問數(shù)組元素,應(yīng)注意的問題1: (1) 若指針p指向數(shù)組a首元素,雖然p+i與a+i、*(p+i)與*(a+i)意義相同,但仍應(yīng)注意p與a的區(qū)別。 a代表數(shù)組的首地址,是不變的,例如語句: for(p=a; a(p+10); a+) printf(%d, *a); 中企圖通過語句a+來改變a的值是不合法的。 p是一個指針變量,可指向數(shù)組中的任何元素,故要注意指針變量的當(dāng)前值。
19、,2. 通過指針引用一維數(shù)組元素,例6.3利用指向數(shù)組元素的指針輸出數(shù)組a的各個元素。 #include main( ) int a6=11,22,33,44,55,66; int *p; for(p=a; pa+6; p+) printf(%4d, *p); ,6.2指針與數(shù)組,6.2.1 指向數(shù)組元素的指針,2. 通過指針引用一維數(shù)組元素,6.2指針與數(shù)組,6.2.1 指向數(shù)組元素的指針,使用指針訪問數(shù)組元素,應(yīng)注意的問題2: 使用指針時,應(yīng)盡量避免指針訪問越界。 在上例for循環(huán)執(zhí)行后,p已經(jīng)越過數(shù)組的范圍,如圖6.12所示,這時它所指向的單元的值是不確定的,但編譯器不能發(fā)現(xiàn)該問題。避免
20、指針訪問越界是程序員自己的責(zé)任。,2. 通過指針引用一維數(shù)組元素,6.2指針與數(shù)組,6.2.1 指向數(shù)組元素的指針,2. 通過指針引用一維數(shù)組元素,把上面的程序稍作修改,則指針p就不會越界。修改后的程序如下: #include main( ) int a6=11,22,33,44,55,66; int *p, i=0; for(p=a; pa+6; p+) printf(%4d, *p); i+; if (i=6) break; ,如果利用前面介紹的訪問數(shù)組元素的四種方法,則指針不需移動,也就不存在指針越界的問題了。,6.2指針與數(shù)組,6.2.1 指向數(shù)組元素的指針,3. 通過指針引用二維數(shù)組
21、元素,當(dāng)p指向二維數(shù)組的首元素后,p+1將指向數(shù)組第2個元素,p+2將指向數(shù)組第3個元素,依此類推。例如定義: int a25; int *p= 后,p指向二維數(shù)組a的首元素,如圖6.13所示。若將數(shù)組元素用p表示出來,則如圖6.14所示。,圖6.13,圖6.14用指針變量p表示的 二維數(shù)組元素,6.2指針與數(shù)組,6.2.1 指向數(shù)組元素的指針,3. 通過指針引用二維數(shù)組元素,對圖進(jìn)行觀察,可知: aij的地址為p+i*5+j, aij可表示為*(p+i*5+j)。 由此推出一般性的結(jié)論如下: 假設(shè)指針變量p已經(jīng)指向共有M行N列的數(shù)組A的首元素,則: Aij的地址為p+i*N+j, Aij可表
22、示為*(p+i*N+j)。其中0iM, 0jN。,6.2指針與數(shù)組,6.2.1 指向數(shù)組元素的指針,3. 通過指針引用二維數(shù)組元素,例6.4用指針法求二維數(shù)組的最大值。 程序清單如下: #include #define M 2 #define N 5 main() int aMN, max, i, j; int *p=,6.2指針與數(shù)組,6.2.1 指向數(shù)組元素的指針,3. 通過指針引用二維數(shù)組元素,for(i=0;iM;i+) for(j=0;jN;j+) scanf(%d,p+);/*通過p+依次引用各數(shù)組元素地址*/ max=a00;/*首先認(rèn)為第一元素的值是最大值*/ p= /*max
23、總是存放比較后的大者*/,6.2指針與數(shù)組,6.2.1 指向數(shù)組元素的指針,3. 通過指針引用二維數(shù)組元素,for(i=0;iM;i+) for(j=0;jN;j+) printf(%5d,*(p+i*N+j);/*逐行輸出數(shù)組元素*/ printf(n); printf(數(shù)組中的最大值為:%d,max);/*輸出最大值*/ ,6.2指針與數(shù)組,6.2.1 指向數(shù)組元素的指針,4. 指向數(shù)組首元素的指針變量的運(yùn)算,(1) p+(或 p += 1) p指向下一個元素。示例如圖6.15所示。,圖6.15p+執(zhí)行前后的指針變化,6.2指針與數(shù)組,6.2.1 指向數(shù)組元素的指針,4. 指向數(shù)組首元素的
24、指針變量的運(yùn)算,(2) *p+ 因為“*”運(yùn)算符和“+”運(yùn)算符同優(yōu)先級,而結(jié)合方向為“自右至左”(右結(jié)合性),即它相當(dāng)于*(p+)。而“+”在指針變量p的后面,屬于后置運(yùn)算,出現(xiàn)在表達(dá)式中時遵循“先用后加”的使用規(guī)則,所以,在示例圖6.16中,執(zhí)行X=*p+,相當(dāng)于執(zhí)行X=*(p+),分解操作相當(dāng)于先執(zhí)行X=(*p),然后執(zhí)行p+。,圖6.16X=*p+執(zhí)行前后各變量的變化,6.2指針與數(shù)組,6.2.1 指向數(shù)組元素的指針,4. 指向數(shù)組首元素的指針變量的運(yùn)算,(3) *(p+)與*(+p) *(p+):同*p+。示例如圖6.13所示。 *(+p):由于“+”在指針變量p的前面,屬于前置運(yùn)算,
25、出現(xiàn)在表達(dá)式中時遵循“先加后用”的使用規(guī)則,所以,在示例圖6.17中,執(zhí)行X=*(+p),相當(dāng)于先執(zhí)行+p,然后執(zhí)行X=(*p)。,圖6.17X=*(+p)執(zhí)行前后各變量的變化,6.2指針與數(shù)組,6.2.1 指向數(shù)組元素的指針,4. 指向數(shù)組首元素的指針變量的運(yùn)算,(4) (*p)+ 表示p指向的元素值加1。相當(dāng)于(a0)+。所以,在示例圖6.18中,執(zhí)行X=(*p)+,相當(dāng)于執(zhí)行X=(a0)+, 分解操作相當(dāng)于先執(zhí)行X=a0,然后執(zhí)行a0+。,圖6.18X=(*p)+執(zhí)行前后各變量的變化,6.2指針與數(shù)組,6.2.1 指向數(shù)組元素的指針,4. 指向數(shù)組首元素的指針變量的運(yùn)算,(5) 如果p當(dāng)
26、前指向數(shù)組a的非首元素ai,則: *(p-)相當(dāng)于ai-,先取*p,再使p減1。示例如下圖。,圖6.19p指向數(shù)組a的非首元素圖6.20執(zhí)行X=*(p-)后,6.2指針與數(shù)組,6.2.1 指向數(shù)組元素的指針,4. 指向數(shù)組首元素的指針變量的運(yùn)算,(5) 如果p當(dāng)前指向數(shù)組a的非首元素ai,則: *(+p)相當(dāng)于a+i,先使p加1,再取*p。示例如下圖。,圖6.19p指向數(shù)組a的非首元素圖6.21執(zhí)行X=*(+p)后,6.2指針與數(shù)組,6.2.1 指向數(shù)組元素的指針,4. 指向數(shù)組首元素的指針變量的運(yùn)算,(5) 如果p當(dāng)前指向數(shù)組a的非首元素ai,則: *(-p)相當(dāng)于a-i,先使p減1,再取*
27、p。示例如下圖。,圖6.19p指向數(shù)組a的非首元素圖6.22執(zhí)行X=*(-p)后,6.2指針與數(shù)組,6.2.1 指向數(shù)組元素的指針,4. 指向數(shù)組首元素的指針變量的運(yùn)算,以上運(yùn)算都可以編寫簡單的程序進(jìn)行驗證。例如對于圖6.16的運(yùn)算結(jié)果,我們用下面程序即可驗證。 例6.5指針運(yùn)算示例。 #include main( ) int a3=11,22,33; int *p=a, X; printf(“First,p=%dn, p); X=*p+; printf(X=%dn, X); printf(“Last,p=%dn, p); ,某次運(yùn)行結(jié)果:,6.2指針與數(shù)組,6.2.2 指向數(shù)組的指針,0.
28、引言,在其它大多數(shù)C語言教材中,“指向數(shù)組的指針”和“指向數(shù)組元素的指針”這兩個概念經(jīng)常混為一談,讓讀者感到十分困惑。而在本書中,我們將這兩個概念嚴(yán)格加以區(qū)分。在介紹“指向數(shù)組的指針”之前,我們先回顧一下“指向數(shù)組元素的指針”,以免把兩個概念混淆。 前面已經(jīng)介紹,一維和二維數(shù)組在內(nèi)存中都是按行連續(xù)存放的。所以,當(dāng)用一個指針變量指向一維或二維數(shù)組的首元素后,利用該指針變量就可以訪問數(shù)組中的任意一個元素。,6.2指針與數(shù)組,6.2.2 指向數(shù)組的指針,0. 引言,例如:先定義inta4=80, 81, 82, 83; int *p=a或int *p= 后,可通過指針引用各個數(shù)組元素,如圖6.23所
29、示。,依次輸出各元素的語句可寫為: for( i=0; i4; i+ ) printf (“%3d”,*(p+i);,圖6.23利用指向一維數(shù)組首元素的指針訪問各元素,6.2指針與數(shù)組,6.2.2 指向數(shù)組的指針,0. 引言,又如:先定義inta24=80,81,82,83,84,85,86,87; int *p= 后,可通過指針引用各個數(shù)組元素,如圖6.24所示。,依次輸出各元素的語句可寫為: for( i=0; i8; i+ ) printf (“%3d”,*(p+i);,圖6.24利用指向二維數(shù)組首元素的指針訪問各元素,6.2指針與數(shù)組,6.2.2 指向數(shù)組的指針,0. 引言,從以上兩例
30、可以看出,對于指向數(shù)組元素的指針,每次指針加1只是指針后移一個元素。 那么,我們能否定義一種指向數(shù)組的指針,每次指針加1將使指針后移一個數(shù)組呢? 回答是肯定的。,6.2指針與數(shù)組,6.2.2 指向數(shù)組的指針,1. 指向一維數(shù)組的指針的定義與引用,指向一維數(shù)組的指針變量的定義格式為: 類型說明符 (*指針變量名)一維數(shù)組長度=初值; 表示定義一個指向一維數(shù)組的指針變量,所指向的數(shù)組的元素類型由“類型說明符”說明,數(shù)組的元素個數(shù)由“一維數(shù)組長度”說明。初值通常是一維數(shù)組的首地址,形式為“ int (*p)4= 后,內(nèi)存狀態(tài)如圖6.25所示。,圖6.25利用指向一維數(shù)組的指針訪問一維數(shù)組各元素,6.
31、2指針與數(shù)組,6.2.2 指向數(shù)組的指針,1. 指向一維數(shù)組的指針的定義與引用,依次輸出各元素的語句可寫為: for ( i=0; i4; i+ ) printf (%3d,*(*p+i); 從上圖可以看出,指向一維數(shù)組的指針p是一個二級指針。它并不像指向數(shù)組元素的指針那樣是指向某個具體的元素,而是指向整個一維數(shù)組a的,而數(shù)組名a代表整個一維數(shù)組,所以指針指向一維數(shù)組a就有p= int a4=80,81,82,83; int (*p)4= ,某次運(yùn)行結(jié)果:,6.2指針與數(shù)組,6.2.2 指向數(shù)組的指針,1. 指向一維數(shù)組的指針的定義與引用,對于上面的運(yùn)行結(jié)果,不同機(jī)器上運(yùn)行所得的地址值可能不一
32、樣,但p, int(*p)4= 后,內(nèi)存狀態(tài)如圖6.26所示。,圖6.26利用指向一維數(shù)組的指針訪問二維數(shù)組各元素,6.2指針與數(shù)組,6.2.2 指向數(shù)組的指針,2. 用指向一維數(shù)組的指針指向二維數(shù)組的首行,依次輸出各元素的語句可寫為: for ( i=0; i2; i+ ) for ( j=0; j4; j+ ) printf (%3d, *(*( p+i ) + j ) );,圖6.26利用指向一維數(shù)組的指針訪問二維數(shù)組各元素,6.2指針與數(shù)組,6.2.2 指向數(shù)組的指針,2. 用指向一維數(shù)組的指針指向二維數(shù)組的首行,從圖6.26可以看出,指向一維數(shù)組的指針p是一個二級指針,它指向二維數(shù)組
33、的第一行,由于指針p是用于指向整個一維數(shù)組(即第一行)的,所以p+1則會跳過這個一維數(shù)組而指向下一個一維數(shù)組(即第二行)。同理,若有第三行、第四行,只要把指針名分別變?yōu)閜+2、p+3即可,依次類推。,圖6.26利用指向一維數(shù)組的指針訪問二維數(shù)組各元素,6.2指針與數(shù)組,6.2.2 指向數(shù)組的指針,2. 用指向一維數(shù)組的指針指向二維數(shù)組的首行,當(dāng)指向一維數(shù)組的指針p指向二維數(shù)組a首行后,數(shù)組元素aij可表示為: aij*(ai+j) *(*(a+i)+j) *(pi+j) *(*(p+i)+j) 數(shù)組元素aij的地址可以表示為: ,6.2指針與數(shù)組,6.2.3 指針數(shù)組,2. 指針數(shù)組的引用,例
34、6.9寫出下列程序的運(yùn)行結(jié)果。 #include main( ) int a,b,c,sum; int *p3; a=10;b=20;c=30; printf(a=%d,b=%d,c=%dn,a,b,c); p0= ,6.2指針與數(shù)組,6.2.3 指針數(shù)組,3. 指針數(shù)組作main( )函數(shù)的形參,例如,某同學(xué)編了一個C程序strlink.c,實現(xiàn)將兩個字符串連接起來,兩個字符串在運(yùn)行相應(yīng)的可執(zhí)行文件strlink.exe時作為參數(shù)接在命令名strlink的后面。如: c:tcstrlink First_string Second_string 為了達(dá)到這一目的,我們要在源程序strlink.
35、c中,通過在main()函數(shù)中使用參數(shù)來說明命令行的參數(shù),main( )函數(shù)的參數(shù)定義形式為: main ( int argc, char *argv ) 其中,argc表示命令行參數(shù)的個數(shù)(包括命令名),指針數(shù)組argv用于存放參數(shù)(包括命令名)。,6.2指針與數(shù)組,6.2.3 指針數(shù)組,3. 指針數(shù)組作main( )函數(shù)的形參,如,在命令行:strlink First_stringSecond_string中相應(yīng)的指針數(shù)組存儲如圖6.29所示,各個參數(shù)的值如下: argc = 3; argv0 =strlink.exe argv1 =First_string argv2 = Second_
36、string,圖6.29指針數(shù)組用作命令行參數(shù),argv0中存放的執(zhí)行文件名包括盤符、路徑、文件名及其文件擴(kuò)展名,6.2指針與數(shù)組,6.2.3 指針數(shù)組,3. 指針數(shù)組作main( )函數(shù)的形參,例6.11用帶參數(shù)的main( )函數(shù)實現(xiàn)兩個字符串的連接。 #include main(int argc, char *argv) if(argc=3) printf(第0個參數(shù)(命令名)為:%sn,argv0); printf(第1個參數(shù)(字符串1)為:%sn,argv1); printf(第2個參數(shù)(字符串2)為:%sn,argv2); printf(字符串1和字符串2相連后的結(jié)果為:%sn,s
37、trcat(argv1,argv2); else printf(錯誤!請輸入兩個參數(shù)(字符串)!); ,將上面的源程序取名為strlink.c,將其編譯連接成可執(zhí)行文件strlink.exe并存放在d:xds目錄中,若在d:xds目錄下執(zhí)行命令: d:xdsstrlink First_string Second_string 則得到的輸出結(jié)果如下: 第0個參數(shù)(命令名)為:d:xdsstrlink.exe 第1個參數(shù)(字符串1)為:First_string 第2個參數(shù)(字符串2)為:Second_string 字符串1和字符串2相連后的結(jié)果為:First_stringSecond_string
38、,6.2指針與數(shù)組,6.2.3 指針數(shù)組,3. 指針數(shù)組作main( )函數(shù)的形參,6.2指針與數(shù)組,6.2.3 指針數(shù)組,3. 指針數(shù)組作main( )函數(shù)的形參,一般的函數(shù)由主調(diào)函數(shù)調(diào)用,函數(shù)的參數(shù)值也由主調(diào)函數(shù)的實參向形參傳遞。但是main()函數(shù)由系統(tǒng)調(diào)用,它的形參的值只能從外部輸入。利用指針數(shù)組作main()函數(shù)的形參,使得從外部向程序傳遞參數(shù)成為可能。但這種參數(shù)僅限于字符串(通常是文件名)。另外,這些參數(shù)的個數(shù)無任何限制,參數(shù)字符串的長度也無限制,也無需事先知道。,6.2指針與數(shù)組,6.2.3 指針數(shù)組,3. 指針數(shù)組作main( )函數(shù)的形參,例6.11程序要想在VC中直接調(diào)試運(yùn)
39、行,可以先在“工程設(shè)置Debug| Program arguments”項中填入?yún)?shù)“First_string Second_string”,然后運(yùn)行即可得到與上面相同的結(jié)果。,6.2指針與數(shù)組,6.2.4 指針與字符串,當(dāng)字符串存放在數(shù)組中,其處理方法與一維數(shù)組的處理方法基本一致,可以先定義一個字符類型的指針變量,通過賦初值或賦值的方式讓指針變量指向字符數(shù)組首元素。然后就可以使用這個指針變量處理單個字符,也可以用它一次性地處理整個字符串,此種方法不再詳細(xì)討論。本節(jié)主要討論利用字符類型的指針變量處理字符串常量的方法。,6.2指針與數(shù)組,6.2.4 指針與字符串,將字符類型的指針變量指向字符串有
40、兩種方法: (1) 在定義的同時給指針變量賦初值。例如: char *p= Gold medal; (2) 給指針變量賦值。例如: char *p; p= Gold medal; 上述兩種方式,實際上都是把字符串的第一個字符G的地址賦給指針變量p。如例6.12、例6.13和圖6.30所示。,1使指針變量指向“字符串”的方法,6.2指針與數(shù)組,6.2.4 指針與字符串,1使指針變量指向“字符串”的方法,例6.12 #include main() char *p=Gold medal; printf(%s, p); ,例6.13 #include main() char *p=Gold medal
41、; while(*p!=0) printf(%c, *p+); ,例6.12和例6.13的輸出結(jié)果都是:Gold medal,圖6.30指向字符串的指針變量,6.2指針與數(shù)組,6.2.4 指針與字符串,2指向字符串常量的指針變量的使用,(1) 把字符串當(dāng)作整體來處理 這種方式通常用在字符串的的輸入和輸出中,格式如下: 輸入字符串:(a) scanf(%s,指針變量); (b) gets(指針變量); 輸出字符串:(a) printf(%s,指針變量); (b) puts(指針變量); (2) 處理字符串中的單個字符 若指針變量已經(jīng)指向了字符串常量,則用指針變量表示的第i個字符為:*(指針變量+
42、i),6.2指針與數(shù)組,6.2.4 指針與字符串,2指向字符串常量的指針變量的使用,例6.14利用指針變量輸出字符串并統(tǒng)計字符串的長度。 #include main() char *p=Gold medal; int i,length=0; printf(字符串); for(i=0;*(p+i)!=0;i+) printf(%c, *(p+i); length+; printf(的長度為:%d, length); ,6.2指針與數(shù)組,6.2.4 指針與字符串,3使用字符指針變量與字符數(shù)組的區(qū)別,(1) 存儲內(nèi)容不同。 字符指針變量本身是一個變量,用于存放字符串的首地址。而字符串本身是存放在以該
43、首地址為首的一塊連續(xù)的內(nèi)存空間中并以0作為串的結(jié)束。字符數(shù)組是由若干個數(shù)組元素組成的,每個元素中放一個字符。,6.2指針與數(shù)組,6.2.4 指針與字符串,3使用字符指針變量與字符數(shù)組的區(qū)別,(2) 賦值方式不同。 對字符指針變量,可采用下面方法賦值:如: char *p; p=Gold medal; 而對字符數(shù)組只能對各個元素逐個賦值,不能用以下辦法對字符數(shù)組賦值: char p20; p=Gold medal;,6.2指針與數(shù)組,6.2.4 指針與字符串,3使用字符指針變量與字符數(shù)組的區(qū)別,(3) 指針變量的值可以改變;而數(shù)組名雖然代表地址,但它的值是不能改變的。,例6.15 #includ
44、e main() char *p=Gold medal; p=p+5; printf(%s,p); ,例6.15 #include main() char p=Gold medal; p=p+5; printf(%s,p); ,6.2指針與數(shù)組,6.2.4 指針與字符串,3使用字符指針變量與字符數(shù)組的區(qū)別,(4) 內(nèi)存分配有區(qū)別: 如果定義了一個字符數(shù)組,在編譯時自動為它分配內(nèi)存單元,它有確定的地址。 指針在定義時,若沒有人為的給它分配內(nèi)存或使它指向確定的內(nèi)存單元,則該指針指向的內(nèi)存位置是不確定的。(這點也是初學(xué)者常犯的錯誤,請通過后面的例子和實驗課深入掌握),6.2指針與數(shù)組,6.2.4 指
45、針與字符串,3使用字符指針變量與字符數(shù)組的區(qū)別,(4) 內(nèi)存分配有區(qū)別:,#include main() char p10; scanf(%s,p); printf(%s, p); ,#include main() char *p; scanf(%s,p); printf(%s, p); ,warning C4700: local variable p used without having been initialized,6.2指針與數(shù)組,6.2.4 指針與字符串,3使用字符指針變量與字符數(shù)組的區(qū)別,(4) 內(nèi)存分配有區(qū)別:,#include main() char *p; char st
46、r20; p=str; scanf(%s,p); printf(%s, p); ,#include main() char *p; p=(char*)malloc(20*sizeof(char); scanf(%s,p); printf(%s, p); ,6.3指針與函數(shù),6.3.0 引言,指針與函數(shù)的結(jié)合使編程更為靈活。 指針可以用作函數(shù)的參數(shù)(傳遞地址值), 函數(shù)也可以返回一個指針類型的值, 甚至可以定義指向函數(shù)的指針。,返回目錄,6.3指針與函數(shù),6.3.1 指針作函數(shù)參數(shù),1函數(shù)形參為指針,實參為地址表達(dá)式,因為地址表達(dá)式的值是一個地址值,所以函數(shù)調(diào)用時,實參地址表達(dá)式傳遞給形參指針變
47、量的值是地址,故參數(shù)傳遞后實參與對應(yīng)的形參指向同一個單元,函數(shù)體內(nèi)對形參的任何操作就相當(dāng)于是對實參的操作。,6.3指針與函數(shù),6.3.1 指針作函數(shù)參數(shù),1函數(shù)形參為指針,實參為地址表達(dá)式,例6.16利用指針作參數(shù),交換兩個變量的值 #include void swap(int *p, int *q) int temp; printf(交換函數(shù)調(diào)用swap執(zhí)行開始時,*p=%3d,*q=%3dn,*p,*q); temp = *p; *p = *q; *q = temp; printf(交換函數(shù)調(diào)用swap執(zhí)行結(jié)束時,*p=%3d,*q=%3dn,*p,*q); main( ) /*- 測試函
48、數(shù) swap( ) 用的主函數(shù) -*/ int a = 10, b = 20; printf(交換函數(shù)調(diào)用swap( ,6.3指針與函數(shù),6.3.1 指針作函數(shù)參數(shù),1函數(shù)形參為指針,實參為地址表達(dá)式,圖6.31利用指針作為函數(shù)參數(shù)實現(xiàn)兩數(shù)的交換,例6.16利用指針作參數(shù),交換兩個變量的值 交換前后的內(nèi)存狀態(tài)如圖6.31所示(圖中的地址值是假設(shè)的),6.3指針與函數(shù),6.3.1 指針作函數(shù)參數(shù),2函數(shù)形參為指針,實參為數(shù)組名,由于數(shù)組名代表的是數(shù)組的首地址,所以數(shù)組名作為實參傳遞給函數(shù)形參的也是一個“地址”值。,例6.17用函數(shù)調(diào)用方式,實現(xiàn)字符串的復(fù)制。 #include void stri
49、ng_copy(char *dest, char *source) int i=0; for(; (*(dest+i)=*(source+i)!=0; i+) ; /*循環(huán)體為空語句*/ printf(函數(shù)調(diào)用后,形參變量的值n); printf(source=%sn,source); printf(dest=%sn,dest); void main( ) char str120=I am a student; char str220; string_copy(str2, str1); /*數(shù)組名作實參*/ printf(函數(shù)調(diào)用后,實參變量的值n); printf(str1=%sn,str1
50、); printf(str2=%sn,str2); ,6.3指針與函數(shù),6.3.1 指針作函數(shù)參數(shù),2函數(shù)形參為指針,實參為數(shù)組名,6.3指針與函數(shù),6.3.1 指針作函數(shù)參數(shù),2函數(shù)形參為指針,實參為數(shù)組名,例6.17用函數(shù)調(diào)用方式,實現(xiàn)字符串的復(fù)制。 在本例中,當(dāng)主程序中的調(diào)用函數(shù)string_copy( )執(zhí)行時,實參str1 (數(shù)組名)傳遞給形參source (指針變量)的是數(shù)組首地址,因而str1和source指向同一個單元。同理,str2和dest也指向同一個單元。如圖6.32所示:,圖6.32例6.16執(zhí)行后的結(jié)果,6.3指針與函數(shù),6.3.1 指針作函數(shù)參數(shù),3函數(shù)形參為指針,
51、實參也為指針,函數(shù)調(diào)用時,實參指針變量傳遞給形參指針變量的值仍是“地址”,故參數(shù)傳遞后實參與形參指針變量指向同一個內(nèi)存單元,函數(shù)體內(nèi)對形參的任何操作就相當(dāng)于是對實參的操作。,6.3指針與函數(shù),6.3.1 指針作函數(shù)參數(shù),3函數(shù)形參為指針,實參也為指針,例6.18用函數(shù)調(diào)用方式,求字符串的長度。 #include int str_length(char *str) /*形參str為指針變量*/ int i; printf(參數(shù)傳遞后,形參指針指向的字符串為n); for(i=0; stri!=0;i+);/*循環(huán)體為空語句,i統(tǒng)計字符串的長度*/ printf(str=%sn,str); ret
52、urn i;/*返回字符串的長度*/ void main( ) int x; char *string=I am a student.; printf(函數(shù)調(diào)用時,實參指針指向的字符串為n); printf(string=%sn,string); x=str_length(string);/*函數(shù)調(diào)用時,實參string也為指針變量*/ printf(字符串的長度是:%dn,x); ,6.3指針與函數(shù),6.3.1 指針作函數(shù)參數(shù),3函數(shù)形參為指針,實參也為指針,程序運(yùn)行結(jié)果: 函數(shù)調(diào)用時,實參指針指向的字符串為 string=I am a student. 參數(shù)傳遞后,形參指針指向的字符串為
53、str=I am a student. 字符串的長度是:15,6.3指針與函數(shù),6.3.2 返回指針值的函數(shù),一個函數(shù)可以返回一個int型、float型、char型的數(shù)據(jù),也可以返回一個指針類型的數(shù)據(jù)(即地址)。返回指針值的函數(shù)(簡稱指針函數(shù))的定義格式如下: 函數(shù)類型 *函數(shù)名(形參表) 例如: int*max(int x, int y) 就定義了一個函數(shù)名為max的函數(shù),其返回值為指針類型,且是指向int型數(shù)據(jù)的指針。,而 intmax(int x, int y) 是前面介紹的一種常規(guī)函數(shù)定義,它表示定義了一個函數(shù)名為max的函數(shù),其返回值為int類型。 由此可見,返回值為指針的函數(shù)和前面
54、學(xué)習(xí)的返回值為int(或float或char)型的普通函數(shù)在定義上是沒有根本區(qū)別的。只是“返回值的類型”不同而已。,6.3指針與函數(shù),6.3.2 返回指針值的函數(shù),6.3指針與函數(shù),6.3.2 返回指針值的函數(shù),參考解答:,綜合舉例:例6.19;例6.20,6.3指針與函數(shù),6.3.3 函數(shù)指針,通過前面的學(xué)習(xí),我們已經(jīng)知道,C語言中的指針,既可以指向(普通)變量(如整型、字符型、實型等),也可以指向數(shù)組元素或數(shù)組。下面我們還要介紹一種指向函數(shù)的指針變量函數(shù)指針。 在程序編譯時,編譯系統(tǒng)會給函數(shù)分配一段內(nèi)存單元,這段內(nèi)存的起始地址就是函數(shù)的入口地址(函數(shù)中第一條指令的地址)。如果一個指針變量的
55、值等于函數(shù)的入口地址,則該指針變量稱為指向函數(shù)的指針變量,簡稱為函數(shù)指針。,6.3指針與函數(shù),6.3.3 函數(shù)指針,1函數(shù)指針的定義,和其它任何變量一樣,在使用指向函數(shù)的指針變量之前需要先定義該指針變量,指向函數(shù)的指針變量(即函數(shù)指針)的一般定義形式為: 函數(shù)返回值類型 (*指針變量名)(形參類型); 可以看出,除函數(shù)名用(*指針變量名)代替外,函數(shù)指針的定義形式與函數(shù)的原型相同,在函數(shù)指針定義中加入形參類型是現(xiàn)代程序設(shè)計風(fēng)格。如: int (*p) (int, int); 形參類型一般不要省略。僅當(dāng)形參類型是int時,可省略。如: int (*p) ( );,6.3指針與函數(shù),6.3.3 函
56、數(shù)指針,2用函數(shù)指針變量調(diào)用函數(shù),在定義指向函數(shù)的指針變量時,指針變量到底指向哪個函數(shù)并沒有指明,它可以根據(jù)所賦的地址不同而指向不同的函數(shù)。一旦定義了指針變量指向某個具體的函數(shù)之后,就可以通過該指針變量來調(diào)用此函數(shù)。,例6.21通過函數(shù)指針調(diào)用函數(shù),求a和b的和。 #include int add(int x, int y)/*定義函數(shù)add*/ return x+y; main( ) int (*p)(int, int);/*定義一個指向函數(shù)的指針變量p*/ int a,b,sum; p = add; /*使函數(shù)指針p指向函數(shù)add */ scanf(%d,%d, ,6.3指針與函數(shù),6.3
57、.3 函數(shù)指針,2用函數(shù)指針變量調(diào)用函數(shù),6.3指針與函數(shù),6.3.3 函數(shù)指針,2用函數(shù)指針變量調(diào)用函數(shù),說明: (1) 語句p=add,把函數(shù)add的入口地址賦給函數(shù)指針p,則p指向函數(shù)add,因此,*p就代表函數(shù)add。 (2) 在給函數(shù)指針變量賦值時,只需給出函數(shù)名而不必給出參數(shù),如: p=add; 因為將函數(shù)入口地址賦給p時,并不牽涉到實參與形參的結(jié)合問題,所以不能寫成 p=add(a,b);,6.3指針與函數(shù),6.3.3 函數(shù)指針,2用函數(shù)指針變量調(diào)用函數(shù),說明: (3) 函數(shù)的調(diào)用可以通過函數(shù)名調(diào)用,也可以通過函數(shù)指針調(diào)用,如例6.21中的語句: sum=(*p)(a,b); 相
58、當(dāng)于調(diào)用語句: sum=add(a,b); (4) (*p)( )表示一個指向函數(shù)的指針變量,它可以先后指向不同的函數(shù)。,6.3指針與函數(shù),6.3.3 函數(shù)指針,2用函數(shù)指針變量調(diào)用函數(shù),說明: (5) 指向函數(shù)的指針變量p,只能指向函數(shù)的入口地址,而不可能指向函數(shù)中某一條指令處的地址,因此象p+、p-、p+n等運(yùn)算是無意義的。 (6) 注意int (*p)( )和int *p( )的區(qū)別:在定義int (*p)( )中,p先與*結(jié)合,p是指針變量,然后與( )結(jié)合,表示此指針變量指向函數(shù)。如果定義為int *p( ),由于( )比*優(yōu)先級別要高,則p先與( )結(jié)合,p是函數(shù),然后與*結(jié)合,表
59、示函數(shù)的返回值是一個指針值。,6.3指針與函數(shù),6.3.3 函數(shù)指針,3用函數(shù)指針作函數(shù)參數(shù),前面已經(jīng)介紹,定義指向函數(shù)的指針變量時,并沒有指明它到底指向哪個函數(shù),而是在隨后的程序運(yùn)行過程中,根據(jù)所賦的地址不同而指向不同的函數(shù)?;谶@一特點,我們可以把函數(shù)指針用作某一函數(shù)的形式參數(shù),從而使該函數(shù)能根據(jù)實際情況調(diào)用不同的函數(shù),大大增強(qiáng)該函數(shù)的功能。,6.3指針與函數(shù),6.3.3 函數(shù)指針,3用函數(shù)指針作函數(shù)參數(shù),例6.22模擬計算器中的加減乘除運(yùn)算。 #include int add(int x, int y)/*定義實現(xiàn)加法的函數(shù)add*/ return x+y; int sub(int x, int y)/*定義實現(xiàn)減法的函數(shù)sub*/ return x-y; int mul(int x, int y)/*定義實現(xiàn)乘法的函數(shù)mul*/ return x*y; int div(int x, int y)/*定義實現(xiàn)整除的函數(shù)div*/ return x/y; ,6.3指針與函數(shù),6.3.3
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 西藏取水收費管理辦法
- 異地辦公團(tuán)隊管理辦法
- 移動推車定置管理辦法
- 萊蕪瓷器修復(fù)培訓(xùn)課件
- 高三上期末數(shù)學(xué)試卷
- 高考模擬感人數(shù)學(xué)試卷
- 定西市歷年中考數(shù)學(xué)試卷
- 德陽市期末高二數(shù)學(xué)試卷
- 2025年03月浙江紹興嵊州市婦幼保健院第一次招聘編外合同制人員12人筆試歷年專業(yè)考點(難、易錯點)附帶答案詳解
- 2025至2030打印機(jī)市場行業(yè)市場深度研究與戰(zhàn)略咨詢分析報告
- 雅思英文測試題及答案
- 江西單招解剖試題及答案
- 肝癌中西醫(yī)治療
- GA/T 2159-2024法庭科學(xué)資金數(shù)據(jù)清洗規(guī)程
- 《自動化釀酒技術(shù)》課件
- 臨床成人患者經(jīng)膀胱腹內(nèi)壓測量臨床實踐應(yīng)用
- 商標(biāo)侵權(quán)培訓(xùn)課件
- 留學(xué)邏輯考試題及答案
- 安置房購房定金合同協(xié)議
- 企業(yè)碳排放管理制度
- 2025年北京市第一次普通高中學(xué)業(yè)水平合格性考試歷史試題(含答案)
評論
0/150
提交評論