海大曲少珍C程 手冊10_第1頁
海大曲少珍C程 手冊10_第2頁
海大曲少珍C程 手冊10_第3頁
海大曲少珍C程 手冊10_第4頁
海大曲少珍C程 手冊10_第5頁
已閱讀5頁,還剩9頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)

文檔簡介

1、第10章 指針 1414第10章 指針第一部分:練習(xí)(一) 填空1. 指針變量中存儲的值實際上是另一個數(shù)據(jù)的_。2. 可以直接賦給指針變量的值只有三個即 _、_和_。3. 若有語句int a3=1,2,3,*p; p=a;則表達(dá)式(*p)+、 *(p+)、*p+ 的值分別是 _、_、_,每個表達(dá)式執(zhí)行完畢后指針p的位置是 _、_、_。4. 訪問一維整型數(shù)組a各個元素的指針變量定義形式為_ ,要想該指針指向這個數(shù)組的首元素,則要執(zhí)行語句_。5. 訪問3行4列的二維整型數(shù)組b各個元素的指針變量定義形式為 _ ,要想該指針指向數(shù)組的首元素,則要執(zhí)行語句_;訪問二維整型數(shù)組各行的指針變量定義形式為 _

2、 ,要想該指針指向數(shù)組的首行,則要執(zhí)行語句_ 。6. 若有語句:int a3=1,2,3, *p ; p=a;則數(shù)組下標(biāo)為2的元素用指針形式引用為:_。7. 若有語句:int a33=1,2,3,4,5,6,7,8,9, *p1, (*p2)3;p1=&a00; p2=a; 則第1行第2列的元素用指針p1引用形式為 _ ,該元素用指針p2引用形式為_ 。8. 若有定義 char *p3;則該語句定義的是 _ ,其訪問的數(shù)據(jù)類型為_。9. 若有定義 char (*p)3;則該語句定義的是 _ ,其訪問的數(shù)據(jù)類型為 _ 。10. 若有定義int *q4;若想定義一指針變量p指向其首地址,則

3、指針的定義和初始化形式為_ 。11. 如果一個函數(shù)的返回值是一個地址,則該函數(shù)的函數(shù)名前必須添加一個 _ 。12. 若有函數(shù)原型void aver( char *, char *),則定義訪問該函數(shù)的指針形式為 _ ,要想指針指向該函數(shù)需執(zhí)行語句_ 。13. 對于指針變量只能進行有限的幾種運算,特別是指針指向數(shù)組時這些運算才有意義,試舉出幾種指針運算_、_、_、_、_、_。(二) 簡答1對于沒有正確初始化的指針,或者這個指針沒有指向內(nèi)存中的特定位置,當(dāng)程序員要使用形式“*指針名”時,會發(fā)生什么情況?這時會出現(xiàn)什么錯誤?(三) 分析程序1下面程序的運行結(jié)果是: #include <stdi

4、o.h>void swap(int ,int);void main()int a=5,b=7; swap(a,b); printf("a=%d,b=%dt", a,b);void swap(int x, int y) int t; t=x; x=y; y=t; printf("x=%d, y=%dt", x,y);2.下面程序的運行結(jié)果是:#include <stdio.h>void swap(int *,int *);void main()int a=5,b=7; swap(&a,&b); printf("a

5、=%d,b=%dt", a,b);void swap(int *x, int *y) int t; t=*x; *x=*y; *y=t; printf("x=%d, y=%dt", *x,*y);3. 下面程序段的運行結(jié)果是: char s20=“abcd”; char *p = s; p+; puts(strcat(p, “ABCD”)4. 下面程序的運行結(jié)果是:#include <stdio.h>void main() char *strc( char *str1, char *str2); char s180 ="computer&qu

6、ot; , s2="language", *pt; pt = strc(s1,s2); printf("%sn", pt);char *strc( char *str1, char *str2) char *p; for(p=str1; *p!='0' p+) do *p+ = *str2+ ; while(*str2!= '0') ; *p='0' return str1;5. 若有以下輸入 1,2<CR>,則下面程序的運行結(jié)果是:#include <stdio.h>void ma

