第11章 C語(yǔ)言指針解析_第1頁(yè)
第11章 C語(yǔ)言指針解析_第2頁(yè)
第11章 C語(yǔ)言指針解析_第3頁(yè)
第11章 C語(yǔ)言指針解析_第4頁(yè)
第11章 C語(yǔ)言指針解析_第5頁(yè)
已閱讀5頁(yè),還剩17頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

指針解析

教學(xué)目的內(nèi)容1

教學(xué)要求2

重點(diǎn)難點(diǎn)3

教學(xué)內(nèi)容4教學(xué)目的通過(guò)本章的學(xué)習(xí),使讀者對(duì)指針有一定的了解,并能夠使用指針進(jìn)行編程。教學(xué)要求掌握指針的相關(guān)概念;掌握指針與數(shù)組之間的關(guān)系;掌握指向指針的指針;掌握如何使用指針變量做函數(shù)參數(shù);了解main函數(shù)的參數(shù)。重點(diǎn)難點(diǎn)重點(diǎn):地址與指針的關(guān)系;指針自加自減運(yùn)算

;數(shù)組與指針的關(guān)系;函數(shù)參數(shù)的指針變量;難點(diǎn):指向指針的指針;指針數(shù)組作main函數(shù)的參數(shù)。教學(xué)內(nèi)容函數(shù)參數(shù)的指針變量;概述指針;數(shù)組與指針;指向指針的指針;返回指針值的函數(shù);指針函數(shù)作main函數(shù)的參數(shù)。概述指針指針是C語(yǔ)言顯著的優(yōu)點(diǎn)之一,指針使用起來(lái)十分靈活而且能提高某些程序的效率,但是指針使用不當(dāng),很容易就造成系統(tǒng)錯(cuò)誤,往往許多程序“掛死”的大部分原因都是由于錯(cuò)誤地使用指針?biāo)斐傻摹?.地址與指針系統(tǒng)的內(nèi)存就像是帶有編號(hào)的小房間,如果想使用內(nèi)存就需要得到房間編號(hào)。如圖所示,定義一個(gè)整型變量i,整型變量需要4個(gè)字節(jié),所以編譯器為變量i分配編號(hào)從1000到1003,如圖所示。地址就是內(nèi)存區(qū)中對(duì)每個(gè)字節(jié)的編號(hào)那么指針又是什么呢?這里僅將指針看作是內(nèi)存中的一個(gè)地址,多數(shù)情況下,這個(gè)地址是內(nèi)存中另一個(gè)變量的位置。如圖所示。概述指針

2解讀變量與指針變量的地址是變量和指針這兩者之間連接的紐帶,如果一個(gè)變量包含了另一個(gè)變量的地址,那么,第1個(gè)變量可以說(shuō)成是指向第2個(gè)變量。所謂“指向”就是通過(guò)地址來(lái)體現(xiàn)的,在程序中用“*”符號(hào)表示“指向”。因?yàn)橹羔樧兞渴侵赶蛞粋€(gè)變量的地址,所以將一個(gè)變量的地址值賦給這個(gè)指針變量后,這個(gè)指針變量就“指向”了該變量。例如,將變量i的地址存放到指針變量p中,p就指向i。其關(guān)系如圖所示。在程序代碼中是通過(guò)變量名來(lái)對(duì)內(nèi)存單元進(jìn)行存取操作,但是代碼經(jīng)過(guò)編輯后已經(jīng)將變量名轉(zhuǎn)換為該變量在內(nèi)存的存放地址,對(duì)變量值的存取都是通過(guò)地址進(jìn)行的。例如對(duì)上圖中所示的變量i和變量j進(jìn)行如下操作。i+j;其含義根據(jù)變量名與地址的對(duì)應(yīng)關(guān)系,找到變量i的地址1000,然后從1000開(kāi)始讀取四個(gè)字節(jié)數(shù)據(jù)放到CPU寄存器中,再找到變量j的地址1004,從1004開(kāi)始讀取四個(gè)字節(jié)的數(shù)據(jù)放到CPU另一個(gè)寄存器中,通過(guò)CPU計(jì)算出結(jié)果。在低級(jí)語(yǔ)言的匯編語(yǔ)言中都是直接通過(guò)地址來(lái)訪問(wèn)內(nèi)存單元,而在高級(jí)語(yǔ)言中才使用變量名訪問(wèn)內(nèi)存單元,但C語(yǔ)言作為高級(jí)語(yǔ)言卻提供了通過(guò)地址來(lái)訪問(wèn)內(nèi)存單元的方法。概述指針

