《C語言程序設計 》課件-第6章_第1頁
《C語言程序設計 》課件-第6章_第2頁
《C語言程序設計 》課件-第6章_第3頁
《C語言程序設計 》課件-第6章_第4頁
《C語言程序設計 》課件-第6章_第5頁
已閱讀5頁,還剩66頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

項目六指針——逢3退出小游戲任務一了解指針任務二了解指針與數(shù)組、函數(shù)的應用任務三實例體驗任務四算法歸納任務五畫流程圖任務六項目實現(xiàn)思考與練習

任務一了解指針

1.概述什么是指針?其實指針與其他變量一樣,所不同的是一般的變量包含的是實際的真實數(shù)據(jù),而指針是一個指示器,它告訴程序在內存的哪塊區(qū)域可以找到數(shù)據(jù)。這是一個非常重要的概念,有很多程序和算法都是圍繞指針而設計的。存儲器中的一個字節(jié)稱為一個存儲單元,不同類型的數(shù)據(jù)占有的存儲單元并不相同。內存單元的編號稱為地址,根據(jù)內存單元的編號或地址就可以找到該內存單元,通常情況下,這個地址就叫指針。

指針和指針變量的區(qū)別是指針就是一個地址,它是一個常量;而指針變量是一個變量,是用來存放內存地址的變量,它既可存放變量地址,也可以存放其他數(shù)據(jù)結構地址。數(shù)組和函數(shù)在內存中是連續(xù)存放的,找到了首地址也就找到了數(shù)組和函數(shù)。

2.指針定義的一般形式

1)指針變量的類型說明

對指針變量的類型說明包括以下三方面的內容:

①指針類型說明,即定義變量為一個指針變量。

②指針變量名。

③變量值(指針)所指向的變量的數(shù)據(jù)類型。

指針變量類型說明的一般形式為

類型說明符*變量名;

其中,*表示這是一個指針變量,變量名即為定義的指針變量名,類型說明符表示本指針變量所指向的變量的數(shù)據(jù)類型。例如,

int*p1;

表示p1是一個指針變量,它的值是某個整型變量的地址?;蛘哒fp1指向一個整型變量。至于p1究竟指向哪一個整型變量,應由向p1賦值的變量的地址決定。

staticint*p2;

/*p2是指向靜態(tài)整型變量的指針變量*/

float*p3;

/*p3是指向浮點變量的指針變量*/

char*p4;

/*p4是指向字符變量的指針變量*/

應該注意的是,一個指針變量只能指向同類型的變量,如p3只能指向浮點變量,不能時而指向一個浮點變量,時而又指向一個字符變量。

2)指針變量的賦值

未經賦值的指針不能使用,而且如果賦值也只能是地址而不能是其他任何數(shù)據(jù),取地址符號為&。一般情況下取地址格式為&變量名,變量名必須是預先已經說明過的。

指針變量賦值方法有以下幾種。

①初始化法,例如,

inta;

int*p=&a;

②賦值法,例如,

inta;int*p;

p=&a;

不允許把一個數(shù)賦予指針變量,所以int*p;p=100;?是錯誤的。被賦值的指針變量前不能加*,所以inta;int*p;*p=&a;也是錯誤的。

3.指針變量的運算

指針變量可以進行某些運算,但其運算的種類是有限的。它只能進行賦值運算和部分算術運算及關系運算。

1)指針運算符

①取地址運算符&。取地址運算符&是單目運算符,其結合性為自右至左,其功能是取變量的地址。在scanf函數(shù)及前面介紹的指針變量賦值中,我們已經了解并使用了&運算符。

②取內容運算符*。取內容運算符*是單目運算符,其結合性為自右至左,用來表示指針變量所指的變量。在*運算符之后跟的變量必須是指針變量。需要注意的是指針運算符*和指針變量說明中的指針說明符*不是一回事。在指針變量說明中,“*”是類型說明符,表示其后的變量是指針類型。而表達式中出現(xiàn)的“*”則是一個運算符,用以表示指針變量所指的變量。

例如,

main()

{

inta=5,*p=&a;

printf("%d",*p);

return0;

}

表示指針變量p取得了整型變量a的地址。本語句表示輸出p所指向的地址中的內容,即變量a的值。

2)指針變量的運算

①賦值運算。指針變量的賦值運算有以下幾種形式:

a.指針變量初始化賦值,前面已作介紹。

b.把一個變量的地址賦予指向相同數(shù)據(jù)類型的指針變量。例如,

inta,*pa;

pa=&a;

/*把整型變量a的地址賦予整型指針變量pa*/

c.把一個指針變量的值賦予指向相同類型變量的另一個指針變量。例如,

inta,*pa=&a,*pb;

pb=pa;