7、in() int a23=2,4,6,8,10,12; int (*p)3, i, j; p=a; scanf("%d,%d", &i, &j); printf("a%d%d=%dn" , i, j, *(*(p+i)+j);第二部分:實驗實驗(一)龜兔賽跑1實驗?zāi)繕?biāo)在本實驗中,學(xué)生將實驗:þ 傳址調(diào)用,子函數(shù)能直接修改主調(diào)函數(shù)中的數(shù)據(jù)在強化練習(xí)中,學(xué)生將實踐þ 比較傳值調(diào)用與傳址調(diào)用函數(shù)的區(qū)別。在傳值調(diào)用函數(shù)中,傳遞的是參數(shù)的副本,而在傳引用調(diào)用函數(shù)中,傳遞的是參數(shù)的地址。þ 復(fù)引用指針(*指針名)以訪問存

8、儲在特定內(nèi)存地址的數(shù)據(jù)。2實驗描述本程序模擬龜兔賽跑問題。程序?qū)⒉捎蒙呻S機數(shù)的方法開發(fā)這一問題的仿真程序。在此比賽中共設(shè)了70個點,每個點代表比賽跑道中可能的一個位置。烏龜和兔子從第1個點出發(fā),終點是在第70個點上。時鐘按秒來計算。隨著時鐘的移動,程序能夠根據(jù)下述規(guī)則來調(diào)節(jié)烏龜和兔子的位置。動物跑動類型占用時間跑動量烏龜快走后滑慢走502030向右3個點向左6個點向右1個點兔子睡覺大后滑快走小步跳慢后滑2020103020不動向左9個點向右12個點向右1個點向左2個點動物從位置1(起跑線)開始比賽。如果動物從點1處向左移動,那么就將此動物重新放回點1的位置。隨著時鐘的轉(zhuǎn)動(每次重復(fù)循環(huán)),打

9、印出烏龜所在的位置和兔子所在的位置,分別以T和H表示。在某些偶然的情況下,參賽者會位于同一點上,在這種情況下,是烏龜贏了兔子。程序應(yīng)在這一位置上打印“”。除了“T”“H”“”外的所有的打印位置都是空白的。打印完每一行后,測試一下兩個動物是否己經(jīng)達(dá)到或超過點70位置。如果超過,就將獲勝者的名字打印出來,并終止程序的模擬過程。如果烏龜贏了,那么打印“TORTOISE WINS! YAY!”,如果兔子贏了,打印“Hare wins. Yuch.”。如果兩個動物都沒有贏,那么重新執(zhí)行循環(huán),模擬下一輪的情況。 3輸出結(jié)果。4問題解決技巧(1) 變量tortoise和變量hare分別存儲了烏龜和兔子的當(dāng)前

10、位置(聲明為170的整型數(shù))。這兩個變量都為main所有,但程序希望在函數(shù)調(diào)用(如moveT和moveH)過程中時對其進行修改,因此它們必須采用傳址方式。(2) 對指針?biāo)L問的數(shù)據(jù)引用應(yīng)用形式“*指針名”。(3) 程序中要生成一個隨機整數(shù)i來表示描述中的百分比,i的范圍為1<=i<=10。對于烏龜而言,當(dāng)1<=i<=5時為快走,當(dāng)6<=i<=7時為后滑,當(dāng)8<=i<=10時為慢走。兔子的跑動方式與其類似。(4) 因程序運行結(jié)果較長,TC2.0受結(jié)果窗口的限制只能看到最后面的部分結(jié)果,若在c-free下運行可看到完整的運行結(jié)果。5. 程序模板/*r

11、ace.c*/#include <stdio.h>#include <stdlib.h>#include <time.h>#define RACE_END 70/*函數(shù)moveT的聲明*/*函數(shù)moveH的聲明*/*函數(shù)printCP的聲明*/void main() int tortoise =1 , hare =1 , timer = 0; srand(time(0); printf("ON your mask, Get setnBang!nAND they're off !n"); while(tortoise!= RACE_

