程序設(shè)計基礎(chǔ)ch5課件_第1頁
程序設(shè)計基礎(chǔ)ch5課件_第2頁
程序設(shè)計基礎(chǔ)ch5課件_第3頁
程序設(shè)計基礎(chǔ)ch5課件_第4頁
程序設(shè)計基礎(chǔ)ch5課件_第5頁
已閱讀5頁,還剩19頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、第5章 指針與數(shù)組學(xué)習(xí)目標(biāo)理解指針、地址和數(shù)組的概念學(xué)會使用數(shù)組和字符數(shù)組學(xué)會指針運算的方法和技巧學(xué)會指針作為函數(shù)參數(shù)的用法理解函數(shù)的指針和返回指針值的函數(shù)了解指針與二維數(shù)組配合的編程方法了解“指針的指針”的定義指針是一種用于存放另一個變量的地址的變量 優(yōu)點是: 可以生成更高效、更緊湊的代碼; 有效地表示復(fù)雜的數(shù)據(jù)結(jié)構(gòu); 動態(tài)分配內(nèi)存; 得到多于一個的函數(shù)返回值 7/28/20221程序設(shè)計基礎(chǔ) 張杰敏5.1 指針與地址(1)內(nèi)存單元的編號也叫做地址 通常也把存放地址的變量稱為指針或指針變量對于一個內(nèi)存單元來說,單元的地址(編號)即為指針變量的值,單元的內(nèi)容是其中存放的數(shù)據(jù) 7/28/2022

2、2程序設(shè)計基礎(chǔ) 張杰敏5.1 指針與地址()指針變量的說明包括類型說明、指針變量名和指針?biāo)赶虻淖兞康臄?shù)據(jù)類型三個內(nèi)容,其一般語法形式為:類型說明符 *變量名 其中,*表示這是一個指針變量,變量名即為定義的指針變量名,類型說明符表示本指針變量所指向的變量的數(shù)據(jù)類型 例如:int *p1;表示p1是一個指針變量,它的值是某個整型變量的地址 C語言中提供了地址運算符&來表示變量的地址。其一般語法形式為:&變量名如&a變示變量a的地址,&b表示變量b的地址。變量本身必須預(yù)先說明 取內(nèi)容運算的一般語法形式是:*地址這里“地址”可以是指針變量名、數(shù)組名或表示地址的整型表達(dá)式 7/28/20223程序設(shè)計

3、基礎(chǔ) 張杰敏5.1 指針與地址()指針的比較兩個指針在一定條件下可以進(jìn)行比較。如果兩個指針p和q指向同一數(shù)組,則它們可以進(jìn)行,、和!等比較運算。例如:pq若指針p指向的位置位于指針q指向的位置之前,則其值為真;反之則為假p=q若指針p和q都指向同一個變量,則其值為真;否則為假p=0若指針p為一個空指針,則其值為真;反之為假p!=0若指針p不是空指針,則其值為真,反之為假 7/28/20224程序設(shè)計基礎(chǔ) 張杰敏5.2 指針?biāo)阈g(shù)運算對指針來說,有加,減兩種算術(shù)運算,可用的算術(shù)運算符有: +,-,+,-,+=和-=運算規(guī)則如下:指針的算術(shù)運算是根據(jù)其類型的長度確定增減量來進(jìn)行。由于地址計算與其相應(yīng)

4、數(shù)據(jù)類型占字節(jié)數(shù)有關(guān),故指針的增減量,根據(jù)其類型的長度確定。 +(-): 指針增運算,即指針向前移動一個數(shù)據(jù)的位置,指向的新地址為 原地址+(-)sizeof( 類型說明符). 如設(shè):int *p=&k; 則若k的地址為2000, p+ 以后P的值變?yōu)?002,而非2001。p每增一次,就將指針指向后一個整數(shù)(兩個字節(jié)),P-后為1998而非1999. +(-):指針變量加(減)正整數(shù)n,即表示指針向后(前)移動n個數(shù)據(jù),使該指針?biāo)赶虻牡刂窞樵刂?(-) sizcof(類型說明符)*n。如:p=p+5; 之后p值為 2000+5*2=2010。.說明:指針僅能做以上幾種算術(shù)運算,除此之外的

