版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
項(xiàng)目六指針——逢3退出小游戲任務(wù)一了解指針任務(wù)二了解指針與數(shù)組、函數(shù)的應(yīng)用任務(wù)三實(shí)例體驗(yàn)任務(wù)四算法歸納任務(wù)五畫流程圖任務(wù)六項(xiàng)目實(shí)現(xiàn)思考與練習(xí)
任務(wù)一了解指針
1.概述什么是指針?其實(shí)指針與其他變量一樣,所不同的是一般的變量包含的是實(shí)際的真實(shí)數(shù)據(jù),而指針是一個(gè)指示器,它告訴程序在內(nèi)存的哪塊區(qū)域可以找到數(shù)據(jù)。這是一個(gè)非常重要的概念,有很多程序和算法都是圍繞指針而設(shè)計(jì)的。存儲(chǔ)器中的一個(gè)字節(jié)稱為一個(gè)存儲(chǔ)單元,不同類型的數(shù)據(jù)占有的存儲(chǔ)單元并不相同。內(nèi)存單元的編號(hào)稱為地址,根據(jù)內(nèi)存單元的編號(hào)或地址就可以找到該內(nèi)存單元,通常情況下,這個(gè)地址就叫指針。
指針和指針變量的區(qū)別是指針就是一個(gè)地址,它是一個(gè)常量;而指針變量是一個(gè)變量,是用來(lái)存放內(nèi)存地址的變量,它既可存放變量地址,也可以存放其他數(shù)據(jù)結(jié)構(gòu)地址。數(shù)組和函數(shù)在內(nèi)存中是連續(xù)存放的,找到了首地址也就找到了數(shù)組和函數(shù)。
2.指針定義的一般形式
1)指針變量的類型說明
對(duì)指針變量的類型說明包括以下三方面的內(nèi)容:
①指針類型說明,即定義變量為一個(gè)指針變量。
②指針變量名。
③變量值(指針)所指向的變量的數(shù)據(jù)類型。
指針變量類型說明的一般形式為
類型說明符*變量名;
其中,*表示這是一個(gè)指針變量,變量名即為定義的指針變量名,類型說明符表示本指針變量所指向的變量的數(shù)據(jù)類型。例如,
int*p1;
表示p1是一個(gè)指針變量,它的值是某個(gè)整型變量的地址?;蛘哒fp1指向一個(gè)整型變量。至于p1究竟指向哪一個(gè)整型變量,應(yīng)由向p1賦值的變量的地址決定。
staticint*p2;
/*p2是指向靜態(tài)整型變量的指針變量*/
float*p3;
/*p3是指向浮點(diǎn)變量的指針變量*/
char*p4;
/*p4是指向字符變量的指針變量*/
應(yīng)該注意的是,一個(gè)指針變量只能指向同類型的變量,如p3只能指向浮點(diǎn)變量,不能時(shí)而指向一個(gè)浮點(diǎn)變量,時(shí)而又指向一個(gè)字符變量。
2)指針變量的賦值
未經(jīng)賦值的指針不能使用,而且如果賦值也只能是地址而不能是其他任何數(shù)據(jù),取地址符號(hào)為&。一般情況下取地址格式為&變量名,變量名必須是預(yù)先已經(jīng)說明過的。
指針變量賦值方法有以下幾種。
①初始化法,例如,
inta;
int*p=&a;
②賦值法,例如,
inta;int*p;
p=&a;
不允許把一個(gè)數(shù)賦予指針變量,所以int*p;p=100;?是錯(cuò)誤的。被賦值的指針變量前不能加*,所以inta;int*p;*p=&a;也是錯(cuò)誤的。
3.指針變量的運(yùn)算
指針變量可以進(jìn)行某些運(yùn)算,但其運(yùn)算的種類是有限的。它只能進(jìn)行賦值運(yùn)算和部分算術(shù)運(yùn)算及關(guān)系運(yùn)算。
1)指針運(yùn)算符
①取地址運(yùn)算符&。取地址運(yùn)算符&是單目運(yùn)算符,其結(jié)合性為自右至左,其功能是取變量的地址。在scanf函數(shù)及前面介紹的指針變量賦值中,我們已經(jīng)了解并使用了&運(yùn)算符。
②取內(nèi)容運(yùn)算符*。取內(nèi)容運(yùn)算符*是單目運(yùn)算符,其結(jié)合性為自右至左,用來(lái)表示指針變量所指的變量。在*運(yùn)算符之后跟的變量必須是指針變量。需要注意的是指針運(yùn)算符*和指針變量說明中的指針說明符*不是一回事。在指針變量說明中,“*”是類型說明符,表示其后的變量是指針類型。而表達(dá)式中出現(xiàn)的“*”則是一個(gè)運(yùn)算符,用以表示指針變量所指的變量。
例如,
main()
{
inta=5,*p=&a;
printf("%d",*p);
return0;
}
表示指針變量p取得了整型變量a的地址。本語(yǔ)句表示輸出p所指向的地址中的內(nèi)容,即變量a的值。
2)指針變量的運(yùn)算
①賦值運(yùn)算。指針變量的賦值運(yùn)算有以下幾種形式:
a.指針變量初始化賦值,前面已作介紹。
b.把一個(gè)變量的地址賦予指向相同數(shù)據(jù)類型的指針變量。例如,
inta,*pa;
pa=&a;
/*把整型變量a的地址賦予整型指針變量pa*/
c.把一個(gè)指針變量的值賦予指向相同類型變量的另一個(gè)指針變量。例如,
inta,*pa=&a,*pb;
pb=pa;
/*把a(bǔ)的地址賦予指針變量pb*/
由于pa、pb均為指向整型變量的指針變量,因此可以相互賦值。
d.把數(shù)組的首地址賦予指向數(shù)組的指針變量。例如,
inta[5],*pa;
pa=a;
/*數(shù)組名表示數(shù)組的首地址,故可賦予指向數(shù)組的指針變量pa*/
也可寫為
pa=&a[0];
/*數(shù)組第一個(gè)元素的地址也是整個(gè)數(shù)組的首地址,也可賦予pa*/
當(dāng)然也可采取初始化賦值的方法:
inta[5],*pa=a;
e.把字符串的首地址賦予指向字符類型的指針變量。例如,
char*pc;pc="clanguage";
或用初始化賦值的方法寫為
char*pc="CLanguage";
這里應(yīng)說明的是并不是把整個(gè)字符串裝入指針變量,而是把存放該字符串的字符數(shù)組的首地址裝入指針變量。關(guān)于這點(diǎn)在后面還將詳細(xì)介紹。
f.把函數(shù)的入口地址賦予指向函數(shù)的指針變量。例如,
int(*pf)();pf=f;
/*f為函數(shù)名*/
②加減算術(shù)運(yùn)算。對(duì)于指向數(shù)組的指針變量,可以加上或減去一個(gè)整數(shù)n。設(shè)pa是指向數(shù)組a的指針變量,則pa+n、pa-n、pa++、++pa、pa--、--pa運(yùn)算都是合法的。指針變量加或減一個(gè)整數(shù)n的意義是把指針指向的當(dāng)前位置(指向某數(shù)組元素)向前或向后移動(dòng)n個(gè)位置。應(yīng)該注意,數(shù)組指針變量向前或向后移動(dòng)一個(gè)位置和地址加1或減1在概念上是不同的。因?yàn)閿?shù)組可以有不同的類型,各種類型的數(shù)組元素所占的字節(jié)長(zhǎng)度是不同的。如指針變量加1,即向后移動(dòng)1個(gè)位置,表示指針變量指向下一個(gè)數(shù)據(jù)元素的首地址,即移動(dòng)了一個(gè)該數(shù)據(jù)類型的長(zhǎng)度,而不是在原地址基礎(chǔ)上加1。
例如,
inta[5],*pa;
pa=a; /*pa指向數(shù)組a,也是指向a[0]*/
pa=pa+2; /*pa指向a[2],即pa的值為&pa[2]*/
指針變量的加減運(yùn)算只能對(duì)數(shù)組指針變量進(jìn)行,對(duì)指向其他類型變量的指針變量作加減運(yùn)算是毫無(wú)意義的。例如,
再例如,
任務(wù)二了解指針與數(shù)組、函數(shù)的應(yīng)用
1.指針和數(shù)組的定義數(shù)組名代表了數(shù)組的起始地址(即第一個(gè)元素的地址)。數(shù)組的起始地址稱為數(shù)組的指針,數(shù)組各元素的地址稱為數(shù)組元素的指針。
例如,
上例表示對(duì)p當(dāng)前所指向的數(shù)組的元素a[0]賦值為1。
如果想要通過指針變量p引用a[3],則可對(duì)p的值加3,然后用指針運(yùn)算符。例如,
*(p+3)=27;
該語(yǔ)句表示對(duì)a[3]賦值為27,因?yàn)閜+3所指向的元素為a[3]。
*(p+i),*(a+i)表示p+i和a+i所指向的數(shù)組元素,即a[i]。例如,*(p+3),*(a+3)都表示a[3]。
指向數(shù)組的指針變量也可以用下標(biāo)形式,如p[i]與*[p+i]等價(jià)。
下標(biāo)法:如a[i]的形式。
指針法:如*(p+i)或*(a+i),其中a是數(shù)組名,p是指向數(shù)組的指針變量,其初始值為p=a;。
2.?dāng)?shù)組指針的應(yīng)用
指向數(shù)組的指針變量稱為數(shù)組指針變量。在討論數(shù)組指針變量的說明和使用之前,我們先明確幾個(gè)關(guān)系。
一個(gè)數(shù)組是由連續(xù)的一塊內(nèi)存單元組成的。數(shù)組名就是這塊連續(xù)內(nèi)存單元的首地址。一個(gè)數(shù)組也是由各個(gè)數(shù)組元素(下標(biāo)變量)組成的。每個(gè)數(shù)組元素按其類型不同占有幾個(gè)連續(xù)的內(nèi)存單元。一個(gè)數(shù)組元素的首地址也是指它所占用的幾個(gè)內(nèi)存單元的首地址。一個(gè)指針變量既可以指向一個(gè)數(shù)組,也可以指向一個(gè)數(shù)組元素,可把數(shù)組名或第一個(gè)元素的地址賦予它。如要使指針變量指向第i號(hào)元素,可以把i元素的首地址賦予它或把數(shù)組名加i賦予它。
例如,
再例如,
3.?dāng)?shù)組名和數(shù)組指針變量作函數(shù)參數(shù)
數(shù)組名就是數(shù)組的首地址,實(shí)參向形參傳送數(shù)組名實(shí)際上就是傳送數(shù)組的地址,形參得到該地址后也指向同一數(shù)組。這就好像同一件物品有兩個(gè)彼此不同的名稱一樣。同樣,指針變量的值也是地址,數(shù)組指針變量的值即為數(shù)組的首地址,當(dāng)然也可作為函數(shù)的參數(shù)使用。
例如,
又例如,
例如,將數(shù)組a中的n個(gè)整數(shù)按相反順序存放。
方法一:實(shí)參用數(shù)組、形參用指針變量來(lái)實(shí)現(xiàn),程序如下:
方法二:實(shí)參用指針變量、形參用數(shù)組來(lái)實(shí)現(xiàn):
方法三:形參和實(shí)參都用指針變量來(lái)實(shí)現(xiàn):
4.字符串?dāng)?shù)組和字符指針變量
用字符串?dāng)?shù)組和字符指針都可以實(shí)現(xiàn)字符串的存儲(chǔ)和運(yùn)算,但兩者有一定的區(qū)別。
(1)字符指針變量本身是一個(gè)變量,用于存放字符串的首地址。而字符串本身存放于以此為首地址的一塊連續(xù)的內(nèi)存空間中,并以“\0”結(jié)束。字符串?dāng)?shù)組是由若干個(gè)數(shù)組元素組成的,它可以存放整個(gè)字符串。
(2)對(duì)字符串?dāng)?shù)組賦值作初始化時(shí),必須用外部類型或靜態(tài)類型,即必須為靜態(tài)存儲(chǔ)方式,而字符指針無(wú)此限制。
(3)對(duì)于字符指針方式,有char*p=“China”;可寫為char*p;p=“China”;
而數(shù)組staticchars[]=“China”;不能寫為chars[5];s={“China”};
對(duì)數(shù)組的賦值(非賦初值)只能對(duì)字符串?dāng)?shù)組中的每一個(gè)元素逐一賦值。
例如,
例如,
又例如,指針數(shù)組作指針型函數(shù)的參數(shù)。
任務(wù)三實(shí)例體驗(yàn)
在設(shè)計(jì)完整的項(xiàng)目之前,我們先演示一下小游戲,有助于大家體會(huì)本項(xiàng)目的處理過程。這種思想可以應(yīng)用到更多的問題上。我們的總體思想就是數(shù)字代入法,經(jīng)過幾個(gè)具體的實(shí)例,總結(jié)出一個(gè)公式或者一個(gè)專門的代碼。
假設(shè)我們總共有20個(gè)小朋友。
(1)根據(jù)項(xiàng)目要求逢3退出的規(guī)則,第一輪退出的是:3,6,9,12,15,18。
(2)第二輪退出的是:1,5,10,14,19。
(3)第三輪退出的是:4,11,17。
(4)第四輪退出的是:7,16。
任務(wù)四算法歸納
根據(jù)任務(wù)一細(xì)化的功能和任務(wù)三中的實(shí)例,我們可以設(shè)計(jì)以下幾步實(shí)現(xiàn)功能,這些步驟即可稱為算法。逢3退出的算法如下:
(1)先規(guī)定有多少小朋友參加這個(gè)小游戲。
(2)給每個(gè)小朋友編號(hào)。
(3)小朋友圍成一個(gè)圈,從第一個(gè)小朋友開始報(bào)數(shù),逢3,這個(gè)小朋友就退出。
(4)離他最近的小朋友,又從1開始報(bào)數(shù),逢3,這個(gè)小朋友就退出。
(5)直到只剩下最后一個(gè)小朋友,他(她)就可以得到獎(jiǎng)品——蘋果。
任務(wù)五畫流程圖
用流程圖的方式表示上述算法,如圖6.1所示。
任務(wù)六項(xiàng)目實(shí)現(xiàn)
本項(xiàng)目的實(shí)現(xiàn)程序如下:
程序運(yùn)行結(jié)果如圖6.2所示。
圖6.2程序運(yùn)行結(jié)果
思?考?與?練?習(xí)
一、選擇題
1.以下程序的輸出結(jié)果是()。main(){
inta=25,*p;
p=&a;
printf("%d",++*p);
A.23 B.24 C.25 D.26
2.類型相同的兩個(gè)指針變量之間不能進(jìn)行的運(yùn)算是()。
A.< B.= C.+ D.-
3.若有語(yǔ)句“int(*p)[M];”,其中標(biāo)識(shí)符p表示的是()。
A.M個(gè)指向整型變量的指針
B.指向M個(gè)整型變量的函數(shù)指針
C.一個(gè)指向具有M個(gè)整型元素的一維數(shù)組的指針
D.具有M個(gè)指針元素的一維數(shù)組,每個(gè)元素都是指向整型變量的指針
4.若有語(yǔ)句“int(*p)();”,其中標(biāo)示符p表示的是()。
A.指向整型變量的指針
B.指向整型函數(shù)的指針
C.返回整型指針的函數(shù)
D.返回整型變量的函數(shù)
5.以下程序的運(yùn)行結(jié)果是()。
6.執(zhí)行以下程序后,a的值為【①】,b的值為【②】。
7.變量的指針的含義是指該變量的()。
A.值 B.地址
C.名 D.一個(gè)標(biāo)志
8.若有定義inta=5;,則下面對(duì)①②兩個(gè)語(yǔ)句的解釋正確的是()。
①int*p=&a; ②*p=a;
A.語(yǔ)句①和②中的*p含義相同,都表示給指針變量p賦值
B.①和②語(yǔ)句的執(zhí)行結(jié)果,都是把變量a的地址值賦值給指針變量p
C.①在對(duì)p進(jìn)行說明的同時(shí)進(jìn)行初始化,使p指向a
②將變量a的值賦值給指針變量p
D.①在對(duì)p進(jìn)行說明的同時(shí)進(jìn)行初始化,使p指向a
?②將變量a的值賦值給*p
9.若有語(yǔ)句int*point,a=4;和point=&a;,下面均代表地址的一組選項(xiàng)是()。
A.a(chǎn),point,*&a B.&*a,&a,*point
C.*&point,*point,&a D.&a,&*point,point
10.若有說明:int*p1,*p2,m=5,n;,以下均是正確賦值語(yǔ)句的選項(xiàng)是()。
A.p1=&m;p2=&p1;
B.p1=&m;p2=&n;*p1=*p2;
C.p1=&m;p2=p1; D.p1=&m;*p2=*p1;
溫馨提示
- 1. 本站所有資源如無(wú)特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 《農(nóng)村土地“三權(quán)分置”背景下共享農(nóng)莊模式的風(fēng)險(xiǎn)及治理研究》
- 網(wǎng)絡(luò)直播銷售主播合同
- 礦業(yè)投資合作合同模板
- 新媒體短視頻內(nèi)容創(chuàng)作及盈利模式研究分析
- 產(chǎn)品保修合同
- 智能醫(yī)療影像診斷系統(tǒng)合同
- 2024年智慧醫(yī)療設(shè)備供應(yīng)合同
- 智慧物流服務(wù)提升策略
- 小學(xué)生團(tuán)隊(duì)合作項(xiàng)目案例征文
- 2024版體育賽事贊助承諾合同范本2篇
- 2023-2024學(xué)年浙江省瑞安市小學(xué)數(shù)學(xué)三年級(jí)上冊(cè)期末自測(cè)試題
- NB/T 10743-2021智能化綜采工作面驗(yàn)收規(guī)范
- 完井基礎(chǔ)知識(shí)
- GB/T 20984-2022信息安全技術(shù)信息安全風(fēng)險(xiǎn)評(píng)估方法
- 服務(wù)類驗(yàn)收單(模板)
- 天津市河西區(qū)2021-2022六年級(jí)語(yǔ)文上冊(cè)期末試卷
- 邏輯學(xué)導(dǎo)論 超星爾雅 視頻答案及課后答案
- 1866人類與社會(huì) 小教本 國(guó)家開放大學(xué)機(jī)考 題庫(kù)及答案
- 【課件】資源枯竭型城市的轉(zhuǎn)型發(fā)展+課件2022-2023學(xué)年高二地理人教版(2019)選擇性必修2
- 《論文技術(shù)哲學(xué)》課件
- 腫瘤診斷學(xué)及腫瘤檢驗(yàn)標(biāo)志物
評(píng)論
0/150
提交評(píng)論