12、END && hare != RACE_END) /*調(diào)用函數(shù)moveT*/ /*調(diào)用函數(shù)moveH*/ /*調(diào)用函數(shù)printCP*/ +timer; if(tortoise >= hare) printf("nTortoise wins! YAY!n" ); else printf("Hare wins . Yuch.n"); printf("Total %d seconds.n" ,timer);/*編寫函數(shù)moveT的定義頭部*/ int x=1+rand()%10; if(x>=1 &&a

13、mp; x<=5) /快走 *pT += 3; else if (x>=6 && x<=7) /后滑 *pT -= 6; else (*pT)+; /慢走 if( *pT <1 ) *pT = 1; else if(*pT > RACE_END) *pT = RACE_END;/*編寫函數(shù)moveH定義頭部*/ int x = 1 +rand() % 10; /*編寫語句移動兔子*/ /*編寫語句測試兔子是否還沒開始起跑或者超出終點,處理這種情況*/*編寫函數(shù)printCurrentPosition定義*/ int i; if(*pT = *pH)

14、 /*編寫語句,打印兔子和烏龜?shù)奈恢?/ else if(*pT < *pH) /*編寫語句,打印兔子和烏龜?shù)奈恢?/ else /*編寫語句,打印兔子和烏龜?shù)奈恢?/ printf("n") ;6強化練習(xí)(1) 這里的龜兔賽跑問題能否用傳值調(diào)用函數(shù)來模擬?為什么用傳址調(diào)用函數(shù)更方便?(2) 當(dāng)用指針引用其訪問的數(shù)據(jù)時,如果忘記寫“*”,會發(fā)生什么情況?這是語法錯誤嗎?請說明這種錯誤的后果。(3) 下面的語句有何錯誤?int *p_race = 70;實驗(二)洗牌和發(fā)牌1實驗?zāi)繕?biāo)在本實驗中,學(xué)生將實驗:þ 函數(shù)之間傳遞二維數(shù)組þ 函數(shù)之間傳遞指針

15、數(shù)組þ 訪問字符串的指針數(shù)組定義和初始化2實驗描述本程序模擬洗牌和發(fā)牌的動作。一幅撲克牌有四種花色,每個花色有113個面值,共有52張牌。程序中的suit數(shù)組指向四種花色: Hearts(紅心)、 Clubs(草花)、Diamonds(方片)、Spades(黑桃)。程序中的shuffle函數(shù)模擬了洗牌操作,將4×13張牌指定一個洗牌后的發(fā)牌序號(152)。要求補充完整程序。3輸出結(jié)果4程序模板/*shuffle.c */#include <stdio.h>#include <string.h>#include <time.h>#inclu

16、de <stdlib.h>/*編寫函數(shù)deal的函數(shù)原型*/;void shuffle(int 13);void main() char *suit4="Hearts", "Clubs","Diamonds","Spades" char *face13="A","2","3","4","5","6","7","8","9",&

17、quot;10","J","Q","K" /*編寫語句定義數(shù)組color,并指向兩個字符串“Red”和“Black”*/; int deck413=0; shuffle(deck); deal(deck, face , suit ,color);void deal(int sDeck13, char *sFace, char *sSuit,char *sColor) int card, row, column; for(card=1; card<=52 ; card+) for(row=0; row<=3; ro

18、w+) for(column=0; column<=12 ; column+) if(sDeckrowcolumn = card) printf("%10s of %10s ", sFacecolumn, sSuitrow) ; /*編寫語句,顯示該牌面是紅色還是黑色*/; /*編寫語句,判斷是否需要顯示代表人頭的星號,如果需要顯示出來*/; printf("%s", (card%2 =0 )? "n" :"t"); void shuffle(int sDeck13) int card,row,column,