3使用指針變量1.指針變量的一般形式如果有一個(gè)變量專(zhuān)門(mén)用來(lái)存放另一變量的地址,則它稱(chēng)為“指針變量”。如果一個(gè)變量包含有指針(指針等同于一個(gè)變量的地址),則必須對(duì)它作說(shuō)明。定義指針變量的一般形式如下。類(lèi)型說(shuō)明*變量名其中,*表示這是一個(gè)指針變量,變量名即為定義的指針變量名,類(lèi)型說(shuō)明表示本指針變量所指向的變量的數(shù)據(jù)類(lèi)型。2.指針變量的賦值指針變量同普通變量一樣,使用之前不僅要定義,而且必須賦予具體的值。未經(jīng)賦值的指針變量不能使用。給指針變量所賦的值與給其它變量所賦的值不同,給指針變量的賦值只能賦予地址,而不能賦予任何其它數(shù)據(jù),否則將引起錯(cuò)誤。C語(yǔ)言中提供了地址運(yùn)算符“&”來(lái)表示變量的地址。其一般形式為。&變量名;如&a表示變量a的地址,&b表示變量b的地址。給一個(gè)指針變量賦值可以有以下兩種方法。定義指針變量的同時(shí)就進(jìn)行賦值。inta;int*p=&a;先定義指針變量之后再賦值。inta;int*p;p=&a;實(shí)例

從鍵盤(pán)中輸入兩個(gè)數(shù)分別代表蘋(píng)果和香蕉的價(jià)格,利用指針的方法將這兩個(gè)數(shù)輸出。概述指針

3.指針變量的引用引用指針變量是對(duì)變量進(jìn)行間接訪問(wèn)的一種形式。對(duì)指針變量的引用形式如下。*指針變量其含義是引用指針變量所指向的值。實(shí)例

利用指針變量實(shí)現(xiàn)數(shù)據(jù)輸入、輸出。4.“&”和“*”運(yùn)算符在前面介紹指針變量的過(guò)程中用到了兩個(gè)運(yùn)算符分別是“&”和“*”,運(yùn)算符“&”是一個(gè)返回操作數(shù)地址的單目運(yùn)算符,叫做取地址運(yùn)算符,例如p=&i;就是將變量i的內(nèi)存地址賦給p,這個(gè)地址是該變量在計(jì)算機(jī)內(nèi)部的存儲(chǔ)位置。運(yùn)算符“*”是單目運(yùn)算符,叫做指針運(yùn)算符,作用是返回指定的地址內(nèi)的變量的值,例如前面提到過(guò)p中裝有變量i的內(nèi)存地址,則q=*p;就是將變量i的值賦給q,假如變量i的值是5,則q的值也是5。5.“&*”和“*&”區(qū)別如果有如下語(yǔ)句。inta;p=&a;那么通過(guò)以上兩條語(yǔ)句來(lái)分析下“&*”和“*&”之間的區(qū)別,&和*的運(yùn)算符優(yōu)先級(jí)別相同,按自右而左的方向結(jié)合。因此&*p先進(jìn)行*運(yùn)算,*p相當(dāng)于變量a;再進(jìn)行&運(yùn)算,&*p就相當(dāng)于取變量a的地址。*&a先計(jì)算&預(yù)算符,&a就是取變量a的地址,然后計(jì)算*運(yùn)算,*&a就相當(dāng)于取變量a所在地址的值,實(shí)際就是變量a。下面通過(guò)兩個(gè)例子具體看下。實(shí)例“&*”應(yīng)用。

實(shí)例“*&”應(yīng)用

概述指針

4指針自加自減運(yùn)算指針的自加自減運(yùn)算不同于普通變量的自加自減運(yùn)算,也就是說(shuō)它并不是簡(jiǎn)單的加1減1,這里就通過(guò)兩個(gè)例題具體分析。實(shí)例

整型變量地址輸出。

實(shí)例

整型變量地址輸出。