5、運算即是非法的 7/28/20225程序設(shè)計基礎(chǔ) 張杰敏5.3 指針與函數(shù)參數(shù)函數(shù)調(diào)用過程中有傳值和傳址兩種參數(shù)傳遞方法 指針作為函數(shù)參數(shù),使得函數(shù)的調(diào)用靈活、高效 指針與函數(shù)參數(shù)的配合使用,常見有三種:函數(shù)的參數(shù)為指針型、函數(shù)的返回值為指針型函數(shù)指針(指針的基本類型為函數(shù)) 舉例說明7/28/20226程序設(shè)計基礎(chǔ) 張杰敏5.4 數(shù) 組()在計算機高級語言中,把具有同一名字,互相有聯(lián)系且按一定順序排列的變量稱為數(shù)組數(shù)組中的每一變量都用不同的下標(biāo)來區(qū)別,稱為數(shù)組元素,0作為第一個元素的下標(biāo) 需要使用數(shù)組時,先要進(jìn)行定義,然后才能使用 7/28/20227程序設(shè)計基礎(chǔ) 張杰敏5.4 數(shù) 組()一

6、維數(shù)組的說明格式。一般語法形式為: 類型 變量名長度類型是指數(shù)據(jù)類型, 即每一個數(shù)組元素的數(shù)據(jù)類型, 包括整數(shù)型、浮點型、字符型、指針型以及后面要講述的結(jié)構(gòu)和聯(lián)合 一維數(shù)組的初始化賦值的一般語法形式為:類型說明符 數(shù)組名常量表達(dá)式=值,值值語言規(guī)定定義數(shù)組的同時可作初始化賦值。在 中的各數(shù)據(jù)值即為各元素的初值, 各值之間用逗號間隔 一維數(shù)組的引用。C語言規(guī)定只能逐個引用數(shù)組元素而不能一次引用整個數(shù)組。數(shù)組元素的表示形式為數(shù)組名下標(biāo)7/28/20228程序設(shè)計基礎(chǔ) 張杰敏5.4 數(shù) 組()用來存放字符數(shù)據(jù)的數(shù)組是字符數(shù)組。字符數(shù)組中的一個元素存放一個字符。幾點需要說明: 要區(qū)別“字符”和“字符串

7、”,字符變量或字符數(shù)組的一個元素只能存放一個字符,用單引號引起來 C語言規(guī)定了一個“字符串結(jié)束標(biāo)志”,以字符0代表 字符數(shù)組的輸入/輸出方式除了逐個元素(字符)輸入輸出外,還可以用”%s”格式符整體輸入/輸出 輸出字符不包括結(jié)束符0 7/28/20229程序設(shè)計基礎(chǔ) 張杰敏5.4 數(shù) 組()二維數(shù)組的定義。一般語法形式為: 類型說明符 數(shù)組名常量表達(dá)式常量表達(dá)式二維數(shù)組的理解:可以把二維數(shù)組看成是一個一維數(shù)組,這個一維數(shù)組的每個元素又是一維數(shù)組二維數(shù)組的元素在內(nèi)存中的存放循序。按行存放 二維數(shù)組中元素的引用。用數(shù)組名和下標(biāo)引用元素 二維數(shù)組的初始化 多維數(shù)組的一般語法形式為: 類型 數(shù)組名第n

8、維長度第n-1維長度.第1維長度7/28/202210程序設(shè)計基礎(chǔ) 張杰敏5.5 數(shù)組的指針指向一個數(shù)組的指針稱為數(shù)組指針,可把數(shù)組名或第一個元素的地址賦予它 一個指針變量既可以指向一個數(shù)組,也可以指向一個數(shù)組元素,如果指針指向了數(shù)組,也就是指向了數(shù)組的第一個元素(首地址) 當(dāng)使指針p指向數(shù)組a后,可以用指針p訪問數(shù)組的各個元素 指針和數(shù)組在訪問內(nèi)存地址中的數(shù)據(jù)時,其表達(dá)形式具有相同意義。 但指針與數(shù)組名具有本質(zhì)上的不同,數(shù)組名是地址,也可理解為指針常量,而指針是地址變量。 指針在使用前必須先賦予一定的地址值 指針用指針取值元素p *(p+0)a0p+1*(p+1)a1p+2*(p+2)a2p