19、i=0; srand(time(0); for(card =1; card<=52; card+) do row = rand()% 4; column = rand()%13; while(sDeckrowcolumn!=0); sDeckrowcolumn= card ; 5問題解決技巧(1) 數(shù)組deck中存放的是4×13 張撲克的發(fā)排順序號。(2) 數(shù)組suit指定了4種花色的順序,即Hearts(紅心)對應(yīng)著數(shù)組deck的第1行、 Clubs(草花)對應(yīng)著數(shù)組deck的第2行、Diamonds(方片)對應(yīng)著數(shù)組deck的第3行、Spades(黑桃)對應(yīng)著數(shù)組deck的

20、第4行(3) color數(shù)組的初始化顏色順序與suit花色的順序有關(guān)。實驗(三)查找子串1實驗?zāi)繕?biāo)在本實驗中,學(xué)生將實驗:þ 訪問函數(shù)的指針(函數(shù)指針)應(yīng)用,函數(shù)指針的定義、賦值和調(diào)用þ 返回指針的函數(shù)(指針函數(shù))應(yīng)用,返回一個地址2實驗描述main函數(shù)給出兩個串string1和sting2,調(diào)用函數(shù)finds實現(xiàn)這樣的功能:在串string1中查找是否包含有子串string2,如果找到第1個sting2則返回其所在位置(string2第0個字符的地址),如果沒有找到則返回NULL。3輸出結(jié)果4問題解決技巧設(shè)計如下算法實現(xiàn)子串的查找:從sting1的第1個字符開始遍歷,每指

21、向一個字符時,將從該字符開始的n個字符與串string2的n個字符依次比較是否相同。如果比較發(fā)現(xiàn)一對字符不相同則將I后移一個位置,準(zhǔn)備比較從I+1位置開始的n個字符。如果比較到了string2的末尾0,說明從當(dāng)前位置I開始找到了一個與串string2相同的子串,則將I的位置返回主調(diào)函數(shù)。如圖所示,可設(shè)置I,j,k三個變量,I指示每次開始比較的子串的首位置。j和k的變化是同步的,比較sting1j和string2k是否相等。5程序模板/*findsub.c*/#include <stdio.h>char * finds(char *, char *);void main() char

22、 string180, string280,*q; /*指針q用來接收函數(shù)調(diào)用的返回值*/ /*編寫語句,定義訪問finds函數(shù)的指針變量pf*/ printf("enter your string:n"); gets(string1); printf("enter your substing:n"); gets(string2); /*編寫語句實現(xiàn)將指針pf指向函數(shù)finds*/ q=/*編寫語句實現(xiàn)用指針向finsd函數(shù)傳遞參數(shù)string1和string2*/ if(q=NULL) printf("There is no string %

23、s.n", string2); else printf("your sub string is at location %dn", q-string1+1);char *finds(char *s1, char *s2)/*編寫函數(shù)體語句,實現(xiàn)子串的查找功能并返回其地址*/6強化練習(xí) 若程序要統(tǒng)計給出的主串中所包含子串的個數(shù),請重新編寫程序完成功能。實驗(四)調(diào)試本部分程序是調(diào)用output函數(shù)數(shù)出5個國家名。程序編譯運行出現(xiàn)錯誤,請比較輸出結(jié)果與正確的實例輸出,對可能存在的邏輯錯誤或者語法錯誤進行修改。1. 正確的實例輸出2. 錯誤的程序代碼/*debug.c*

24、/#include <stdio.h>void output(char *p, int row) int i; for(i=0;i<row;i+) puts(pi);void main() char array520="Hongkang","China","America","Japan","Germen" printf("nyour country is:n"); output(array,5);第三部分:測試(一)選擇1 下面四組對指針變量操作的語句,正

25、確的判斷選項是 _ 。 (1) int *p, *q ; p=q;int x, *p ,*q; p=q=&x;(2) int x, *p ,*q; p=&x ; q= *p ;int x=30, *p ; *p=x ;(3) int x=y=3, *p ; p=&x ; y=*p; int x=20, *p, *q=&x ; *p = *q;(4) int x=30; *p, *q=&x ; p=q; int p, *q; q=&p;A) 正確(1);不正確(2)(3)(4)B) 正確(1)(4);不正確(2)(3)C) 正確(3);不正確(1)