數(shù)組與指針系統(tǒng)需要提供一定量連續(xù)的內(nèi)存來(lái)存儲(chǔ)數(shù)組中的各元素,內(nèi)存都有地址,指針變量就是存放地址的變量,如果把數(shù)組的地址賦給指針變量,就可以通過(guò)指針變量來(lái)引用數(shù)組。下面就將介紹下如何用指針來(lái)引用一維數(shù)組及二維數(shù)組元素。1一維數(shù)組與指針當(dāng)定義一個(gè)一維數(shù)組,系統(tǒng)會(huì)在內(nèi)存中為該數(shù)組分配一個(gè)存儲(chǔ)空間,其數(shù)組的名字就是數(shù)組在內(nèi)存的首地址。若再定義一個(gè)指針變量,并將數(shù)組的首地址傳給指針變量,則該指針就指向了這個(gè)一維數(shù)組。例如:int*p,a[10];p=a;這里a是數(shù)組名,也就是數(shù)組的首地址,將它賦給指針變量p,也就是將數(shù)組a的首地址賦給p,也可以寫(xiě)成如下形式。int*p,a[10];p=&a[0];上面這個(gè)語(yǔ)句是將數(shù)組a中的首個(gè)元素的地址賦給指針變量p。由于a[0]的地址就是數(shù)組的首地址,所以,兩條賦值操作效果完全相同,如實(shí)例。實(shí)例

輸出數(shù)組中的元素。根據(jù)上面語(yǔ)句將通過(guò)以下幾方面進(jìn)行介紹。

p+n與a+n表示數(shù)組元素a[n]的地址,即&a[n]。對(duì)整個(gè)a數(shù)組來(lái)說(shuō),共有5個(gè)元素,n的取值為0~4,則數(shù)組元素的地址就可以表示為p+0~p+4或a+0~a+4。如何來(lái)表示數(shù)組中的元素用到了前面介紹的數(shù)組元素的地址表示,用*(p+n)和*(a+n)來(lái)表示數(shù)組中的各元素。表示指針的移動(dòng)可以使用“++”和“--”這兩個(gè)運(yùn)算符。數(shù)組與指針

2二維數(shù)組與指針定義一個(gè)3行5列的二維數(shù)組,其在內(nèi)存中的存儲(chǔ)形式如圖所示。從上圖中可以看到幾種表示二維數(shù)組中元素地址的方法,下面逐一進(jìn)行介紹。(1)&a[0][0]既可以看作數(shù)組0行0列的首地址,同樣還可以看作是二維數(shù)組的首地址。&a[m][n]就是第m行n列元素的地址。(2)a[0]+n,表示第0行第n個(gè)元素地址。實(shí)例

利用指針對(duì)二維數(shù)組進(jìn)行輸入輸出。(3)&a[0]是第0行的首地址,當(dāng)然&a[n]就是第n行的首地址。實(shí)例

將一個(gè)3行5列的二維組的第3行元素輸出。(4)a+n表示第n行的首地址。前面講過(guò)了如何利用指針來(lái)引用一維數(shù)組,這里在一維數(shù)組的基礎(chǔ)上來(lái)介紹一下如何通過(guò)指針來(lái)引用一個(gè)二維數(shù)組中的元素。*(*(a+n)+m)表示第n行第m列元素。*(a[n]+m)表示第n行第m列元素。數(shù)組與指針

3字符串與指針訪問(wèn)一個(gè)字符串可以通過(guò)兩種方式,第一種方式就是前面講過(guò)的使用字符數(shù)組來(lái)存放一個(gè)字符串,從而實(shí)現(xiàn)對(duì)字符串的操作,另一種方法就是下面將要介紹到的使用字符指針指向一個(gè)字符串,此時(shí)可不定義數(shù)組。實(shí)例

字符型指針應(yīng)用。

實(shí)例

聲明兩個(gè)字符數(shù)組,將str1中的字符串復(fù)制到str2中。

數(shù)組與指針