/*把a的地址賦予指針變量pb*/

由于pa、pb均為指向整型變量的指針變量,因此可以相互賦值。

d.把數(shù)組的首地址賦予指向數(shù)組的指針變量。例如,

inta[5],*pa;

pa=a;

/*數(shù)組名表示數(shù)組的首地址,故可賦予指向數(shù)組的指針變量pa*/

也可寫為

pa=&a[0];

/*數(shù)組第一個元素的地址也是整個數(shù)組的首地址,也可賦予pa*/

當然也可采取初始化賦值的方法:

inta[5],*pa=a;

e.把字符串的首地址賦予指向字符類型的指針變量。例如,

char*pc;pc="clanguage";

或用初始化賦值的方法寫為

char*pc="CLanguage";

這里應說明的是并不是把整個字符串裝入指針變量,而是把存放該字符串的字符數(shù)組的首地址裝入指針變量。關于這點在后面還將詳細介紹。

f.把函數(shù)的入口地址賦予指向函數(shù)的指針變量。例如,

int(*pf)();pf=f;

/*f為函數(shù)名*/

②加減算術運算。對于指向數(shù)組的指針變量,可以加上或減去一個整數(shù)n。設pa是指向數(shù)組a的指針變量,則pa+n、pa-n、pa++、++pa、pa--、--pa運算都是合法的。指針變量加或減一個整數(shù)n的意義是把指針指向的當前位置(指向某數(shù)組元素)向前或向后移動n個位置。應該注意,數(shù)組指針變量向前或向后移動一個位置和地址加1或減1在概念上是不同的。因為數(shù)組可以有不同的類型,各種類型的數(shù)組元素所占的字節(jié)長度是不同的。如指針變量加1,即向后移動1個位置,表示指針變量指向下一個數(shù)據(jù)元素的首地址,即移動了一個該數(shù)據(jù)類型的長度,而不是在原地址基礎上加1。

例如,

inta[5],*pa;

pa=a; /*pa指向數(shù)組a,也是指向a[0]*/

pa=pa+2; /*pa指向a[2],即pa的值為&pa[2]*/

指針變量的加減運算只能對數(shù)組指針變量進行,對指向其他類型變量的指針變量作加減運算是毫無意義的。例如,

再例如,

任務二了解指針與數(shù)組、函數(shù)的應用

1.指針和數(shù)組的定義數(shù)組名代表了數(shù)組的起始地址(即第一個元素的地址)。數(shù)組的起始地址稱為數(shù)組的指針,數(shù)組各元素的地址稱為數(shù)組元素的指針。

例如,

上例表示對p當前所指向的數(shù)組的元素a[0]賦值為1。

如果想要通過指針變量p引用a[3],則可對p的值加3,然后用指針運算符。例如,

*(p+3)=27;

該語句表示對a[3]賦值為27,因為p+3所指向的元素為a[3]。

*(p+i),*(a+i)表示p+i和a+i所指向的數(shù)組元素,即a[i]。例如,*(p+3),*(a+3)都表示a[3]。

指向數(shù)組的指針變量也可以用下標形式,如p[i]與*[p+i]等價。

下標法:如a[i]的形式。

指針法:如*(p+i)或*(a+i),其中a是數(shù)組名,p是指向數(shù)組的指針變量,其初始值為p=a;。

2.數(shù)組指針的應用

指向數(shù)組的指針變量稱為數(shù)組指針變量。在討論數(shù)組指針變量的說明和使用之前,我們先明確幾個關系。

一個數(shù)組是由連續(xù)的一塊內存單元組成的。數(shù)組名就是這塊連續(xù)內存單元的首地址。一個數(shù)組也是由各個數(shù)組元素(下標變量)組成的。每個數(shù)組元素按其類型不同占有幾個連續(xù)的內存單元。一個數(shù)組元素的首地址也是指它所占用的幾個內存單元的首地址。一個指針變量既可以指向一個數(shù)組,也可以指向一個數(shù)組元素,可把數(shù)組名或第一個元素的地址賦予它。如要使指針變量指向第i號元素,可以把i元素的首地址賦予它或把數(shù)組名加i賦予它。

例如,

再例如,

3.數(shù)組名和數(shù)組指針變量作函數(shù)參數(shù)

數(shù)組名就是數(shù)組的首地址,實參向形參傳送數(shù)組名實際上就是傳送數(shù)組的地址,形參得到該地址后也指向同一數(shù)組。這就好像同一件物品有兩個彼此不同的名稱一樣。同樣,指針變量的值也是地址,數(shù)組指針變量的值即為數(shù)組的首地址,當然也可作為函數(shù)的參數(shù)使用。

例如,

又例如,

例如,將數(shù)組a中的n個整數(shù)按相反順序存放。

