指針基本概念介紹_第1頁(yè)
指針基本概念介紹_第2頁(yè)
指針基本概念介紹_第3頁(yè)
指針基本概念介紹_第4頁(yè)
指針基本概念介紹_第5頁(yè)
已閱讀5頁(yè),還剩68頁(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)介

1、第2-5講 指針1基本概念介紹指針的基本概念指針與數(shù)組指針與字符串指針與函數(shù)指針與結(jié)構(gòu)體引用的概念及應(yīng)用15.1 指針的概念一、指針與地址指針是C語(yǔ)言中的一個(gè)重要概念。掌握指針的用法,可使程序簡(jiǎn)潔、高效、靈活。例如:尋寶游戲66 1000P2111000 P為指針變量,1000(地址)是指針變量的值。 指針變量就是用來(lái)存放另一變量地址的變量2計(jì)算機(jī)的內(nèi)存是一些“存儲(chǔ)單元”的系列集。每個(gè)單元(字節(jié))有一個(gè)稱(chēng)為地址的數(shù)字與之關(guān)聯(lián)。地址都是從0開(kāi)始依次編號(hào)的。最后一個(gè)地址編號(hào)取決于內(nèi)存的大小。64K 65535當(dāng)聲明一個(gè)變量時(shí),系統(tǒng)會(huì)在內(nèi)存中分配適當(dāng)?shù)拇鎯?chǔ)空間,以保存該變量的值。內(nèi)存單元地址0123

2、4567.655353 指針是建立在下面3個(gè)基本概念的基礎(chǔ)上的: 計(jì)算機(jī)的內(nèi)存地址是指針常量(pointer constant)。我們不能修改它們,只能用來(lái)存儲(chǔ)數(shù)據(jù)值。 不能直接保存地址的值,只能利用地址運(yùn)算符(&)來(lái)獲取變量的地址。這樣獲得的值稱(chēng)為指針值(pointer value,也就是變量的地址)。指針值在程序每次運(yùn)行時(shí)都會(huì)發(fā)生變化。 包含指針值的變量稱(chēng)為指針變量(pointer variable)指針相關(guān)的基本概念 指針常量 指針值 指針變量 指針4二、指針變量的聲明 聲明形式: 數(shù)據(jù)類(lèi)型 * 指針變量名; “ * ” 表示這里聲明的是一個(gè)指針類(lèi)型的變量。 “ 數(shù)據(jù)類(lèi)型” 是指針?biāo)赶?/p>

3、的變量的類(lèi)型。一個(gè)指針變量只能指向同一個(gè)類(lèi)型的變量。 例如: int * point_a; / 聲明了一個(gè)指向 int 型數(shù)的指針變量 兩種理解:1)(int *) point_a; / point_a 為 int * (整數(shù)指針)2) int (*point_a); / *point_a 為一個(gè)整數(shù) 注意: int * point_a, point_b; / point_b為intint * point_a, * point_b; / point_b為int *5在C/C+中,每個(gè)指針均有兩方面的含義:內(nèi)存存儲(chǔ)單元和對(duì)存儲(chǔ)單元內(nèi)容的解釋內(nèi)存存儲(chǔ)單元就是地址 指針本身只包含地址,要使用指針指向

4、的數(shù)據(jù),必須先到達(dá)那個(gè)地址,提取并按一定規(guī)則解釋該內(nèi)存單元的內(nèi)容。內(nèi)存單元只不過(guò)是一些0/1位的組合。解釋的基礎(chǔ)依賴(lài)于指針的類(lèi)型 整數(shù)指針表示指針指向一個(gè)整數(shù),其真實(shí)含義是:程序從指針提供的單元地址提取整數(shù)所占字節(jié)數(shù)的0/1組合,即按整數(shù)編碼規(guī)則解釋。 例如:對(duì)同一存儲(chǔ)單元,用幾種方法解釋得到不同的結(jié)果。6假設(shè)內(nèi)存單元為(16進(jìn)制): 0a 61 62 63 64 65 66 67 68 69 6a解釋結(jié)果: int * :提取 0a 61char * :提取 0a float * :提取 0a 61 62 63long * :提取 0a 61 62 637三、與指針相關(guān)的運(yùn)算符: & 和 *

5、 “ & ” 為取地址(引用)運(yùn)算符,用來(lái)得到一個(gè)變量的地址。位于變量之前的地址運(yùn)算符將可返回該變量的地址。運(yùn)算符“&”只能用于單個(gè)變量或一個(gè)數(shù)組元素。&125 非法!指向了常量int x10 &x 非法!指向了數(shù)組名&(x+y) 非法!指向了表達(dá)式8必須確保指針變量總是指向相應(yīng)的數(shù)據(jù)類(lèi)型。 float a, b; int x, *p; p = &a; 錯(cuò)!可以把初始化和聲明組合在一起。 int a, b; int *pt1, *pt2=&b; / 把變量b的地址賦給指針變量pt2 pt1 = &a; / 把變量a的地址賦給指針變量pt1唯一要求的是變量必須在初始化之前就已經(jīng)聲明過(guò)了。可以在定