4字符串?dāng)?shù)組字符串?dāng)?shù)組是以字符串作為數(shù)組元素的數(shù)組,可以將其看成一個(gè)二維字符數(shù)組,下面定義一個(gè)簡(jiǎn)單的字符串?dāng)?shù)組。charcountry[5][20]={"China","Japan","Russia","Germany","Switzerland"}字符型數(shù)組變量country被定義為含有5個(gè)字符串的數(shù)組,每個(gè)字符串的長(zhǎng)度要小于20(這里要考慮字符串最后的‘\0’)。通過(guò)觀察上面定義的字符串?dāng)?shù)組會(huì)發(fā)現(xiàn)像“China”和“Japan”這樣的字符串其長(zhǎng)度僅為5,加上字符串結(jié)束符也僅為6,而內(nèi)存中卻要給它們分別分配一個(gè)20字節(jié)的空間,這樣就會(huì)造成資源浪費(fèi)。為了解決這個(gè)問(wèn)題,可以使用指針數(shù)組,每個(gè)指針指向所需要的字符常量,這種方法雖然需要在數(shù)組中保存字符指針,同樣也占用空間,但要遠(yuǎn)少于字符串?dāng)?shù)組需要的空間。那么什么是指針數(shù)組?一個(gè)數(shù)組,其元素均為指針類(lèi)型數(shù)據(jù),稱(chēng)為指針數(shù)組,也就是說(shuō),指針數(shù)組中的每一個(gè)元素都相當(dāng)于一個(gè)指針變量。一維指針數(shù)組的定義形式如下。類(lèi)型名數(shù)組名[數(shù)組長(zhǎng)度]實(shí)例

輸出12月。指向指針的指針一個(gè)指針變量可以指向整型變量、實(shí)型變量、字符類(lèi)型變量,當(dāng)然也可以指向指針類(lèi)型變量。當(dāng)這種指針變量用于指向指針類(lèi)型變量時(shí),則稱(chēng)之為指向指針的指針變量。這種雙重指針如圖所示整型變量i地址是&i,其值傳遞給指針變量p1,則p1指向i,同時(shí),將p1的地址&p1傳遞給p2,則p2指向p1。這里的p2就是前面講到的指向指針變量的指針變量,即指針的指針。指向指針的指針變量定義如下。類(lèi)型標(biāo)識(shí)符**指針變量名;例如:int**p;其含義為定義一個(gè)指針變量p,它指向另一個(gè)指針變量,該指針變量又指向一個(gè)基本整型變量。由于指針運(yùn)算符“*”是自右至左結(jié)合,所以上述定義相當(dāng)于:int*(*p);既然知道了如何定義指向指針的指針,那么可以將上面圖更形象的表示出來(lái)。下面看一下指向指針變量的指針變量在程序中是如何應(yīng)用的。實(shí)例

使用指向指針的指針輸出12月。

實(shí)例

利用指向指針的指針輸出一維數(shù)組中是偶數(shù)的元素,并統(tǒng)計(jì)偶數(shù)的個(gè)數(shù)。函數(shù)參數(shù)的指針變量通過(guò)前面的學(xué)習(xí)知道整型變量、實(shí)型變量、字符型變量、數(shù)組名和數(shù)組元素等均可作為函數(shù)參數(shù)。此外,指針型變量也可以作為函數(shù)參數(shù),這節(jié)會(huì)具體介紹下。首先通過(guò)下面的實(shí)例來(lái)看下如何用指針變量來(lái)做函數(shù)參數(shù)的。實(shí)例

調(diào)用自定義函數(shù)交換兩變量值。在函數(shù)調(diào)用過(guò)程中,主調(diào)用函數(shù)與被調(diào)用函數(shù)之間有一個(gè)數(shù)值傳遞過(guò)程。函數(shù)調(diào)用中發(fā)生的數(shù)據(jù)傳遞是單向的,只能把實(shí)參的值傳遞給形參,在函數(shù)調(diào)用過(guò)程中,形參的值發(fā)生改變,實(shí)參的值不會(huì)發(fā)生變化,所以上面的這段代碼同樣不能實(shí)現(xiàn)x和y值的互換。通過(guò)指針傳遞參數(shù)可以減少值傳遞帶來(lái)的開(kāi)銷(xiāo),也可以使函數(shù)調(diào)用不產(chǎn)生值傳遞。下面來(lái)看下嵌套的函數(shù)調(diào)用是如何來(lái)使用指針變量做函數(shù)參數(shù)的。實(shí)例

嵌套的函數(shù)調(diào)用。