方法一:實參用數(shù)組、形參用指針變量來實現(xiàn),程序如下:

方法二:實參用指針變量、形參用數(shù)組來實現(xiàn):

方法三:形參和實參都用指針變量來實現(xiàn):

4.字符串數(shù)組和字符指針變量

用字符串數(shù)組和字符指針都可以實現(xiàn)字符串的存儲和運算,但兩者有一定的區(qū)別。

(1)字符指針變量本身是一個變量,用于存放字符串的首地址。而字符串本身存放于以此為首地址的一塊連續(xù)的內存空間中,并以“\0”結束。字符串數(shù)組是由若干個數(shù)組元素組成的,它可以存放整個字符串。

(2)對字符串數(shù)組賦值作初始化時,必須用外部類型或靜態(tài)類型,即必須為靜態(tài)存儲方式,而字符指針無此限制。

(3)對于字符指針方式,有char*p=“China”;可寫為char*p;p=“China”;

而數(shù)組staticchars[]=“China”;不能寫為chars[5];s={“China”};

對數(shù)組的賦值(非賦初值)只能對字符串數(shù)組中的每一個元素逐一賦值。

例如,

例如,

又例如,指針數(shù)組作指針型函數(shù)的參數(shù)。

任務三實例體驗

在設計完整的項目之前,我們先演示一下小游戲,有助于大家體會本項目的處理過程。這種思想可以應用到更多的問題上。我們的總體思想就是數(shù)字代入法,經過幾個具體的實例,總結出一個公式或者一個專門的代碼。

假設我們總共有20個小朋友。

(1)根據(jù)項目要求逢3退出的規(guī)則,第一輪退出的是:3,6,9,12,15,18。

(2)第二輪退出的是:1,5,10,14,19。

(3)第三輪退出的是:4,11,17。

(4)第四輪退出的是:7,16。

任務四算法歸納

根據(jù)任務一細化的功能和任務三中的實例,我們可以設計以下幾步實現(xiàn)功能,這些步驟即可稱為算法。逢3退出的算法如下:

(1)先規(guī)定有多少小朋友參加這個小游戲。

(2)給每個小朋友編號。

(3)小朋友圍成一個圈,從第一個小朋友開始報數(shù),逢3,這個小朋友就退出。

(4)離他最近的小朋友,又從1開始報數(shù),逢3,這個小朋友就退出。

(5)直到只剩下最后一個小朋友,他(她)就可以得到獎品——蘋果。

任務五畫流程圖

用流程圖的方式表示上述算法,如圖6.1所示。

任務六項目實現(xiàn)

本項目的實現(xiàn)程序如下:

程序運行結果如圖6.2所示。

圖6.2程序運行結果

思?考?與?練?習

一、選擇題

1.以下程序的輸出結果是()。main(){

inta=25,*p;

p=&a;

printf("%d",++*p);

A.23 B.24 C.25 D.26

2.類型相同的兩個指針變量之間不能進行的運算是()。

A.< B.= C.+ D.-

3.若有語句“int(*p)[M];”,其中標識符p表示的是()。

A.M個指向整型變量的指針

B.指向M個整型變量的函數(shù)指針

C.一個指向具有M個整型元素的一維數(shù)組的指針

D.具有M個指針元素的一維數(shù)組,每個元素都是指向整型變量的指針

4.若有語句“int(*p)();”,其中標示符p表示的是()。

A.指向整型變量的指針

B.指向整型函數(shù)的指針

C.返回整型指針的函數(shù)

D.返回整型變量的函數(shù)

5.以下程序的運行結果是()。

6.執(zhí)行以下程序后,a的值為【①】,b的值為【②】。

7.變量的指針的含義是指該變量的()。

A.值 B.地址

C.名 D.一個標志

8.若有定義inta=5;,則下面對①②兩個語句的解釋正確的是()。

①int*p=&a; ②*p=a;

A.語句①和②中的*p含義相同,都表示給指針變量p賦值

B.①和②語句的執(zhí)行結果,都是把變量a的地址值賦值給指針變量p

C.①在對p進行說明的同時進行初始化,使p指向a

②將變量a的值賦值給指針變量p

D.①在對p進行說明的同時進行初始化,使p指向a

?②將變量a的值賦值給*p

9.若有語句int*point,a=4;和point=&a;,下面均代表地址的一組選項是()。

A.a,point,*&a B.&*a,&a,*point

C.*&point,*point,&a D.&a,&*point,point

10.若有說明:int*p1,*p2,m=5,n;,以下均是正確賦值語句的選項是()。

A.p1=&m;p2=&p1;

B.p1=&m;p2=&n;*p1=*p2;

C.p1=&m;p2=p1; D.p1=&m;*p2=*p1;

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論