26、(2)(4)D) 正確(4);不正確(1)(2)(3)2 以下程序中調(diào)用scanf函數(shù)給變量a輸入數(shù)值的方法是錯誤的,其錯誤原因是 _ 。void main() int *p, x; p=&x; printf(“enter x:n”); scanf(“%d”, *p); . A) *p表示指針變量p的地址B) *p表示變量x的值而不是x的地址C) *p表示的是指針變量p的值D) *p中的*只能做標(biāo)識符不能做運算符3 下面程序段有錯誤,錯誤原因是 _ 。int *p, x ;char *q, ch;q= &ch;p= &x;*p=30;*q=*p;A) *p表示地址,因此

27、不能執(zhí)行 *p=30;B) q沒有指向具體的存儲單元,所以*q沒有實際意義C) p和q的類型不一致,所以不能執(zhí)行 *q= *p;D) q雖然指向了具體的存儲單元,但該單元中沒有確定的值,所以不能執(zhí)行 *p= *q;4 若有圖1所示的存儲結(jié)構(gòu),如果要實現(xiàn)圖2所示的存儲結(jié)構(gòu)則正確的賦值語句是_ 。A) *q= *p;B) q = p;C) q = *p;D) *q = p;5若有說明:int *p, a=5, b; 以下正確的程序段是 _ 。A) p=&b ; scanf(“%d”, &p); B) p=&b; scanf(“%d”,*p);C) scanf(“%d”, &

28、amp;b); *p=b;D) p=&b; *p=a;6下面正確的說法是 _ 。A) char *p=“china”;等價于 char *p ; *p=“china”;B) char s10=“china”; 等價于char s10; s =“china”;C) char *p=“china”; 等價于 char *p ; p=“china”;D) char s15=“china”, s2=“china”; 等價于char s1=s2=“china”;7下面程序的運行結(jié)果是 _。char *q=“germen”;q=q+3; printf(“%d”,q);A) men B)字符m C)

29、不確定的值D)字符m的地址8設(shè)有程序段:char a=”china”; char *p; p=a ;則下面敘述正確的是 _ 。 A) a 和p完全相同B) 數(shù)組a中的內(nèi)容和指針變量p中的內(nèi)容相同C) 指針變量p中存放的是字符cD) a0與*p相同9下面正確的程序段是 _。A) char s10; scanf(“%s”, &s);B) char *p; scanf(“%s”, p);C) char s10; scanf(“%s”, &s2);D) char s10, *p=&s; scanf(“%s”, p2);10下面正確的程序段是 _。A) char s1=“123”

30、, s2=”abcdef”; strcpy(s1,s2);B) char s10, *p = “abcde”; strcat(s, p);C) char s10= “ ”, *p=“abcde”; strcat(s, p);D) char *p1=“12345”, *p2=“abcde”; strcat(p1,p2);11下面程序段的運行結(jié)果是 _。char *p=“abcdefgh”;p+=3; printf(“%d”, strlen(strcpy(p, “ABCD”);A) 8B)12C)4D)712下面程序段的運行結(jié)果是 _。char a=“l(fā)anguage”, *p;p=a;while

31、(*p != u) printf(“%c” , *p-32 ); p+ ;A) LANGUAGEB)languageC)LANGD)langUAGE13若有說明語句 char a=”It is mine”; char *p=”It is mine”;則以下不正確的敘述是 _。A) a+1表示的是字符t的地址B) p指向另外的字符串時,字符串的長度不受限制C) p變量中存放的地址值可以改變D) a中只能存放10個字符14若已定義char s10;則在下面表達(dá)式中不表示s1的地址的是 _。A)s+1 B)s+ C)&S0+1D)&S115若有以下定義,則對數(shù)組a元素的正確引用是 _