6、義指針變量時(shí)帶有一個(gè)初始值NULL或零。 int *p=NULL; /定義p為指向整形變量的指針變量, / 并初始化為0 int *p=0;9“ * ” 為間接訪(fǎng)問(wèn)運(yùn)算符(或稱(chēng)“反引用”運(yùn)算符),表示指針?biāo)赶虻淖兞康闹怠?在聲明語(yǔ)句中,“ * ” 表示聲明的變量是一個(gè)指針。 int *point_a; 在執(zhí)行語(yǔ)句中或聲明語(yǔ)句的初值表達(dá)式中,表示訪(fǎng)問(wèn)指針?biāo)笇?duì)象的內(nèi)容。例如: printf(%d, *point_a); / 輸出指針 point_a 所指向的內(nèi)容int a, *pt, b;a = 100;pt = &a; / 將a 的地址賦給指針變量ptb = *pt; / *pt返回的是變量

7、a的值a = *(&a) = *pt = n&a = &(*pt)10例5-1,通過(guò)指針變量訪(fǎng)問(wèn)整型變量 11指針的賦值在聲明指針的同時(shí)進(jìn)行初始化賦值 數(shù)據(jù)類(lèi)型 * 指針名 = 初始地址;int a = 100;int *pt = &a; / 聲明并用變量名來(lái)初始化指針int array10;int *pt = array; / 聲明并用數(shù)組名來(lái)初始化指針 在聲明之后,單獨(dú)使用賦值語(yǔ)句 指針名 = 地址;int a = 100, x;int *pt;pt = &a; / 把變量 a 的地址賦給指針 pt可以通過(guò)指針變量 pt 間接訪(fǎng)問(wèn)變量ax = *pt; / 等價(jià)于: x = a;12指針變

8、量和一般變量一樣, 對(duì)于同一類(lèi)型,存放在它們之中的值是可以改變的, 也就是說(shuō)可以改變它們的指向 int a, b, *pt1, *pt2; a = 100; b = 200; pt1 = &a; / 把變量 a 的地址賦給指針 pt1 pt2 = pt1; / 使pt2 與pt1指向同一對(duì)象 pt2 = &b; / 把變量 b 的地址賦給指針 pt2 *pt2 = *pt1; / 表示把pt1指向的內(nèi)容賦給pt2所指的區(qū)域pt2bpt1a200100&a100&b&a13對(duì)運(yùn)算符& 和 * 的幾點(diǎn)說(shuō)明:1)如pt1 = &a; ,若&*pt1,則按自右而左方向結(jié)合(優(yōu)先級(jí)相同),因此先進(jìn)行 *

9、pt1運(yùn)算,就是變量a,再執(zhí)行&運(yùn)算,即為變量a的地址。pt2 &*pt1; / 它的作用是將&a賦給pt2,等價(jià)于 pt2 = &a; 如果pt2原來(lái)指向b,經(jīng)過(guò)重新賦值后,它已不再指向b了。pt2b&apt1a&a&b142)*&a :先進(jìn)行&a 運(yùn)算,得a 的地址,再進(jìn)行* 運(yùn)算。與a等價(jià)3)(*pt)+ 相當(dāng)于 a+如果沒(méi)有(),相當(dāng)于*(pt+)。即先做pt+,再求*。而 pt+ 為后加,故先對(duì)pt做*pt 操作,得到a,再使pt加1,這樣,pt就不再指向a了四、指針鏈把一個(gè)指針指向另一個(gè)指針,從而形成如下所示的指針鏈多重間接(multiple indirection) 地址2pt2

10、地址1 pt1值變量15指向指針的指針變量必須在名稱(chēng)前面添加額外的間接運(yùn)算符。例如:int *pt; / pt 是指向int 類(lèi)型的指針的指針可以使用兩次間接運(yùn)算符,用指向指針的指針來(lái)間接地訪(fǎng)問(wèn)目標(biāo)值。例5-2,通過(guò)指向指針的指針變量訪(fǎng)問(wèn)整型變量16五、指針表達(dá)式與其它變量一樣,指針變量也可用于表達(dá)式中。還可以使用關(guān)系運(yùn)算符對(duì)指針進(jìn)行比較。p1 = p2p1 != p2對(duì)單獨(dú)變量的指針進(jìn)行比較沒(méi)有意義。指針比較一般用于處理數(shù)組或字符串 合法 合法 合法 合法 錯(cuò)!17指針可以進(jìn)行遞增、遞減運(yùn)算p1 = p1 + 1;p1 = p2 + 2;當(dāng)指針進(jìn)行遞增(減)時(shí),所增加的值為該指針指向的數(shù)據(jù)類(lèi)