C語(yǔ)言中實(shí)參變量和形參變量之間的數(shù)據(jù)傳遞是單項(xiàng)的“值傳遞”方式。指針變量作函數(shù)參數(shù)也是如此,調(diào)用函數(shù)不可能改變實(shí)參指針變量的值,但可以改變實(shí)參指針變量所指變量的值。函數(shù)參數(shù)的指針變量前面兩個(gè)例子都是用一個(gè)指向數(shù)組的指針變量作函數(shù)參數(shù),在前面介紹過(guò)指向指針的指針,這里就來(lái)通過(guò)一個(gè)例子看下如何用指向指針的指針作函數(shù)參數(shù)。實(shí)例

編程實(shí)現(xiàn)對(duì)英文的12月份按字母順序進(jìn)行排序。下面將通過(guò)一個(gè)二維數(shù)組使用指針變量作函數(shù)參數(shù)的例子來(lái)加深讀者對(duì)該部分知識(shí)的理解。實(shí)例

找出數(shù)組每行中最大的數(shù),并將這三個(gè)數(shù)相加求和。

前面介紹過(guò)了指向數(shù)組的指針變量的定義和使用,這里介紹下如何指向數(shù)組的指針變量做函數(shù)參數(shù)。形式參數(shù)和實(shí)際參數(shù)均為指針變量。實(shí)例

任意輸入15個(gè)數(shù)據(jù),先將這15個(gè)數(shù)據(jù)中是奇數(shù)的數(shù)據(jù)輸出,再求這15個(gè)數(shù)據(jù)中所有奇數(shù)之和。數(shù)組名就是這個(gè)數(shù)組的首地址,所以也可以將數(shù)組名作為實(shí)參傳遞給形式參數(shù)。例如:order(a,n); /*調(diào)用order函數(shù)*/就是直接使用數(shù)組名做函數(shù)參數(shù)的。實(shí)例

使用指針實(shí)現(xiàn)冒泡排序

當(dāng)形參為數(shù)組時(shí),實(shí)參也可以為指針變量??蓪⑸侠膶?xiě)成如下形式。返回指針值的函數(shù)指針變量也可以指向一個(gè)函數(shù)。一個(gè)函數(shù)在編譯時(shí)被分配給一個(gè)入口地址。這個(gè)函數(shù)入口地址就稱(chēng)為函數(shù)的指針??梢杂靡粋€(gè)指針變量指向函數(shù),然后通過(guò)該指針變量調(diào)用此函數(shù)。一個(gè)函數(shù)可以帶回一個(gè)整型值、字符值、實(shí)型值等,也可以帶回指針型的數(shù)據(jù),即地址。其概念與以前類(lèi)似,只是帶回的值的類(lèi)型是指針類(lèi)型而已。返回指針值的函數(shù)簡(jiǎn)稱(chēng)為指針函數(shù)。定義指針函數(shù)的一般形式為。類(lèi)型名*函數(shù)名(參數(shù)表列);例如:int*fun(intx,inty)fun是函數(shù)名,調(diào)用它以后能得到一個(gè)指向整型數(shù)據(jù)的指針。x和y是函數(shù)fun的形式參數(shù),這兩個(gè)參數(shù)也均為基本整型。這個(gè)函數(shù)的函數(shù)名前面有一個(gè)*,表示此函數(shù)是指針型函數(shù),類(lèi)型說(shuō)明是int表示返回的指針指向整型變量。實(shí)例

求長(zhǎng)方形的周長(zhǎng)

指針數(shù)組作main函數(shù)的參數(shù)main函數(shù)的第一行一般形式如下。main()從上面會(huì)發(fā)現(xiàn)main函數(shù)是沒(méi)有參數(shù)的,那么到底main函數(shù)能否有參數(shù)呢?實(shí)際上main函數(shù)可以是無(wú)參函數(shù)也可以是有參的函數(shù)。對(duì)于有參的形式來(lái)說(shuō),就需要向其傳遞參數(shù)。下面先看一下main()函數(shù)的帶參的形式。main(intargc,char*argv[])從函數(shù)參數(shù)的形式上看,包含一個(gè)整型和一個(gè)指針數(shù)

溫馨提示

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

評(píng)論

0/150

提交評(píng)論