9、+i*(p+i)aip+9*(p+9)a9指針引用數(shù)組元素7/28/202211程序設(shè)計基礎(chǔ) 張杰敏5.6 字符串的指針字符串的指針,又稱字符指針,本身是一個變量,用于存放字符串的首地址字符串本身是存放在以該首地址為首的一塊連續(xù)的內(nèi)存空間中并以0作為串的結(jié)束 字符串雖然是字符數(shù)組,但是字符數(shù)組和字符指針的概念不同,用字符串指針方式與字符數(shù)組方式使用字符串時是有區(qū)別的,兩者的意義如圖 初始化賦值 字符串指針方式: char *ps;ps= Student personnel file; 對數(shù)組方式: char st = Student personnel file;7/28/202212程序設(shè)計

10、基礎(chǔ) 張杰敏5.7 指針數(shù)組(1)指針數(shù)組是一個數(shù)組,該數(shù)組中的每一個元素是指針變量。其一般語法形式為: 類型標(biāo)識符 *數(shù)組名數(shù)組元素個數(shù)例如: int * p4; 定義了一個指針數(shù)組,數(shù)組名p,有4個元素, 每一個元素是指向整型變量的指針 int (*p)4; /* 指向數(shù)組的指針 */ 這句定義一個指針變量,它指向有4個元素的一維數(shù)組 7/28/202213程序設(shè)計基礎(chǔ) 張杰敏5.7 指針數(shù)組(2)指針數(shù)組主要用于處理多個字符串。字符串本身是一維數(shù)組,多個字符串可以用二維數(shù)組來處理,但會浪費許多內(nèi)存。用指針數(shù)組處理多個字符串,不會浪費內(nèi)存。如要將7個國名并按字母順序排列后輸出,一種方法是采

11、用普通的排序方法, 逐個比較之后交換字符串的位置。交換字符串的物理位置是通過字符串復(fù)制函數(shù)完成的。反復(fù)的交換將使程序執(zhí)行的速度很慢,同時由于各字符串(國名) 的長度不同,又增加了存儲管理的負(fù)擔(dān)。另一種較好的方法是使用指針數(shù)組,排序前后指針的指向情況見圖。把所有的字符串存放在一個數(shù)組中,把這些字符數(shù)組的首地址放在一個指針數(shù)組中,當(dāng)需要交換兩個字符串時, 只須交換指針數(shù)組相應(yīng)兩元素的內(nèi)容(地址)即可,而不必交換字符串本身。下圖為排序前后示意圖:7/28/202214程序設(shè)計基礎(chǔ) 張杰敏5.8* 指針的指針指向指針的指針變量說明的一般語法形式為: 類型說明符 * 指針變量名; 例如:右圖首先定義說明

12、了指針數(shù)組ps并作了初始化賦值。 又說明了pps是一個指向指針的指針變量。在5次循環(huán)中, pps 分別取得了ps0,ps1,ps2,ps3,ps4的地址值(如圖5-10所示)。再通過這些地址即可找到該字符串 7/28/202215程序設(shè)計基礎(chǔ) 張杰敏5.9 指針與多維數(shù)組(1) 簡單指針變量引用多維數(shù)組的元素一般地,若需訪問二維數(shù)組anm(n行m列)的某個元素aij,計算該元素的相對位置公式為: i*m+j (i,j=0,1,2, .) 相當(dāng)于把二維數(shù)組轉(zhuǎn)化為一維數(shù)組來使用 如: int a3,4= 1,3,5,7,9,11,13,15,17,19,21,23; int a12= 1,3,5,

13、7,9,11,13,15,17,19,21,23; 引用時使用a13和a7都是指第8號元素,這里即157/28/202216程序設(shè)計基礎(chǔ) 張杰敏5.9 指針與多維數(shù)組(2) 通過指針數(shù)組引用多維數(shù)組元素對于二維數(shù)組可以為其中每個一維數(shù)組(每行),設(shè)一個指針。也可設(shè)一個指針數(shù)組,這個指針數(shù)組的每一個指針指向二維數(shù)組中的每個一維數(shù)組如: int a34 = 1,3,5,7,9,11,13,15,17,19,21,23; int *pa3=a0,a1,a2; /* 將3行的首地址賦給指針數(shù)組 */ 這時的pa2+1就指向a21,即整型數(shù)19 7/28/202217程序設(shè)計基礎(chǔ) 張杰敏5.9 指針與多