11、型的“長(zhǎng)度”字符char1字節(jié)整數(shù)int2字節(jié)浮點(diǎn)數(shù)float4字節(jié)長(zhǎng)整數(shù)long4字節(jié)雙精度數(shù)double8字節(jié)18 1)可以把另一個(gè)變量的地址賦給指針變量。 2)可以把一個(gè)指針變量的值賦給另一個(gè)指針變量。 3)可以使用NULL或零值來(lái)初始化指針變量。 4)可以在指針變量的前面或后面添加遞增或遞減運(yùn)算符。 5)指針變量可以與整數(shù)值進(jìn)行加減運(yùn)算。 6)當(dāng)兩個(gè)指針指向相同數(shù)據(jù)類(lèi)型的對(duì)象時(shí),可以使用關(guān)系運(yùn)算符對(duì)它們進(jìn)行比較操作。 7)不能把指針變量與常量做乘法運(yùn)算。 8)兩個(gè)獨(dú)立的指針變量不能做加法運(yùn)算。 9)不能把一個(gè)數(shù)值賦給地址。(例如,&x=10 是非法的) 指針操作的規(guī)則195.2 指針與

12、數(shù)組一、指向數(shù)組元素的指針通過(guò)數(shù)組下標(biāo)所能完成的任何操作都可以通過(guò)指針來(lái)實(shí)現(xiàn)。用指針編寫(xiě)的程序比用數(shù)組下標(biāo)編寫(xiě)的程序執(zhí)行速度快,但理解起來(lái)稍微困難一些。例如:int a10, x;int *pa;pa = &a0; / pa指向數(shù)組a的第0個(gè)元素 pa=a;x = *pa; / 把a(bǔ)0中的內(nèi)容復(fù)制到變量x中pa = &a2; / pa=a+2;2018161412108642a0a9 pa:a:pa+1:pa+2:20二、通過(guò)指針引用數(shù)組元素如果pa = &a0; 則也可通過(guò)指針訪(fǎng)問(wèn)數(shù)組元素ai *(a+i) *(pa+i)pai *(pa+i) 引用一個(gè)數(shù)組元素的方法:下標(biāo)法,ai指針?lè)ǎ?

13、(pa+i) 或*(a+i)數(shù)組元素的地址是通過(guò)它的索引和數(shù)據(jù)類(lèi)型的長(zhǎng)度(比例因子)來(lái)計(jì)算的。xi的地址 = 基本地址 + (i 數(shù)據(jù)類(lèi)型的比例因子)例5-3,設(shè)有一個(gè)int 型一維數(shù)組a,有10個(gè)元素。用三種方法輸出各元素。2122使用注意 通過(guò)指針訪(fǎng)問(wèn)數(shù)組元素必須保證所有間接訪(fǎng)問(wèn)都在合法范圍內(nèi)進(jìn)行 由運(yùn)算取得的指針值不能超出數(shù)組首元素和末元素的位置ai0* ( p + i )321a0a9 p:a:p+1, a+1:p+2, a+2:p+i, a+i:p+9, a+9:23 p = a;24三、地址算術(shù)運(yùn)算如果p是一個(gè)指向數(shù)組中某個(gè)元素的指針,那么p+將對(duì)p進(jìn)行自增運(yùn)算,并指向下一個(gè)元素;

14、而p=p+i 將對(duì)p進(jìn)行加i的增量運(yùn)算,使其指向指針p當(dāng)前指向的元素之后的第i個(gè)元素。*p+,自右向左結(jié)合,等價(jià)于*(p+)。作用是先得到p指向的變量的值(*p),然后再使p+1p。*(p+)與*(+p)作用不同。前者先取*p值,然后使p加1;后者使先使p加1,再取*p值。(*p)+,表示p所指向的元素值加1。*(p-)與*(-p)25指針在一定條件下,可進(jìn)行比較。例如:兩個(gè)指針變量p, q指向同一數(shù)組, 則, =,=, =等關(guān)系運(yùn)算符都能正常進(jìn)行。 若p = = q為真, 則表示p, q 指向數(shù)組的同一元 素; 若pq 為真, 則表示p所指向的數(shù)組元素在q所指向的數(shù)組元素之前。兩個(gè)指針變量在