32、。int a5, *p=a;A)*&a5 B)a+2 C)*(p+5)D)*(a+2)16若有以下定義,則對數(shù)組a元素地址的正確引用是 _。int a5, *p=a;A)p+5 B)*a+1 C)&a+1D)&a017若有定義:int a23;則對數(shù)組a的第i行第j列元素值的正確引用為 _。A) *(*(a+i)+j) B)(a+i)jC)*(a+i+j)D)*(a+i)+j18若有定義:int a23;則對數(shù)組a的第i行第j列元素地址的正確引用為 _。A) *(ai+j) B)(a+i)C)*(a+j)D)ai+j19. 若有以下定義和語句,則對數(shù)組a元素地址的正確引

33、用為 _。int a23, (*p)3;p=a;A) *(p+2) B)p2C)p1+1D)(p+1)+220. 若有以下定義和語句,則對數(shù)組a元素地址的正確引用為 _。int a23, (*p)3;p=a;A)(p+1)0 B)*(*(p+2)+1)C)*(p1+1)D)p1+221. 若有定義:int (*p)4 ; 則標(biāo)識符p _。A) 是一個指向整型變量的指針B) 是一個指針數(shù)組名C) 是一個指針,它指向一個含有四個整型元素的一維數(shù)組D) 定義不合法22. 以下與int *q5;等價的定義語句是 _。A)int q5; B)int *q; C)int *(q5) ;D)int (*q)

34、5;23. 若有定義:int *p4 ; 則標(biāo)識符p _。A) 是一個指向整型變量的指針B) 是一個指針數(shù)組名C) 是一個指針,它指向一個含有四個整型元素的一維數(shù)組D) 定義不合法24. 若有以下定義,且0<=i<6,則正確的賦值語句是 _。int s46, t64, (*p)6;A)p=t ; B)p=s; C)p=si;D)p=ti;25. 若要對a進行 運算,則a應(yīng)具有下面說明 _。A)int p3; B)int k; C)char *a3; D)int b10; int *a=p; int *a=&k;int *a=b+1;26. 以下選項中,對指針變量p的正確操作

35、是 _。A)int a5, *p;B)int a5, *p; C)int a5; D)int a5; p = &a; p=a; int *p =a=100; int *p1, *p2=a; *p1=*p2;27. 若有定義:int a=2,4,6,8,10,12,14,16,18,20,22,24, *q4, k ;則下面程序段的輸出是 _。for(k=0; k<4; k+) qk=&ak*3; printf(“%d”, q30);A)8B)16 C)20 D)結(jié)果不確定28. 若有以下定義: char *a2=“1234”, “5678”;則正確的敘述是 _。A) a數(shù)

36、組的兩個元素中各自存放了字符串“1234”和“5678”的首地址B) a數(shù)組的兩個元素分別存放的是含有4個字符的一維字符數(shù)組的首地址C) a是指針變量,它指向含有兩個數(shù)組元素的字符型一維數(shù)組D) a數(shù)組元素的值分別是“1234”和“5678”29. 若有以下定義:int s43=1,2,3,4,5,6,7,8,9,10,11,12 ;int (*p)3=s;則能夠正確表示數(shù)組元素s12的表達(dá)式是 _。A) *(*p+1)2) B)(*p+1)+2C)*(*(p+5)D)*(*(p+1)+2)30. 若有說明:char *language=“FORTRAN”, “BASIC”, “PASCAL”, “JAVA”, “C”;則表達(dá)式*language1>*language3比較的是 _。A) 字符F和字符P B)字符串BASIC和 JAVAC) 字符B和字符JD) 字符串FORTRAN和 PASICAL31. 若有說明:char *language=“FORTRAN”, “BASIC”, “PASCAL”, “JAVA”, “C”;則language2的值是 _。A) 一個字符 B)一個地址C) 一

溫馨提示

  • 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論