14、維數(shù)組(3) 通過二維數(shù)組的數(shù)組名表達(dá)式引用多維數(shù)組的元素二維數(shù)組的數(shù)組名代表該數(shù)組的首地址,相當(dāng)于一個指針常量 二維數(shù)組中各一維數(shù)組名也是一個指針常量,代表一維數(shù)組的首地址。若a的首地址為2000,則右圖可以清楚底說明數(shù)組名作為指針常量的引用情況 已知某元素的指針后,可以用*運算符訪問該元素。只需在*( ) 內(nèi)寫入含數(shù)組名的地址表達(dá)式,就可以引用數(shù)組元素 a0+1a0+2a0+3a0+1a0+2a0+37/28/202218程序設(shè)計基礎(chǔ) 張杰敏5.9 指針與多維數(shù)組(4) 使用指向二維數(shù)組的指針變量二維數(shù)組指針變量說明的一般語法形式為: 類型說明符 (*指針變量名) 長度其中 “類型說明符”

15、 為所指數(shù)組的數(shù)據(jù)類型?!?” 表示其后的變量是指針類型。“長度” 表示二維數(shù)組分解為多個一維數(shù)組時,一維數(shù)組的長度,也就是二維數(shù)組的列數(shù) 設(shè)p為指向二維數(shù)組的指針變量,把二維數(shù)組a34分解為一維數(shù)組a0,a1,a2之后,可定義為: int (*p)4;它表示p是一個指針變量,它指向二維數(shù)組a 或指向第一個一維數(shù)組a0,其值等于a, a0,或&a00等。而p+i則指向一維數(shù)組ai。從前面的分析可得出*(p+i)+j是二維數(shù)組i行j 列的元素的地址,而*(*(p+i)+j)則是i行j列元素的值 7/28/202219程序設(shè)計基礎(chǔ) 張杰敏5.10 指針與函數(shù)(1)函數(shù)的參數(shù)為指針 用指針作函數(shù)參數(shù)

16、,其作用是將一個變量的地址送到被調(diào)用函數(shù)之中,由此,被調(diào)用函數(shù)可以操作外部變量或主調(diào)出函數(shù)定義的變量單元 舉例說明7/28/202220程序設(shè)計基礎(chǔ) 張杰敏5.10 指針與函數(shù)(2)函數(shù)的返回值為指針 在C語言中允許一個函數(shù)的返回值是一個指針(即地址)。函數(shù)的返回值為指針型時,該函數(shù)常被稱為指針型函數(shù)。定義指針型函數(shù)的一般語法形式為: 存儲類型 數(shù)據(jù)類型 *函數(shù)名(形參表) /*函數(shù)體*/ 其中函數(shù)名之前加了“*”號表明這是一個指針型函數(shù),即返回值是一個指針。存儲類型是指該函數(shù)本身的存儲特性,一般分為缺省存儲類型和static型。數(shù)據(jù)類型說明符表示了返回的指針值所指向的數(shù)據(jù)類型 舉例說明7/28/202221程序設(shè)計基礎(chǔ) 張杰敏5.10 指針與函數(shù)(3)指向函數(shù)的指針 在C語言中規(guī)定,一個函數(shù)總是占用一段連續(xù)的內(nèi)存區(qū),而函數(shù)名就是該函數(shù)所占內(nèi)存區(qū)的首地址。我們可以把函數(shù)的這個首地址(或稱入口地址)賦予一個指針變量,使該指針變量指向該函數(shù),然后通過指針變量就可以找到并調(diào)用這個函數(shù)。我們把這種指向函數(shù)的指針變量稱為函數(shù)指針變量或函數(shù)(型)指針。函數(shù)指針定義和說明的一般語法形式; 存儲類型 數(shù)據(jù)類型(*函數(shù)指針名)(); 其中,存儲類型是指函數(shù)指針本身的存儲特性,而數(shù)據(jù)類型是

溫馨提示

  • 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論