15、一定條件下, 可進(jìn)行減法運(yùn)算。例如:設(shè)p, q指向同一數(shù)組, 且pq,則p-q+1表示位于p和q指向的元素之間的元素的個(gè)數(shù)。指針與整數(shù)之間不能相互轉(zhuǎn)換,但0是唯一的例外。常量0可以賦值給指針,指針也可以和常量0進(jìn)行比較。程序中經(jīng)常用符號(hào)常量NULL代替常量0。符號(hào)常量NULL定義在標(biāo)準(zhǔn)頭文件 中。26有效的指針運(yùn)算包括:相同類(lèi)型之間的賦值運(yùn)算;指針同整數(shù)之間的加法或減法運(yùn)算;指向相同數(shù)組中元素的兩個(gè)指針間的減法或比較運(yùn)算;將指針賦值為0 (或NULL);指針與0 (或NULL)之間的比較運(yùn)算。27四、指針使用中的常見(jiàn)錯(cuò)誤指針使用靈活,用途廣泛,但容易出錯(cuò)。 錯(cuò)誤使用主要表現(xiàn)為:讀出操作,導(dǎo)致得

16、到無(wú)效的數(shù)據(jù)。 這是因?yàn)椋阂粋€(gè)指針在定義后而被賦值之前,其值是未知的。寫(xiě)入操作,導(dǎo)致重寫(xiě)其他數(shù)據(jù)甚至代碼段,這種錯(cuò)誤的影響有時(shí)不會(huì)立即表現(xiàn)出來(lái)。使用指針的最常見(jiàn)錯(cuò)誤是非法間接訪(fǎng)問(wèn),例如: int *p, n = 3; *p = n; / 錯(cuò)!這個(gè)語(yǔ)句是個(gè)大錯(cuò)誤,它可能引起的后果無(wú)法預(yù)料。28五、多維數(shù)組與指針多維數(shù)組元素的地址二維數(shù)組在內(nèi)存中是按行存放的int a33=1,2,3, 2,3,4, 3,4,5;543432321a2a1a0a(2000)a+1(2006)a+2(2012)a0(2000)a0+1(2002)a0+2(2004)29表示形式含義a二維數(shù)組名,指向第0行首地址a0,

17、 *(a+0), *a第0行第0列元素地址a+1, &a1第1行首地址a+i, &ai第i行首地址a1,*(a+1)第1行第0列元素a10的地址a1+1, *(a+1)+1, &a11第1行第1列元素a11的地址ai+j, *(a+i)+j, &aij第i行第j列元素aij的地址*(a1+1), *(*(a+1)+1), a11第1行第1列元素a11的值*(ai+j), *(*(a+i)+j), aij第i行第j列元素aij的值30例5-4,用指針實(shí)現(xiàn)二維數(shù)組的輸出31指向多維數(shù)組元素的指針變量 指向數(shù)組元素的指針 計(jì)算aij在數(shù)組中的相對(duì)位置(數(shù)組大小為mn)為:i*n+j例5-5,改寫(xiě)例5

18、-4 32指向有m個(gè)元素組成的一維數(shù)組的指針變量int a3; int array23;int (*p)3; int a3; / p 所指的對(duì)象是一個(gè)包含3個(gè)元素的一維數(shù)組,p的值是該一維數(shù)組的首地址p = array(*p)2(*p)1(*p)0(*p)數(shù)組parray1array0pp+133例5-6,改寫(xiě)例5-434六、指針數(shù)組的概念數(shù)組中的每個(gè)元素均為指針類(lèi)型數(shù)據(jù)一維指針數(shù)組的定義形式為: 類(lèi)型名 *數(shù)組名數(shù)組長(zhǎng)度;int *p5;比較適于用來(lái)指向若干字符串,是字符串處理更加方便、靈活例如,圖書(shū)館查書(shū),書(shū)名都是字符串且書(shū)名長(zhǎng)度不同,若放在一個(gè)數(shù)組中且對(duì)它們進(jìn)行排序,因此如設(shè)計(jì)一個(gè)二維字

19、符數(shù)組,需指定長(zhǎng)度,浪費(fèi)空間??捎弥羔様?shù)組來(lái)實(shí)現(xiàn)35例5-7,將若干字符串按字母順序(由小到大)輸出將字符串?dāng)?shù)組作為函數(shù)參數(shù)(sort函數(shù)實(shí)現(xiàn))sort函數(shù)的兩個(gè)參數(shù):string用來(lái)接收字符串?dāng)?shù)組,char *string n 用來(lái)接收該字符串?dāng)?shù)組的大小字符串排序算法(選擇排序法)基本思想:在某個(gè)位置i,找從該位置到最后一個(gè)元素之間最小的元素。找到后,如果這個(gè)元素不是位置i,則要把這個(gè)最小元素交換到i 位置。i 從1 到倒數(shù)第2個(gè)元素,重復(fù)進(jìn)行上述選擇,就會(huì)完成數(shù)組中各元素的排序輸出一組字符串printf(%s%c, stringi, (i成員名 / - 稱(chēng)為成員選擇運(yùn)算符 (*p).成員名 p-.成員名65二、指向結(jié)構(gòu)數(shù)組的指針例5

溫馨提示

  • 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)論