版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、第六章第六章 指針指針主講人:韓維良2021年11月11日C語言程序設(shè)計(jì)指針是C語言的個重要特色,是C語言的精華所在。正是豐富的指針運(yùn)算功能才使得C語言成為目前最常用、最流行的面向過程的結(jié)構(gòu)化程序設(shè)計(jì)語言。正確而靈活地運(yùn)用指針,能有效地表示復(fù)雜的數(shù)據(jù)結(jié)構(gòu)、方便地使用數(shù)組和字符串;可以在函數(shù)間進(jìn)行數(shù)據(jù)傳遞;可以直接處理內(nèi)存地址、動態(tài)分配內(nèi)存等。熟練、靈活的使用指針,可以使程序簡潔、緊湊、高效。C語言程序設(shè)計(jì)基礎(chǔ)知識基礎(chǔ)知識一、內(nèi)存地址一、內(nèi)存地址內(nèi)存中存儲單元的編號內(nèi)存中存儲單元的編號C語言程序設(shè)計(jì)所有數(shù)據(jù)只有存放在內(nèi)存中所有數(shù)據(jù)只有存放在內(nèi)存中計(jì)算機(jī)才能進(jìn)行處理和運(yùn)算。內(nèi)存計(jì)量的基本單位是字節(jié)
2、,它是進(jìn)行分配和讀取的最小單位,每個字節(jié)由8個二進(jìn)制位(bit)組成,一個字節(jié)就是一個內(nèi)存單元。整個內(nèi)存空間是一維的,每個字節(jié)都有一個唯一的序號,每個字節(jié)都有一個唯一的序號,稱為內(nèi)存單元的地址稱為內(nèi)存單元的地址,比如對一個1Mb的內(nèi)存,其內(nèi)存單元的地址分別為0,1,2,3,。C語言程序設(shè)計(jì)任何計(jì)算機(jī)程序只有存貯在內(nèi)存中才能被執(zhí)行。當(dāng)C程序中定義一個變量時,編譯系統(tǒng)劃分一定數(shù)目的存貯單元來存貯那個變量,存貯單元的數(shù)目由變量的類型確定,例如,int型變量分配4個字節(jié),float型變量分配4個字節(jié),對char型變量分配1個字節(jié)等,若變量分配的不是1個字節(jié),此時,這就是內(nèi)存數(shù)據(jù)的指針,編譯系統(tǒng)把這幾個
3、存貯單元與變量名聯(lián)系起來。地址地址存貯單元存貯單元0000一個字節(jié)0001一個字節(jié)0002一個字節(jié)0003一個字節(jié)0004一個字節(jié)一個字節(jié)2001999的低字節(jié)2002999的高字節(jié)變量a如有一個short型變量,變量名是a,值是999,占用的存貯單元是2001和2002兩個字節(jié),則變量a的內(nèi)存地址是2001。C語言程序設(shè)計(jì)1、內(nèi)存儲器中,擁有大量的存儲單元(每個存儲單元容量為字節(jié))。為了方便管理,必須為每一個存儲單元編號,這個編號就是存儲單元的“地址”。每個存儲單元都有一個唯一的地址。2、在地址所標(biāo)識的存儲單元中存放數(shù)據(jù)。注意:內(nèi)存單元的地址與存放內(nèi)存單元中的數(shù)據(jù)是兩個完全不同的概念。如同房
4、間號碼與住在房間里的人。C語言程序設(shè)計(jì)二、變量地址二、變量地址系統(tǒng)分配給變量的內(nèi)存單元的起始地址系統(tǒng)分配給變量的內(nèi)存單元的起始地址如下程序:main() int num; scanf(%d,&num); printf(num=%dn, num); C編譯程序編譯到該變量定義語句時,將變量num 登錄到“符號表”中。符號表的關(guān)鍵屬性有兩個:一是“標(biāo)識符名(id)” ,二是該標(biāo)識符在內(nèi)存空間中的“地址(addr)” 。(如同醫(yī)院床位登記表)為描述方便,假設(shè)系統(tǒng)分配給變量num的4字節(jié)存儲單元為 3000_3003,則起始地址3000就是變量num在內(nèi)存中的地址。C語言程序設(shè)計(jì)short a
5、,b;如上的定義,給變量a、b分別分配兩個單元(1個字節(jié)),變量a的地址為:2001,變量名與存放變量的地址之間建立一定的聯(lián)系,使得通過變量名可以訪問對應(yīng)存貯單元中的內(nèi)容。2001a20022003b2004C語言程序設(shè)計(jì)一定要清楚一定要清楚變量的地址變量的地址與與變量的值變量的值不是一回事不是一回事,變量的變量的地址地址是由編譯系統(tǒng)按一定規(guī)則進(jìn)行分配的,一經(jīng)分配就固定不變,變量的值變量的值在程序運(yùn)行過程中是可以改變的,用戶需要關(guān)心的是變量的當(dāng)前值,而不必關(guān)心變量的地址,即變量存儲單元。當(dāng)程序引用這個變量時,可通過變量名自動地訪問相應(yīng)的存貯單元,當(dāng)然程序也可以通過該變量的地址來訪問這些存貯器單
6、元。C語言程序設(shè)計(jì)三、變量值的存取三、變量值的存取通過變量在內(nèi)存中的地址進(jìn)行通過變量在內(nèi)存中的地址進(jìn)行1 1、直接訪問、直接訪問直接利用變量的地址進(jìn)行存取程序經(jīng)編譯后,變量名轉(zhuǎn)換為變量的地址,對變量值的存取是通過地址進(jìn)行的上例中scanf(%d,&num)的執(zhí)行過程是這樣的:用變量名num作為索引值,檢索符號表,找到變量num的起始地址3000;然后將鍵盤輸入的值(假設(shè)為)送到內(nèi)存單元3000和3001中。printf(num=%dn,num)的執(zhí)行過程,與scanf( )很相似:首先找到變量num的起始地址3000,然后從3000和3001中取出其值,最后將它輸出。C語言程序設(shè)計(jì)2
7、2、間接訪問、間接訪問通過指針變量訪問某變量的值 語言規(guī)定:在程序中可以定義一種特殊的變量(稱為指針變量),用來存放其它變量的地址用來存放其它變量的地址,進(jìn)而間接地訪問 某個變量,(是定義指針變量的關(guān)鍵所在)。例如,假設(shè)定義了這樣一個指針變量p,它被分配到4000、4001單元,其值可通過賦值語句“p=a;”得到。此時,指針變量p的值就是變量a在內(nèi)存中的起始地址2001。通過指針變量,間接訪問變量的值。printf(“a=%dn”, *p); C語言程序設(shè)計(jì)2001999a20022003200440002001p4001p變量中存放的是:2001,2001地址所表示的存貯單元中存放的數(shù)據(jù)為:
8、999,因此取得999,需要兩次訪問存貯空間:、從p的存貯單元中取得a的地址。、再根據(jù)a的地址找到存貯單元取出999。即間接訪問。C語言程序設(shè)計(jì)第一節(jié)第一節(jié) 指針基礎(chǔ)指針基礎(chǔ)一、地址與指針一、地址與指針變量、數(shù)組、函數(shù)都稱為程序?qū)嶓w,這些被分配了內(nèi)存空間的程序?qū)嶓w,都具有自己的內(nèi)存地址。這個內(nèi)存地址就稱為指針。它好像一個指示器指向要訪問的內(nèi)存數(shù)據(jù)。1 1、指針、指針即地址 一個變量的地址稱為該變量的指針。通過變量的指針能夠找到該變量。即形象地理解為一種指示器,通過地址能找到存貯單元,亦可理解為,指針指向某存貯單元。C語言程序設(shè)計(jì)2 2、指針變量、指針變量專門用于存儲地址的變量。2001 999
9、a2002 2003 20044000 2001p4001C語言程序設(shè)計(jì)例如,指針變量num_pointer與它所指向的變量num的關(guān)系,表示為:*num_pointer,即*num_pointer等價于變量num。因此,下面兩組語句的作用相同:num=3; /*將3直接賦給變量num*/num_pointer=# /*使num_pointer指向num */*num_pointer=3; /*將3賦給指針變量num_pointer所指向的變量*/C語言程序設(shè)計(jì)二、指針變量的定義二、指針變量的定義格式: 類型說明符 *變量名;對指針變量的定義包括三個內(nèi)容:指針變量所指向的變量的
10、數(shù)據(jù)類型指針變量所指向的變量的數(shù)據(jù)類型。指針類型說明指針類型說明,即定義變量為一個指針變量;指針變量名指針變量名;其中,*表示這是一個指針變量,變量名即為定義的指針變量名,類型說明符表示本指針變量所指向的變量的數(shù)據(jù)類型。C語言程序設(shè)計(jì)例如:int *p1;表示p1是一個指針變量,它的值是某個整型變量的地址。或者說p1指向一個整型變量。至于p1究竟指向哪一個整型變量,應(yīng)由向p1賦予的地址來決定。再如:float *p2; /*p2是指向浮點(diǎn)型變量的指針變量*/char *p3; /*p3是指向字符型變量的指針變量*/應(yīng)該注意的是,一個指針變量只能指向同類型的變量,如P2 只能指向浮點(diǎn)變量,不能時
11、而指向一個浮點(diǎn)變量,時而又指向一個字符變量。從本質(zhì)上講,p1、p2、p3都用來表示一個地址,它們的值沒有本質(zhì)上的區(qū)別,但通過它們訪問數(shù)據(jù)時,卻有所不同。C語言程序設(shè)計(jì)short a,*p;a=999;p=&a;關(guān)系可表示如下:此時,習(xí)慣上稱指針習(xí)慣上稱指針變量變量p p指向指向a a。2001999a20022003200440002001p4001pa&a999C語言程序設(shè)計(jì)三、取地址運(yùn)算三、取地址運(yùn)算( () )格式: 變量變量例如,&num_int、&num_f、&num_ch的結(jié)果,分別為變量num_int、num_f、num_ch的地址。注意:
12、指針變量只能存放指針(地址),且只能是相同類型變量的地址。C語言程序設(shè)計(jì)四、指針的引用四、指針的引用格式:* *指針變量指針變量(*:又稱為取值運(yùn)算符,或間接訪問運(yùn)算符)功能:表示指針變量所指內(nèi)存單元的內(nèi)容,即取得指針?biāo)赶虻膬?nèi)存單元的值。當(dāng)一個指針變量被初始化或被賦值后,它就指向一個特定的變量。通過*運(yùn)算符可以間接地訪問指針變量所指示的內(nèi)存單元。&和*運(yùn)算是同級運(yùn)算,結(jié)合性是“從右至左”,運(yùn)算級別低于( )、 、+、- -等運(yùn)算,高于算術(shù)、位移、關(guān)系、賦值等運(yùn)算。C語言程序設(shè)計(jì)#include main() int a,*p; p=&a; /*使指針變量有一個確定的指向*/
13、scanf(“%d”,p); printf(“%d%d”,a,*p);變量a可以出現(xiàn)的任何位置,均可以出現(xiàn)*p。如:b=*p+100;地址單元變量名2001999a20022003200420052006200720082001(a的地址)指針變量p200920102011說明:&a2001a 999&p2008p 2001p 2001*p 999C語言程序設(shè)計(jì)五、指針變量的運(yùn)算五、指針變量的運(yùn)算1 1、指針變量的初始化和賦值、指針變量的初始化和賦值可以用變量的地址對指針變量進(jìn)行初始化,也可以用一個指針變量的值給另一個指針變量賦值。設(shè)有指向整型變量的指針變量p,如要把整型變量a
14、 的地址賦予p可以有以下兩種方式:指針變量初始化的方法 int a; int *p=&a; 賦值語句的方法 int a; int *p; p=&a;C語言程序設(shè)計(jì)通過賦值操作,使得指針指向一個確定的存貯單元。不允許把一個數(shù)賦予指針變量,下面的賦值是錯誤的:int *p;p=1000;被賦值的指針變量前不能再加“*”說明符,如寫為*p=&a 也是錯誤的。通過指針變量賦值,把一個指針變量的地址賦給另一個指針變量。C語言程序設(shè)計(jì)如下的程序:int i,j,*p1,*p2;i=a;j=b;p1=&i;p2=&j;C語言程序設(shè)計(jì)賦值表達(dá)式:p2=p1就使p2與p1
15、指向同一對象i,此時*p2就等價于i,而不是j,圖所示:&i&i&i&jC語言程序設(shè)計(jì)如果執(zhí)行如下表達(dá)式: *p2=*p1;則表示把p1指向的內(nèi)容賦給p2所指的區(qū)域, 此時就變成下圖所示:&i&j&i&jC語言程序設(shè)計(jì)【例】如下的程序,請寫出輸出結(jié)果。main() int a,b; int *p1, *p2; a=100;b=10; p1=&a; p2=&b; printf(%d,%dn,a,b); printf(%d,%dn,*p1, *p2);#include int main(void)int i1,i2;i
16、nt *p1=&i1,*p2=&i2;printf(指針間賦值前:p1=%ld,p2=%ldn,p1,p2);p1=p2; /* 指針間賦值 */printf(指針間賦值后:p1=%ld,p2=%ldn,p1,p2);return 0;運(yùn)行結(jié)果:指針間賦值前:p1=215052,p2=215048指針間賦值后:p1=215048,p2=215048同類型指針間賦值124505612450521245048地址指針變量p2p1賦值前賦值后C語言程序設(shè)計(jì)2 2、指針變量的、指針變量的+、- - -運(yùn)算運(yùn)算指針變量的+和- -運(yùn)算與指針變量的類型有關(guān),確切地說,是與指針變量同類數(shù)據(jù)所
17、占用的存儲字節(jié)數(shù)有關(guān)。假如指向變量的指針變量p的值是4000,若p指向的是short型變量a,則分別執(zhí)行p+和p-后,p的值分別是4002和3998;若p指向的是float型變量,則分別執(zhí)行p+和p-后,p的值分別是4004和3996。即指針變量值的加減變化量指針變量值的加減變化量為一個所指向數(shù)據(jù)占用的字節(jié)數(shù)。但是,需要注意,變化后指針變量所指單元可能沒有值,也可能不是所期望的值,這一點(diǎn)應(yīng)引起重視。11/11/2021332001999a20022003b200440002001p4001short a,b,*p;a=999;b=1234;p=&a;p+;運(yùn)算完成后,指針?biāo)赶虻膯卧?/p>
18、哪一個?C語言程序設(shè)計(jì)通過加減運(yùn)算可以改變指針的指向,稱為指針的移動操作。通過移動移動指針可以改變指針指向的內(nèi)存位置。移動指針的方法有兩種:同類型指針間賦值與小整數(shù)相加、減指針與小整數(shù)相加、減#include int main(void)int i,*pi;double d,*pd;pi=&i;pd=&d;printf(pi=%ld,pi+1=%ldn,pi,pi+1);printf(pd=%ld,pd+1=%ldn,pd,pd+1);return 0;運(yùn)行結(jié)果:pi=215052,pi+1=215056pd=215040,pd+1=2150481245056124505212
19、450481245040地址指針變量pipi+1pd+1pd3. 3. 同類型指針間的比較和相減運(yùn)算同類型指針間的比較和相減運(yùn)算指針間的比較和減法運(yùn)算,主要用于指向同一數(shù)組的兩個元素的兩個指針之間,例如整型數(shù)組a,定義:int a10;int *p1=&a1,*p2=&a4;如p1的值為2000,p2的值為2012,則p2-p1的值不等于12,而等于兩個數(shù)組元素下標(biāo)之差3,即兩個元素之間的相同類型數(shù)據(jù)的個數(shù),或者兩個指針之間的相同類型數(shù)據(jù)的個數(shù)。p1a0a1a3a4a2p24 4、給指針變量賦空值、給指針變量賦空值指針變量=NULLNULL;C語言中用NULL表示空指針,NUL
20、L是在stdio.h頭文件定義的預(yù)定義符,NULL的代碼值為0,稱為空指針空指針。若有語句:p=NULL;則表示指針p為空,并不指向任何確定的存貯單元。p1a&a10p2b&b20交換前兩個指針變量的指向如實(shí)線所示,交換后如紅線所示,改變了指針變量的值,但a、b兩個變量的值并沒有改變。&b&a例:交換兩個指針變量的值。#include main()int a=10,b=20,*p1,*p2,*p;p1=&a;p2=&b;printf(“交換前:*p1=%d,*p2=%dn”,*p1,*p2);p=p1;p1=p2;p2=p;printf(“交換后
21、:*p1=%d,*p2=%dn”,*p1,*p2);printf(“a=%d,b=%dn”,a,b);p1a&a10p2b&b20交換前后兩個指針變量的指向沒有改變,但它們所指向存貯單元的內(nèi)容變了,變量變量a,ba,b的值改變了,這是使的值改變了,這是使用指針最明顯的特征,通過指針改變所指向的變量的值用指針最明顯的特征,通過指針改變所指向的變量的值。p1a&a20p2b&b10交換前交換后例:交換兩個指針變量所指向的變量的值。#include main()int a=10,b=20,*p1,*p2,t;p1=&a;p2=&b;printf(“交換
22、前:a=%d,b=%dn”,a,b);printf(“*p1=%d,*p2=%dn”,*p1,*p2);t=*p1;*p1=*p2;*p2=t;printf(“交換后: a=%d,b=%dn”,a,b);printf(“*p1=%d,*p2=%dn”,*p1,*p2);關(guān)于運(yùn)算符“*”和“&”的討論,假定有定義:int x=10;int *px=&x;則通過“*”和“&”運(yùn)算,可以建立如下相當(dāng)關(guān)系:px &x: 指針px的值就是變量x的地址。*px x: *px就是px所指向的變量,即x。*&x *px x: 先對x取地址,就是x的指針&x,再對
23、指針進(jìn)行間接訪問,就是變量x。&*px &x px:先對指針進(jìn)行間接訪問運(yùn)算就得到x,再對x取地址,也就是x的指針?!?”和“&”都是一元運(yùn)算符,具有自右向左的結(jié)合性,低于自增/自減運(yùn)算符。例如,*px+,相當(dāng)于*(px+),即取與px所指單元相鄰的前一個單元中的內(nèi)容。(*px)+ ,為先取px所指單元的值,然后將其加1。分析結(jié)果分析結(jié)果#includemain() int n=10,*p=&n; *p=5; printf(“%dn”,n);#includemain() int a=2,b=4,c=6; int *pa=&a,*pb=&b,*p;
24、 *(p=&c)=*pa*(*pd); printf(“%dn”,c);C語言程序設(shè)計(jì)六、指向指針變量的指針與多級指針六、指向指針變量的指針與多級指針一個指針變量可以指向一個整型數(shù)據(jù),或一個實(shí)型數(shù)據(jù),或一個字符型數(shù)據(jù),也可以指向一個指針型數(shù)據(jù)。這就是指向指針的指針。指向指針的指針形成二級指針。一級指針pipddoublel類型int類型ppdppi二級指針C語言程序設(shè)計(jì)如下程序:int a=5,*p=&a則稱指針變量p指向a,變量p中存放的是a的地址。如果還有一個指針變量q,存放的是p的地址,則稱q指向p,q是一個二級指針。pa&a5qpa&p&a5C語
25、言程序設(shè)計(jì)訪問關(guān)系如下: *q等價于p; *p等價于a; *q等價于a;由q訪問到a,需要二級間接訪問: 從q的存貯單元中取得p的地址。 從p的存貯單元中取得a的地址。 再根據(jù)a的地址找到存貯單元取出5。C語言程序設(shè)計(jì)定義格式: 類型 *變量名;兩個*表示是二級指針變量,如果是三個*,同表示三級指針變量。例:二級指針應(yīng)用實(shí)例。#include main() int a=5,*p,*q; p=&a;q=&p; printf(“&a=%ld,a=%dn”,&a,a); printf(“&p=%ld,p=%ld,*p=%dn”,&p,p,*p); pr
26、intf(“q=%ld,*q=%ld,*q=%dn”, q,*q,*q);C語言程序設(shè)計(jì)七、指向七、指向voidvoid類型的指針類型的指針格式:void *指針變量功能:定義一個指針變量,并不指向某一確定類型的數(shù)據(jù),僅僅是用來存放一個地址。應(yīng)用void類型的指針時,應(yīng)配合強(qiáng)制類型轉(zhuǎn)換進(jìn)行相應(yīng)的操作。C語言程序設(shè)計(jì)第二節(jié)第二節(jié) 指針與數(shù)組指針與數(shù)組一、數(shù)組元素的指針引用一、數(shù)組元素的指針引用1 1、數(shù)組名、數(shù)組名就是一維數(shù)組在內(nèi)存中的起始地址,更準(zhǔn)確地講,是第一個元素在內(nèi)存中的起始地址。如:int a5;注意:指針?biāo)拥臄?shù)與下標(biāo)相等。a0a1a2a3a4aa+1a+2a+3a+4C語言程序設(shè)計(jì)
27、對一維數(shù)組而言,各元素在內(nèi)存中是按下標(biāo)順序連續(xù)排列的,而且是占用連續(xù)的存貯空間,這樣當(dāng)知道第一個元素的首地址后,可以通過指針運(yùn)算(加1減1),訪問所有的元素。#include main() int i,a10; printf(請輸入 10 個數(shù)組元素值:); for(i=0;i=9;i+) scanf(“%d”,a+i); for(i=0;i=9;i+) printf(%d,*(a+i); C語言程序設(shè)計(jì)注意:數(shù)組一經(jīng)定義,數(shù)組名所代表的地址是不會改變的,所以以下的語句是非法的;a+;2 2、指向一維數(shù)組的指針、指向一維數(shù)組的指針由于數(shù)組元素連續(xù)地占用存貯空間,因此任何由數(shù)組下標(biāo)完成的功能,均
28、可由指向數(shù)組元素的指針變量來完成,且指針變量的值可以通過加減運(yùn)算,不斷地改變指向,從而指向不同的元素,訪問數(shù)組元素更加靈活。C語言程序設(shè)計(jì)int a5,*p;p=a;p+;指針變量加1減1的規(guī)則:a0a1a2a3a4pC語言程序設(shè)計(jì)例:指向數(shù)組的指針。#include main() int i,a10,*p; printf(請輸入 10 個數(shù)組元素值:); for(p=a,i=0;i =9;i+,p+) scanf(“%d”,p); for(p=a,i=0;i=9;i+,p+) printf(%d,*p); 輸出部分也可改為: for(p=a,i=0;i=9;i+) printf(%d,*p+
29、);*p+中,*和+優(yōu)先級相同,但按自右至左的結(jié)合性,相當(dāng)于*(p+) 。5757C語言程序設(shè)計(jì)上頁的程序也等價于如下的程序:#include main() int i,a10,*p; printf(請輸入 10 個數(shù)組元素值:); for(p=a,i=0;i=9;i+) scanf(“%d”,p+i); for(p=a,i=0;i=9;i+) printf(%d,*(p+i); C語言程序設(shè)計(jì)唯一的區(qū)別在于:指針變量的值可以改變,但數(shù)組名表示的地址值不能改變。3 3、指針變量帶下標(biāo)法訪問數(shù)組、指針變量帶下標(biāo)法訪問數(shù)組#include main() int i,a10,*p; printf(請
30、輸入 10 個數(shù)組元素值:); for(p=a,i=0;i=9;i+) scanf(“%d”,&pi); for(p=a,i=0;i=9;i+) printf(%d,pi); C語言程序設(shè)計(jì)可見,指向數(shù)組的指針與數(shù)組名幾乎有等同的作用,可以與數(shù)組名通用,且訪問更加靈活。訪問數(shù)組元素的幾種方法比較:#include main() int i,a5=1,3,5,7,9,*p; for(i=0;i=4;i+) printf(“%d”,ai); /*下標(biāo)法*/ for(i=0;i=4;i+) printf(“%d”,*(a+i); /*數(shù)組名訪問法*/ for(p=a,i=0;i=4;i+,p
31、+) printf(“%d”,*p); /*指針變量加1訪問法*/ for(p=a,i=0;i=4;i+) printf(“%d”,pi); /*指針變量帶下標(biāo)法*/ for(p=a,i=0;i=4;i+) printf(“%d”,*(p+i); /*指針變量加下標(biāo)法*/ C語言程序設(shè)計(jì)例:已知整型數(shù)組中的值在0至9的范圍內(nèi),統(tǒng)計(jì)每個整數(shù)的個數(shù)。建立一個有50個元素的數(shù)組a50,用隨機(jī)函數(shù)產(chǎn)生0-9之間的數(shù),給各元素賦初值。如:1,9,6,8,7,1,1,2,4,5,3,3,6,6,6,0,1,0,2,3,6,5,09的數(shù)碼共有10 個,需要10個計(jì)數(shù)器,建立有10元素的一個數(shù)組c10,其中c
32、0統(tǒng)計(jì)值為值為0 0的元素個數(shù)的元素個數(shù),c1統(tǒng)計(jì)值為值為1 1的元素個數(shù)的元素個數(shù),類推,c9統(tǒng)計(jì)值為值為9 9的元素個數(shù)的元素個數(shù),即c0為數(shù)字0的計(jì)數(shù)器,c9為數(shù)字9的計(jì)數(shù)器。C語言程序設(shè)計(jì)#include #include #define SIZE 50void getdata(int *s) /*給元素賦初值*/ int i; for(i=0;iSIZE;i+) si=rand()%10;C語言程序設(shè)計(jì)void stat(int *aa,int *cc) /*統(tǒng)計(jì)09數(shù)字的個數(shù)*/int i;for(i=0;i10;i+) cci=0;for(i=0;iSIZE;i+) C語言程序設(shè)
33、計(jì)嚴(yán)格地講,計(jì)數(shù)部分的Switch語句是思考此類問題的基本方式,由于下標(biāo)的特征,可以改為一條語句,故程序可改為如下:void stat(int *aa,int *cc) /*統(tǒng)計(jì)09數(shù)字的個數(shù)*/int i;for(i=0;i10;i+) cci=0;for(i=0;iSIZE;i+) ccaai+;C語言程序設(shè)計(jì)void outdata(int *cc) /*輸出統(tǒng)計(jì)結(jié)果*/int i;for(i=0;i10;i+) printf(“%d:%dn”,i,cci);main()int aSIZE,c10;getdata(a);stat(a,c);printf(“統(tǒng)計(jì)結(jié)果如下:”);outdat
34、a(c);C語言程序設(shè)計(jì)假定有多個字符串,按照數(shù)組與指針的關(guān)系組合,可以有如下幾種定義方式:char strMN;char *strN;char *str;C語言程序設(shè)計(jì)二、指向字符串的指針二、指向字符串的指針字符串的特征:字符串的特征:若干個字符組成的,以0為結(jié)束標(biāo)志的一個整體。1 1、字符串引用的方法、字符串引用的方法(1) 用字符數(shù)組存放一個字符串,可以通過數(shù)組名和格式聲明“%s”輸出該字符串,也可以通過數(shù)組名和下標(biāo)引用字符串中一個字符。(2) 用字符指針變量指向一個字符串常量,通過字符指針變量引用字符串常量。C語言程序設(shè)計(jì)初始化字符串指針初始化字符串指針在定義一個指針的同時,使其指向一
35、個字符串。如: char *p1=“Hello!”; char str110=“Welcome”,*p2=str1;C語言程序設(shè)計(jì)將字符串的首地址賦給指針變量將字符串的首地址賦給指針變量將一個字符串的首地址賦給一個指針變量。char str110=“Welcome”,*p;p=str1;puts(p);p=p+3;puts(p);使指針指向字符串str1的首地址。char *p;p=This is a string.使p指向一個字符串常量。C語言程序設(shè)計(jì)例:用字符指針實(shí)現(xiàn)字符串的復(fù)制操作。分析:定義兩個字符數(shù)組a和b,用“I am a student.”對a數(shù)組初始化。定義兩個指針p1,p2,
36、分別指向a和b,通過指針變量將a中的字符逐一復(fù)制到b中。I am astudent.0p1p2C語言程序設(shè)計(jì)#include main() char a=I am a student.,b20; char *p1,*p2; for(p1=a,p2=b;*p1!=0;p1+,p2+)*p2=*p1; *p2=0; printf(串a(chǎn)為:%sn,a); printf(串b為:%sn,b);C語言程序設(shè)計(jì)2 2、指針數(shù)組、指針數(shù)組即每一個數(shù)組元素是一個指針。即每一個數(shù)組元素是一個指針。char *ps5=“China”, “Japan”, “America”,.;定義了一個有5個元素的數(shù)組,每個元素
37、是一個指向字符串的指向字符串的指針指針。內(nèi)存中的分布形式如下:ps0China0ps1Japan0ps2America0ps30ps40C語言程序設(shè)計(jì)從占用內(nèi)存的情況看,沒有空閑的空間,空間的利用率較高。輸出語句如下:for(i=0;i5;i+) printf(“%s”,psi);C語言程序設(shè)計(jì)char c158=China,Japan,America;在內(nèi)存中分布如下:以最長的名稱字符數(shù)定義列數(shù),有一些空閑不用的元素。c10China0c11Japan0c12America0c130c140C語言程序設(shè)計(jì)指針數(shù)組比較適合用來指向若干個字符串,使字符串處理更加方便靈活可以分別定義一些字符串,然
38、后用指針數(shù)組中的元素分別指向各字符串由于各字符串長度一般是不相等的,所以比用二維數(shù)組節(jié)省內(nèi)存單元。C語言程序設(shè)計(jì)例:給若干字符串按字母順序排序,由小到大輸出。F o ll o w 0G r e a t0F O R T R A N 0C o m p u te r 0name0name1name2name3#include #include main()void sort(char *name ,int n); void print(char *name ,int n); char *name =Follow,Great, FORTRAN,Computer; int n=4; sort(name,
39、n); print(name,n); void sort(char *name ,int n) char *temp;int i,j,k; for (i=0;in-1;i+) k=i; for (j=i+1;j0) k=j; if (k!=i) temp=namei; namei=namek; namek=temp; void print(char *name ,int n) int i; for(i=0;in;i+) printf(“%sn”,namei); F o ll o w 0G r e a t0F O R T R A N 0C o m p u te r 0name0name1name
40、2name3C語言程序設(shè)計(jì)三、動態(tài)存貯分配三、動態(tài)存貯分配靜態(tài)存貯分配靜態(tài)存貯分配:遵循先定義、后使用的原則,分配存貯空間,變量一經(jīng)定義,分配的存貯空間是不變的。如:int i;為i分配固定的存貯單元,在它存在期間,始終占用固定的存貯單元。生存期結(jié)束了,分配的空間才會被釋放。動態(tài)存貯分配動態(tài)存貯分配:在程序運(yùn)行期間,根據(jù)存貯數(shù)據(jù)的需要,動態(tài)地申請一定的存貯空間,當(dāng)使用完畢,立即釋放所得的空間??捎糜跇?gòu)造一些特殊的數(shù)據(jù)結(jié)構(gòu)。在程序運(yùn)行時為指針分配一個連續(xù)的存儲空間,內(nèi)存的動態(tài)分配。動態(tài)分配的特點(diǎn)動態(tài)分配的特點(diǎn):由程序員控制,在需要時分配,在不需要時釋放,還可以根據(jù)需要改變所分配存儲空間的大小。這
41、些功能重要通過stdlib.h庫中的4個函數(shù)實(shí)現(xiàn)。 函數(shù)原型返 回功能說明void *malloc(unsigned int size);成功:返回所開辟空間首地址失?。悍祷乜罩羔樝蛳到y(tǒng)申請size字節(jié)的堆存儲空間void *calloc(unsigned int num, unsigned int size);成功:返回所開辟空間首地址失?。悍祷乜罩羔槹搭愋蜕暾坣um個size大小的堆空間void free(void *p);無返回值釋放p指向的堆空間void *realloc(void *p,unsigned int size);成功:返回新開辟空間首地址失?。悍祷乜罩羔槍指向堆空間變?yōu)?/p>
42、size大小C語言程序設(shè)計(jì)1 1、分配內(nèi)存空間函數(shù)、分配內(nèi)存空間函數(shù)mallocmalloc格式: 指針變量(類型說明符*)mallocmalloc(空間長度)功能:在內(nèi)存的動態(tài)存儲區(qū)中分配一塊指定長度的連續(xù)區(qū)域。函數(shù)的返回值為該區(qū)域的首地址,如果分配失敗,返回空指針?!邦愋驼f明符”表示把該區(qū)域用于存貯何種數(shù)據(jù)類型。(類型說明符*)表示把返回值強(qiáng)制轉(zhuǎn)換(malloc函數(shù)的原返回類型為Void)為該類型指針。“空間長度size”是一個無符號數(shù)。C語言程序設(shè)計(jì)例如: pc=(char *)malloc(100);表示分配100個字節(jié)的內(nèi)存空間,并強(qiáng)制轉(zhuǎn)換為字符數(shù)組類型,函數(shù)的返回值為指向該字符數(shù)組
43、的指針,把該指針賦予指針變量pc。如果沒有足夠的內(nèi)存單元供分配,則函數(shù)返回空(NULL)。C語言程序設(shè)計(jì)2 2、分配內(nèi)存空間函數(shù)、分配內(nèi)存空間函數(shù) calloccalloc 格式: 指針變量(類型說明符*)calloccalloc(n,size)功能:在內(nèi)存動態(tài)存儲區(qū)中分配n塊長度為“size”字節(jié)的連續(xù)區(qū)域。函數(shù)的返回值為該區(qū)域的首地址。(類型說明符*)用于強(qiáng)制類型轉(zhuǎn)換。calloc函數(shù)與malloc 函數(shù)的區(qū)別僅在于一次可以分配n塊區(qū)域。C語言程序設(shè)計(jì)例如: ps=(int *)calloc(2,sizeof(int);等價于: ps=(int *)malloc(2*sizeof(int)
44、;其中的sizeof(int)是求int型數(shù)據(jù)的存貯長度。因此該語句的意思是:按int的長度分配2塊連續(xù)區(qū)域,強(qiáng)制轉(zhuǎn)換為int類型,并把其首地址賦予指針變量ps。sizeofsizeof是一個操作符,sizeof(數(shù)據(jù)類型符)的值就是該數(shù)據(jù)類型所占用的字節(jié)數(shù)。C語言程序設(shè)計(jì)3 3、釋放內(nèi)存空間函數(shù)、釋放內(nèi)存空間函數(shù)freefree格式: freefree(指針);功能:釋放指針?biāo)赶虻囊粔K內(nèi)存空間,指針是一個任意類型的指針變量,它指向被釋放區(qū)域的首地址。被釋放區(qū)應(yīng)是由malloc或calloc函數(shù)所分配的區(qū)域。C語言程序設(shè)計(jì)4 4、內(nèi)存空間重新分配函數(shù)、內(nèi)存空間重新分配函數(shù)realloc格式:
45、 realloc realloc(指針變量名,空間長度);功能:改變用malloc函數(shù)或calloc函數(shù)分配后的空間大小,即重新分配。用realloc函數(shù)將p所指向的動態(tài)空間的大小改變?yōu)橹付ǖ拇笮?。p的值不變。如果重分配不成功,返回NULL。如: realloc(p,50); 將p所指向的已分配的動態(tài)空間改為50字節(jié) 函數(shù)的包含文件:stdlib.h。C語言程序設(shè)計(jì)例:分配一個20字節(jié)大小的空間。#include #include #include main() char *p; p=(char *)malloc(20); strcpy(p,come in please,n); printf(
46、“%s”,p); free(p);pC語言程序設(shè)計(jì)例:定義兩個整型指針,分別動態(tài)分配存放一個整數(shù)的空間,對調(diào)兩者的值,并輸出。#include #include main()int *a,*b,t;a=(int *)malloc(sizeof(int);b=(int *)malloc(sizeof(int);printf(“請輸入兩個整數(shù):”);scanf(“%d%d”,a,b);printf(“對調(diào)前:%d,%dn”,*a,*b);t=*a;*a=*b;*b=t;printf(“對調(diào)后:%d,%dn”,*a,*b);free(a);free(b);C語言程序設(shè)計(jì)ab345987所申請的空間a
47、,b分別存放所申請的空間的地址,然后借助于a,b指針對所分配的空間中的數(shù)據(jù)進(jìn)行操作。5、動態(tài)數(shù)組的建立數(shù)組就是用于存儲同類型數(shù)據(jù)的連續(xù)空間。在C語言中,這個空間可以用下標(biāo)形式表示,也可以用指針形式表示。動態(tài)數(shù)組,在需要時建立數(shù)組,不需要時釋放。例例: : 為為 40 40 個個 int int 數(shù)據(jù)動態(tài)分配空間數(shù)據(jù)動態(tài)分配空間, ,并賦值和輸出并賦值和輸出#include #include main( ) int i , *p ; p = (int *)malloc(40*sizeof( int) ; if( p=NULL ) printf ( out of memony n ) ; exit
48、( ); for( i=0;i40; i+) *(p+i)=i; for(i=0;i40;i+) printf ( %d , *( p + i ) ) ; free( p ); 例: 分析下列程序,其功能是什么?#include #include void f(int *p)int i=0,j=9,t;while(ij)t=*(p+i);*(p+i)=*(p+j);*(p+j)=t;i+;j-;void main()void f(int *p);int *p,i;p=(int *)malloc(10*sizeof(int);for(i=0;i10;i+)scanf(%d,p+i);f(p);f
49、or(i=0;i10;i+)printf(%4d,*(p+i);free(p);C語言程序設(shè)計(jì)第三節(jié)第三節(jié) 指針與函數(shù)指針與函數(shù)指針與函數(shù)的關(guān)系,主要表現(xiàn)在如下兩個方面:用指針作為函數(shù)參數(shù);函數(shù)的返回值是指針;一、指針參數(shù)與函數(shù)的地址傳送調(diào)用一、指針參數(shù)與函數(shù)的地址傳送調(diào)用參數(shù)傳遞的兩種形式:傳值傳值:將實(shí)參的值傳遞給對應(yīng)的形參,單向傳遞單向傳遞。傳址傳址:將一個地址傳遞給對應(yīng)的形參。C語言程序設(shè)計(jì)【例】如下的函數(shù):Main() int a=3,b=4,c=5; void fun(int aa,int bb,int cc); fun(a,b,c); pritnf(“a=%d,b=%d,c=%d
50、n”,a,b,c);void fun(int aa,int bb,int cc) aa+=2;bb+=2;cc=aa+bb; pritnf(“aa=%d,bb=%d,cc=%dn”,aa,bb,cc); return;3a4b3aa4bb5c5cc5611調(diào)用過程調(diào)用過程C語言程序設(shè)計(jì)指針類型也可以作為函數(shù)的參數(shù),它的作用是將一個變量的地址傳送到另一個函數(shù)中。指針作參數(shù),就是傳送地址的值,并且要求在實(shí)參與形參之間傳送類型相同的數(shù)據(jù)的地址,其中包括同樣的級別。而就形式而言,形參與實(shí)參之間的關(guān)系各如圖所示幾種。數(shù)組名變量地址指針變量指針變量數(shù)組名實(shí)參形參傳送地址1. 1. 簡單變量地址傳送簡單變量
51、地址傳送定義格式:類型 函數(shù)名(類型 *形參1,類型 *形參2)C語言程序設(shè)計(jì)【例】輸入的兩個整數(shù)按從大到小的順序輸出。用指針類型的數(shù)據(jù)作函數(shù)的參數(shù)。swap(int *p1,int *p2) int temp; temp=*p1; *p1=*p2; *p2=temp;C語言程序設(shè)計(jì)main() int a,b;int *pa,*pb;scanf(“%d%d”,&a,&b);pa=&a;pb=&b;if(ab) swap(pa,pb);printf(“n%d,%dn”,a,b);C語言程序設(shè)計(jì)函數(shù)中交換前函數(shù)中交換前函數(shù)中交換后函數(shù)中交換后主函數(shù)中交換前主函數(shù)中
52、交換前papbpapbpapbC語言程序設(shè)計(jì)通過函數(shù)調(diào)用,改變了主函數(shù)中變量的值。主函數(shù)中交換后主函數(shù)中交換后papb2. 2. 數(shù)組地址傳送數(shù)組地址傳送傳輸數(shù)組地址,使主調(diào)函數(shù)和被調(diào)函數(shù)在同一個數(shù)組上進(jìn)行操作,避免了傳送數(shù)組實(shí)體所造成的程序效率不高。(1)數(shù)組名數(shù)組名傳輸數(shù)組名到數(shù)組名之間的數(shù)組地址傳輸方式。#include #define N 10int main(void) void ArrMax(int ,int * ,int n);int arrayN=1,8,10,2,-5,0,7,15,4,-5;int max,*p=&max;ArrMax(array,p,N);prin
53、tf (“max=%d”,max);return 0;void arrMax(int arr,int *pt,int n) int i;*pt=arr0;for (i=1;i*pt) *pt=arri;運(yùn)行結(jié)果如下:max=15(2)指針數(shù)組名傳輸#include #define N 10int main(void) void ArrMax(int *,int * ,int n);int arrayN=1,8,10,2,-5,0,7,15,4,-5;int max,*p=&max;ArrMax(array,p,N);printf (“max=%d”,max);return 0;void
54、 ArrMax(int *arr,int *pt,int n) int i;*pt=arr0;for (i=1;i*pt) *pt=arri;執(zhí)行結(jié)果還是:max=15說明:本例的主函數(shù)調(diào)用函數(shù)main()時,傳送了三個參數(shù):數(shù)組名:在函數(shù)ArrMax()中使用下標(biāo)方式引用主函數(shù)中的數(shù)組array。指向變量max的指針:用于在函數(shù)ArrMax()中引用主函數(shù)中的變量max,把通過與array中的每個元素比較,始終在max中放最大的元素。 數(shù)組大?。河糜诳刂浦貜?fù)結(jié)構(gòu)的循環(huán)次數(shù)。C語言程序設(shè)計(jì)3. 字符指針參數(shù)如果想把一個字符串從一個函數(shù)“傳遞”到另一個函數(shù),可以用地址傳遞的辦法,即用字符數(shù)組名作
55、參數(shù),也可以用字符指針變量作參數(shù)。在被調(diào)用的函數(shù)中可以改變字符串的內(nèi)容,在主調(diào)函數(shù)中可以引用改變后的字符串。int stringlen(const char *str)int len=0;while(*str+) len+;return len;int stringlen(char str) int i=0,len=0;while(stri+) len+;return len;嚴(yán)格地講,循環(huán)條件為:(*str+) != 0“const”,表明在本函數(shù)的執(zhí)行過程中,要將字符串“鎖定”,即不允許對字符串作任何改變。說明:(1)求字符串長度的函數(shù):int stringlen(char str)int
56、 i=0,len=0;while(stri+) len+;return len;由于指向字符的指針與字符數(shù)組類型相同,所以,*str+與stri+等價。但是采用指針使程序更為簡潔,不需要定義數(shù)組。(2)在參數(shù)傳遞時,實(shí)參是要計(jì)算長度的字符串名,即字符數(shù)組名。而該字符數(shù)組是已經(jīng)被分配類空間的。這個函數(shù)中字符指針的活動范圍是從字符串的起始地址到字符串結(jié)束標(biāo)志符之間,當(dāng)某一次循環(huán)中遇到字符串結(jié)束標(biāo)志符0時,*str的值為0(0的ASCII碼為0),while中表達(dá)式為假,循環(huán)中止,因而不會出現(xiàn)超界問題。(3)這個函數(shù)在參數(shù)表中使用了“const”,它表明在本函數(shù)的執(zhí)行過程中,要將字符串“鎖定”,即不
57、允許對字符串作任何改變。因?yàn)椋瘮?shù)的功能只是求字符串的長度。C語言程序設(shè)計(jì)例:用函數(shù)調(diào)用實(shí)現(xiàn)字符串的復(fù)制#include main() char a=I am a student.,b20; void string_copy(char *p1,char *p2); string_copy(a,b); printf(串a(chǎn)為:%sn,a); printf(串b為:%sn,b);C語言程序設(shè)計(jì)void string_copy(char *p1,char *p2) for(;*p1!=0;p1+,p2+)*p2=*p1; *p2=0; return;void *stringcopy(char *des
58、t, const char *src)char *temp=dest;while(*dest+=*src+) ;return temp;說明:(1)由于目標(biāo)字符串要改變,而源字符串只是復(fù)制,所以僅用const修飾源字符串。(2)temp是一個指向字符的指針,用它來保存目的串的首地址。因?yàn)樵趶?fù)制的過程中,隨著一連串的自增操作,dest的值不再指向目的串的首地址。下面再看一個函數(shù)。int stringcomp(const char *s1, const char *s2)for(;*s1=*s2;s1+,s2+) if(!*s1) return 0;/字符串相等return *s1-*s2;即:條
59、件成立,且s1指向的字符是0時,返回0。反之,條件不成立,退出循環(huán)時,返回不相等字符的差。說明:(1)這個函數(shù)由一個for循環(huán)結(jié)構(gòu)組成。循環(huán)的初始條件就是s1指向進(jìn)行比較的一個字符串的首地址,s2指向另一個字符喘的首地址。這個條件已經(jīng)在參數(shù)傳遞時實(shí)現(xiàn)了,所以在for結(jié)構(gòu)中初始條件確省。(2)該函數(shù)中for循環(huán)的條件是:*s1=*s2,即兩個指針的當(dāng)前應(yīng)用相等,也即對應(yīng)位置的字符相同,就再比較下一個字符。(3)for循環(huán)中的修正表達(dá)式為:s1+,s2+。從而保證兩個指針分別指向各自的字符串中的相同位置。(4)表達(dá)式if(!*s1) return 0意思是當(dāng)s1指向字符0時,函數(shù)返回0。實(shí)際上,由
60、于這個條件表達(dá)式是在for結(jié)構(gòu)中的,而for結(jié)構(gòu)的重復(fù)條件是*s1=*s2,即兩個字符指針當(dāng)前指向的字符相等。所以當(dāng)s1指向字符串結(jié)束符時,s2也一定是指向了字符串結(jié)束符,也就是兩個字符串都結(jié)束,用返回0表示兩個字符串完全相同。#include #define N 80void delchar (char *p,char x) char *q=p;for (;*p!=0;p+) if (*p!=x) *q+=*p;*q=0;int main(void) void delchar(char *p,char x);char cN,*pt=c,x;printf(enter a string:);gets(pt);printf(enter the character deleted:);x=getchar( );delchar(pt,x);printf(The new string is:%sn,c);運(yùn)行情況如下:enter a string: I have 50 Yuan. enter the character deleted:0 The new string is:I have 5 Yuan.刪除串中指定的字符并賦值本程序的功能:在主函數(shù)中,定義字符數(shù)組c并使pt指向c;從鍵盤輸入字符串和需要刪去的字符;然后調(diào)用delchar()
溫馨提示
- 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024-2025學(xué)年度廣西部分學(xué)校高一第一學(xué)期12月階段性考試歷史試題
- 主管護(hù)師(兒科護(hù)理)資格考試題庫(含各題型)
- 紙箱制作課程設(shè)計(jì)
- 中考語文散文閱讀的答題技巧
- 愛國微課程設(shè)計(jì)
- 2024年用電監(jiān)察員(用電檢查員)技師職業(yè)鑒定考試題庫(含答案)
- 網(wǎng)絡(luò)營銷教學(xué)課程設(shè)計(jì)
- 彩燈控制器課程設(shè)計(jì)報告
- 英文字典app課程設(shè)計(jì)
- 花樣年華房地產(chǎn)商合同三篇
- 國際政治學(xué)概論,宋新寧、陳岳
- 能源行業(yè)智能電網(wǎng)與需求響應(yīng)管理系統(tǒng)方案
- 2024至2030年電子壓力計(jì)項(xiàng)目投資價值分析報告
- GB/T 44747.1-2024建筑施工機(jī)械與設(shè)備固定式混凝土布料機(jī)第1部分:術(shù)語和商業(yè)規(guī)格
- 地質(zhì)災(zāi)害治理工程竣工報告
- 《濟(jì)南聯(lián)通公司成本管理問題及解決策略7000字論文》
- 程序員個人年終總結(jié)
- 五年級上冊英語期末必考易錯題
- 心腦血管疾病預(yù)防課件
- 科研倫理與學(xué)術(shù)規(guī)范-期末考試答案
- 數(shù)字后端工程師招聘筆試題與參考答案2024年
評論
0/150
提交評論