第6章_數(shù)據(jù)存儲_第1頁
第6章_數(shù)據(jù)存儲_第2頁
第6章_數(shù)據(jù)存儲_第3頁
第6章_數(shù)據(jù)存儲_第4頁
第6章_數(shù)據(jù)存儲_第5頁
已閱讀5頁,還剩118頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、計算基礎(chǔ)計算基礎(chǔ)C+C+語言實現(xiàn)語言實現(xiàn)在進(jìn)行比較復(fù)雜的運算時,通常會借助紙張完成運算過程在進(jìn)行比較復(fù)雜的運算時,通常會借助紙張完成運算過程。在利用計算機解決實際問題時,同樣需要一些空間來保存待處在利用計算機解決實際問題時,同樣需要一些空間來保存待處理的數(shù)據(jù)、運算的中間結(jié)果和運算的最終結(jié)果,這些空間就是計理的數(shù)據(jù)、運算的中間結(jié)果和運算的最終結(jié)果,這些空間就是計算機的內(nèi)存空間。算機的內(nèi)存空間。本章重點介紹計算機中數(shù)據(jù)存儲的基本原理,本章重點介紹計算機中數(shù)據(jù)存儲的基本原理,以及如何使用以及如何使用C+C+編寫程序操作內(nèi)存中的數(shù)據(jù)。通過本章的學(xué)習(xí)編寫程序操作內(nèi)存中的數(shù)據(jù)。通過本章的學(xué)習(xí),一方面能夠掌

2、握計算機中數(shù)據(jù)存儲的基本原理;另一方面能夠,一方面能夠掌握計算機中數(shù)據(jù)存儲的基本原理;另一方面能夠使用使用C+C+提供的指針類型操作內(nèi)存中的數(shù)據(jù),解決實際問題。本提供的指針類型操作內(nèi)存中的數(shù)據(jù),解決實際問題。本章還介紹指針與函數(shù)、引用、引用與函數(shù)、指針相減運算和關(guān)系章還介紹指針與函數(shù)、引用、引用與函數(shù)、指針相減運算和關(guān)系運算等方面的內(nèi)容。運算等方面的內(nèi)容。2人們在進(jìn)行比較復(fù)雜的運算時,通人們在進(jìn)行比較復(fù)雜的運算時,通常會借助紙張完成運算過程。在利用計常會借助紙張完成運算過程。在利用計算機解決實際問題時,同樣需要一些空算機解決實際問題時,同樣需要一些空間來保存待處理的數(shù)據(jù)、運算的中間結(jié)間來保存待

3、處理的數(shù)據(jù)、運算的中間結(jié)果和運算的最終結(jié)果,這些空間就是計果和運算的最終結(jié)果,這些空間就是計算機的內(nèi)存空間。算機的內(nèi)存空間。內(nèi)存內(nèi)存空間中含有大量的存儲單元,空間中含有大量的存儲單元,每個存儲單元由一個唯一的內(nèi)存地址標(biāo)每個存儲單元由一個唯一的內(nèi)存地址標(biāo)識,可以存放識,可以存放1 1個字節(jié)的數(shù)據(jù),內(nèi)存地個字節(jié)的數(shù)據(jù),內(nèi)存地址的編號從址的編號從0 0開始,順次增開始,順次增1 1,圖,圖6-16-1內(nèi)內(nèi)存地址示例即對于容量為存地址示例即對于容量為N N的內(nèi)存,其的內(nèi)存,其內(nèi)存地址編號為內(nèi)存地址編號為0 0N-1N-1,如圖,如圖6-16-1所示。所示。6 6.1 .1 數(shù)據(jù)存儲數(shù)據(jù)存儲的基本原理的

4、基本原理3在在3232位系統(tǒng)中,內(nèi)存地址由位系統(tǒng)中,內(nèi)存地址由3232位二進(jìn)制數(shù)組成位二進(jìn)制數(shù)組成,內(nèi)存地,內(nèi)存地址編號從址編號從0 0開始、最大為開始、最大為2 23232-1-1,因此,因此,3232位系統(tǒng)理論支持的位系統(tǒng)理論支持的最大內(nèi)存容量為最大內(nèi)存容量為2 23232(=4G=4G)字節(jié)。而)字節(jié)。而在在6464位系統(tǒng)中,內(nèi)存地位系統(tǒng)中,內(nèi)存地址由址由6464位二進(jìn)制數(shù)組成位二進(jìn)制數(shù)組成,因此,因此,6464位系統(tǒng)理論支持的最大內(nèi)位系統(tǒng)理論支持的最大內(nèi)存容量為存容量為2 26464(=16777216T=16777216T)字節(jié)。)字節(jié)。在在運行一個程序時,系統(tǒng)將分配給該程序一些內(nèi)存

5、空間,運行一個程序時,系統(tǒng)將分配給該程序一些內(nèi)存空間,根據(jù)內(nèi)存空間中存儲的數(shù)據(jù)類型不同,可將其分為根據(jù)內(nèi)存空間中存儲的數(shù)據(jù)類型不同,可將其分為4 4個區(qū)域個區(qū)域。(1 1)代碼代碼區(qū)區(qū): : 存放程序的代碼(在運行程序時會先將程序存放程序的代碼(在運行程序時會先將程序加載到內(nèi)存的代碼區(qū)中再執(zhí)行)。加載到內(nèi)存的代碼區(qū)中再執(zhí)行)。(2 2)全局全局?jǐn)?shù)據(jù)區(qū)數(shù)據(jù)區(qū): : 存放程序中的全局?jǐn)?shù)據(jù)和靜態(tài)數(shù)據(jù)(在存放程序中的全局?jǐn)?shù)據(jù)和靜態(tài)數(shù)據(jù)(在定義全局變量或靜態(tài)變量時會在全局?jǐn)?shù)據(jù)區(qū)為其分配內(nèi)存空定義全局變量或靜態(tài)變量時會在全局?jǐn)?shù)據(jù)區(qū)為其分配內(nèi)存空間來存儲數(shù)據(jù))間來存儲數(shù)據(jù))。6 6.1 .1 數(shù)據(jù)存儲數(shù)據(jù)存

6、儲的基本原理的基本原理4(3 3)堆堆區(qū)區(qū): : 存放程序中的動態(tài)數(shù)據(jù)(使用動態(tài)方式分配內(nèi)存放程序中的動態(tài)數(shù)據(jù)(使用動態(tài)方式分配內(nèi)存時會在堆區(qū)分配內(nèi)存空間來存儲數(shù)據(jù),關(guān)于動態(tài)內(nèi)存分配存時會在堆區(qū)分配內(nèi)存空間來存儲數(shù)據(jù),關(guān)于動態(tài)內(nèi)存分配的內(nèi)容請參閱的內(nèi)容請參閱6.2.66.2.6節(jié))節(jié))。(4 4)棧棧區(qū)區(qū): : 存放程序中的局部數(shù)據(jù)(在定義局部變量時會存放程序中的局部數(shù)據(jù)(在定義局部變量時會在棧區(qū)為其分配內(nèi)存空間來存儲數(shù)據(jù))。在棧區(qū)為其分配內(nèi)存空間來存儲數(shù)據(jù))。定義定義任何一個變量,系統(tǒng)都會為其分配一定大小的內(nèi)存任何一個變量,系統(tǒng)都會為其分配一定大小的內(nèi)存空間,訪問變量實際上就是訪問其所對應(yīng)內(nèi)

7、存空間中的數(shù)據(jù)空間,訪問變量實際上就是訪問其所對應(yīng)內(nèi)存空間中的數(shù)據(jù)。6 6.1 .1 數(shù)據(jù)存儲數(shù)據(jù)存儲的基本原理的基本原理5例如例如,在,在C+C+中,有如下變量中,有如下變量定義語句定義語句: 0 x61626364;: 0 x61626364;系統(tǒng)會系統(tǒng)會為為a a分配分配sizeofsizeof( (intint)=4)=4字節(jié)的內(nèi)字節(jié)的內(nèi)存空間,并且該片內(nèi)存空間中所存空間,并且該片內(nèi)存空間中所存儲的數(shù)據(jù)為存儲的數(shù)據(jù)為0 x616263640 x61626364,如圖,如圖6-26-2所示。這里數(shù)據(jù)在內(nèi)存中按所示。這里數(shù)據(jù)在內(nèi)存中按從高字節(jié)到低字節(jié)的順序存儲,從高字節(jié)到低字節(jié)的順序存儲,

8、在有的系統(tǒng)中數(shù)據(jù)在內(nèi)存中是按在有的系統(tǒng)中數(shù)據(jù)在內(nèi)存中是按從低字節(jié)到高字節(jié)的順序存儲。從低字節(jié)到高字節(jié)的順序存儲。如果要編寫具有較好移植性、能如果要編寫具有較好移植性、能夠在多個系統(tǒng)下運行的程序,就夠在多個系統(tǒng)下運行的程序,就要在編程時考慮這一不同。要在編程時考慮這一不同。6 6.1 .1 數(shù)據(jù)存儲數(shù)據(jù)存儲的基本原理的基本原理6提示提示: : 3232位系統(tǒng)中內(nèi)存地址由位系統(tǒng)中內(nèi)存地址由3232位二進(jìn)制數(shù)組成。十六進(jìn)制數(shù)是二位二進(jìn)制數(shù)組成。十六進(jìn)制數(shù)是二進(jìn)制數(shù)的壓縮表示形式,進(jìn)制數(shù)的壓縮表示形式,1 1位十六進(jìn)制數(shù)相當(dāng)于位十六進(jìn)制數(shù)相當(dāng)于4 4位二進(jìn)制數(shù),為位二進(jìn)制數(shù),為了簡化地址表示,了簡化地

9、址表示,3232位系統(tǒng)中的內(nèi)存地址通常以位系統(tǒng)中的內(nèi)存地址通常以8 8位十六進(jìn)制數(shù)表位十六進(jìn)制數(shù)表示,如圖示,如圖6-26-2所示。同理,所示。同理,6464位系統(tǒng)中的內(nèi)存地址通常以位系統(tǒng)中的內(nèi)存地址通常以1616位十六位十六進(jìn)制數(shù)表示。進(jìn)制數(shù)表示。 圖圖6-26-2僅為了說明數(shù)據(jù)在內(nèi)存中的存儲方式。實際上,在定義僅為了說明數(shù)據(jù)在內(nèi)存中的存儲方式。實際上,在定義一個變量時,不同環(huán)境下系統(tǒng)為該變量分配的內(nèi)存空間可能會不一個變量時,不同環(huán)境下系統(tǒng)為該變量分配的內(nèi)存空間可能會不同。因此,讀者在自己機器上定義變量同。因此,讀者在自己機器上定義變量a a并查看其所對應(yīng)的內(nèi)存空并查看其所對應(yīng)的內(nèi)存空間時一

10、般會與圖間時一般會與圖6-26-2所顯示的內(nèi)存地址不一致。所顯示的內(nèi)存地址不一致。在在前面的章節(jié)中,都是使用通過變量名去訪問對應(yīng)內(nèi)存前面的章節(jié)中,都是使用通過變量名去訪問對應(yīng)內(nèi)存中數(shù)據(jù)的方式。實際上,中數(shù)據(jù)的方式。實際上,C+C+還提供了另外一種通過指針直還提供了另外一種通過指針直接訪問內(nèi)存中數(shù)據(jù)的方式接訪問內(nèi)存中數(shù)據(jù)的方式。6 6.1 .1 數(shù)據(jù)存儲數(shù)據(jù)存儲的基本原理的基本原理7指針指針是用于存放內(nèi)存地址的一種數(shù)據(jù)類型。指針可以是是用于存放內(nèi)存地址的一種數(shù)據(jù)類型。指針可以是常量常量,例如數(shù)組名就是一個指針常量,表示該數(shù)組所占據(jù)內(nèi),例如數(shù)組名就是一個指針常量,表示該數(shù)組所占據(jù)內(nèi)存空間的首地址。

11、存空間的首地址。指針也可以是變量指針也可以是變量,例如可以定義一個指,例如可以定義一個指針類型的變量保存一個內(nèi)存地址。在程序設(shè)計中,可以使用針類型的變量保存一個內(nèi)存地址。在程序設(shè)計中,可以使用指針常量或指針變量直接操作它們所指向的內(nèi)存空間中的數(shù)指針常量或指針變量直接操作它們所指向的內(nèi)存空間中的數(shù)據(jù)。下面先介紹指針變量的定義、初始化和訪問方法。據(jù)。下面先介紹指針變量的定義、初始化和訪問方法。u 6.2.1 6.2.1 指針指針變量的定義變量的定義指針指針是一種存儲地址的數(shù)據(jù)類型,因此,也可以定義指是一種存儲地址的數(shù)據(jù)類型,因此,也可以定義指針類型的變量針類型的變量指針變量。與其他類型的變量一樣,

12、指針變量。與其他類型的變量一樣,在使在使用指針變量之前必須先定義,其定義形式為用指針變量之前必須先定義,其定義形式為: : * * ;6.2 6.2 指針指針8其中其中, 表示指針變量所指向內(nèi)存空間中數(shù)據(jù)表示指針變量所指向內(nèi)存空間中數(shù)據(jù)的類型,的類型,* *表示所要定義的變量為一個指針變量,而不是普表示所要定義的變量為一個指針變量,而不是普通變量。通變量。* *作用于變量名作用于變量名,表示緊隨其后的變量為一個指針,表示緊隨其后的變量為一個指針變量。變量。例如例如,要同時定義兩個,要同時定義兩個intint型指針變量型指針變量p1p1和和p2p2,必須寫成,必須寫成如下形式如下形式: :int

13、int * *p1, p1, * *p2;p2; 如果如果寫成寫成: : intint * *p1, p2;p1, p2;則則表示定義了一個指針變量表示定義了一個指針變量p1p1和一個普通變量和一個普通變量p2p2。6.2 6.2 指針指針9指針是一種數(shù)據(jù)類型,所以指針是一種數(shù)據(jù)類型,所以也可以創(chuàng)建一個指針類型的也可以創(chuàng)建一個指針類型的數(shù)組數(shù)組。指針數(shù)組同樣可以有不同的維數(shù),這里只給出。指針數(shù)組同樣可以有不同的維數(shù),這里只給出一維指一維指針數(shù)組的定義形式針數(shù)組的定義形式: : * * ;指針指針數(shù)組中的每個元素都是指向同一數(shù)據(jù)類型的指針變數(shù)組中的每個元素都是指向同一數(shù)據(jù)類型的指針變量,量,指針

14、數(shù)組元素的訪問方法與一般數(shù)組元素的訪問方法完指針數(shù)組元素的訪問方法與一般數(shù)組元素的訪問方法完全一樣全一樣,例如,例如: :intint * *pArrpArr3; 3; 語句語句定義了一個包含定義了一個包含3 3個元素的一維數(shù)組,每個元素個元素的一維數(shù)組,每個元素pArrpArr00、pArrpArr11、pArrpArr22都是一個都是一個intint型指針變量。型指針變量。6.2 6.2 指針指針10u 6.2.2 6.2.2 指針指針變量的初始化變量的初始化同同普通變量一樣,普通變量一樣,在定義指針變量的同時可以對其進(jìn)行在定義指針變量的同時可以對其進(jìn)行初始化,其初始化形式為初始化,其初始

15、化形式為: : * * =;其中其中, 一般來說可以有一般來說可以有3 3種形式。種形式。 初始化為初始化為NULLNULL或或0: NULL0: NULL為系統(tǒng)定義的一個常量,其值為為系統(tǒng)定義的一個常量,其值為0 0,表示指針變量指向的是一片無效的不可訪問的內(nèi)存。比,表示指針變量指向的是一片無效的不可訪問的內(nèi)存。比如如: : intint * *p=NULL;p=NULL;6.2 6.2 指針指針11 初始化為已定義變量的地址初始化為已定義變量的地址: : 將一個已定義變量所對應(yīng)將一個已定義變量所對應(yīng)內(nèi)存空間的首地址作為指針變量的初值,此時通過該指針變內(nèi)存空間的首地址作為指針變量的初值,此時

16、通過該指針變量可以直接操作已定義變量所占據(jù)內(nèi)存中的數(shù)據(jù)。比如量可以直接操作已定義變量所占據(jù)內(nèi)存中的數(shù)據(jù)。比如: : intint * *p=&a;p=&a;& &a a表示獲取表示獲取a a所對應(yīng)內(nèi)存空間的首地址(即起始地址),所對應(yīng)內(nèi)存空間的首地址(即起始地址),其中其中& &稱為取地址運算符。如果變量稱為取地址運算符。如果變量a a所對應(yīng)的內(nèi)存空間如圖所對應(yīng)的內(nèi)存空間如圖6-26-2所示,則通過所示,則通過&a&a獲取到的首地址為獲取到的首地址為0 x0025f7580 x0025f758。定義指。定義指針變量針變量p p并初始化后,指針變量并初始化后,指針變量p p中存儲了中存儲了a a

17、所對應(yīng)內(nèi)存空間所對應(yīng)內(nèi)存空間的首地址,即的首地址,即0 x0025f7580 x0025f758,此時,也稱,此時,也稱“指針變量指針變量p p指向了指向了變量變量a”a”,通過指針變量,通過指針變量p p可以操作可以操作a a所對應(yīng)內(nèi)存空間中的數(shù)所對應(yīng)內(nèi)存空間中的數(shù)據(jù)據(jù)。6.2 6.2 指針指針12 初始化為某一動態(tài)分配內(nèi)存空間的地址初始化為某一動態(tài)分配內(nèi)存空間的地址: : 后面的章節(jié)中后面的章節(jié)中會學(xué)習(xí)到動態(tài)分配內(nèi)存空間的方式,這里知道有這樣一個概會學(xué)習(xí)到動態(tài)分配內(nèi)存空間的方式,這里知道有這樣一個概念就可以。念就可以。提示提示: : (1 1)指針指針變量的數(shù)據(jù)類型與其所指向的變量的數(shù)據(jù)類

18、型必須一致,變量的數(shù)據(jù)類型與其所指向的變量的數(shù)據(jù)類型必須一致,否則就要給出顯式的強制類型轉(zhuǎn)換。例如否則就要給出顯式的強制類型轉(zhuǎn)換。例如: : intint a; a;intint * *p1=&ap1=&a; /; /正確正確: :指針變量的數(shù)據(jù)類型與其所指向指針變量的數(shù)據(jù)類型與其所指向的的/變量變量的數(shù)據(jù)類型的數(shù)據(jù)類型一致一致char char * *p2p2=&a; /=&a; /錯誤錯誤: :指針變量的數(shù)據(jù)類型與其所指針變量的數(shù)據(jù)類型與其所指向指向/的的變量的數(shù)據(jù)類型不變量的數(shù)據(jù)類型不一致一致char char * *p3p3=(=(charchar* *)&)&a; /a; /正確正確

19、: :通過強制類型轉(zhuǎn)換將通過強制類型轉(zhuǎn)換將intint /型地址轉(zhuǎn)換為型地址轉(zhuǎn)換為charchar型地址型地址, ,但一般但一般不建議這樣不建議這樣使用使用6.2 6.2 指針指針13(2 2)在在一個一個3232位(或位(或6464位)系統(tǒng)中,內(nèi)存地址以位)系統(tǒng)中,內(nèi)存地址以3232位(或位(或6464位)位)二進(jìn)制數(shù)表示,即二進(jìn)制數(shù)表示,即4 4(或(或8 8)個字節(jié)。指針變量中存儲的是內(nèi)存地)個字節(jié)。指針變量中存儲的是內(nèi)存地址,因此,一個指針變量無論是什么類型,都是占用址,因此,一個指針變量無論是什么類型,都是占用4 4(或(或8 8)個)個字節(jié)的內(nèi)存空間。例如,在字節(jié)的內(nèi)存空間。例如,

20、在3232位系統(tǒng)中,前面的位系統(tǒng)中,前面的intint型指針變量型指針變量p1p1和和charchar型指針變量型指針變量p3p3都是占用都是占用4 4個字節(jié)的內(nèi)存空間。個字節(jié)的內(nèi)存空間。6.2 6.2 指針指針14u 6.2.3 6.2.3 使用使用指針訪問內(nèi)存中的數(shù)據(jù)指針訪問內(nèi)存中的數(shù)據(jù)一一個指針指向有效的內(nèi)存地址后,就可以通過該指針訪個指針指向有效的內(nèi)存地址后,就可以通過該指針訪問其所指向內(nèi)存空間中的數(shù)據(jù),訪問形式為問其所指向內(nèi)存空間中的數(shù)據(jù),訪問形式為: : * * 其中其中,* *被稱為間接訪問運算符,或取內(nèi)容運算符,其與取被稱為間接訪問運算符,或取內(nèi)容運算符,其與取地址運算符地址運

21、算符& &的功能相反,即對于任一變量的功能相反,即對于任一變量a a有有: : * *(&a)(&a)等價等價于于a a。 是指計算結(jié)果為內(nèi)存地址的表達(dá)式。是指計算結(jié)果為內(nèi)存地址的表達(dá)式。提示提示: : 使用取內(nèi)容運算符從指針?biāo)赶虻膬?nèi)存中取得的數(shù)據(jù)使用取內(nèi)容運算符從指針?biāo)赶虻膬?nèi)存中取得的數(shù)據(jù)一方面與內(nèi)存空間中存儲的數(shù)據(jù)有關(guān),另一方面也與指針的類型一方面與內(nèi)存空間中存儲的數(shù)據(jù)有關(guān),另一方面也與指針的類型有關(guān)有關(guān)。例如。例如: : 6.2 6.2 指針指針15intint a=0 x61626364; a=0 x61626364;intint * *p1p1=&a=&a; ;char char

22、 * *p2p2=(=(charchar* *)&)&a a; ;coutcoutp1,p1,p2p2endlendl; ;其中其中,變量,變量a a所對應(yīng)的內(nèi)存空間如圖所對應(yīng)的內(nèi)存空間如圖6-26-2所示,指針變量所示,指針變量p1p1和和p2p2中中均保存著變量均保存著變量a a的首地址的首地址0 x0025f7580 x0025f758。p1p1是是intint類型的指針,因此類型的指針,因此通過通過* *p1p1會從內(nèi)存地址會從內(nèi)存地址0 x0025f7580 x0025f758開始取連續(xù)開始取連續(xù)4 4個字節(jié)的數(shù)據(jù)(即個字節(jié)的數(shù)據(jù)(即一個一個intint型數(shù)據(jù));型數(shù)據(jù));p2p2是

23、是charchar類型的指針,因此通過類型的指針,因此通過* *p2p2會從內(nèi)存會從內(nèi)存地址地址0 x0025f7580 x0025f758開始取開始取1 1個字節(jié)的數(shù)據(jù)(即一個個字節(jié)的數(shù)據(jù)(即一個charchar型數(shù)據(jù))。最型數(shù)據(jù))。最后輸出后輸出* *p1p1和和* *p2p2時會分別輸出時會分別輸出16338379241633837924(十六進(jìn)制數(shù)(十六進(jìn)制數(shù)0 x616263640 x61626364所對應(yīng)的十進(jìn)制數(shù))和所對應(yīng)的十進(jìn)制數(shù))和d d(字符(字符dd的的ASCIIASCII碼為碼為0 x640 x64)。6.2 6.2 指針指針16在在程序中既可以修改指針變量所指向內(nèi)存中

24、的數(shù)據(jù),也程序中既可以修改指針變量所指向內(nèi)存中的數(shù)據(jù),也可以修改指針變量所指向的內(nèi)存地址??梢孕薷闹羔樧兞克赶虻膬?nèi)存地址。例如,已知例如,已知“intint a=5, b=10, a=5, b=10, * *p1=&a, p1=&a, * *p2=&b;”p2=&b;”,通過語句,通過語句* *p1=p1=* *p2;p2;可以將可以將p2p2所指向內(nèi)存空間中的數(shù)據(jù)賦到所指向內(nèi)存空間中的數(shù)據(jù)賦到p1p1所指向的內(nèi)存空間中(即所指向的內(nèi)存空間中(即將變量將變量b b的值賦給了變量的值賦給了變量a a),如圖),如圖6-36-3所示;通過語句所示;通過語句p1=p2;p1=p2;則可以將則可以將

25、p2p2中保存的內(nèi)存地址賦給中保存的內(nèi)存地址賦給p1p1(即賦值操作后(即賦值操作后p1p1與與p2p2均指向了變量均指向了變量b b所對應(yīng)的內(nèi)存),如圖所對應(yīng)的內(nèi)存),如圖6-46-4所示。所示。6.2 6.2 指針指針176.2 6.2 指針指針18【例例6-16-1】指針變量使用示例。指針變量使用示例。參考參考程序如下程序如下: : #include #include using using namespace namespace stdstd; ;intint mainmain()() intint a=5, b=10a=5, b=10; ;intint * *p1p1, , * *p

26、2;p2;/第第1 1次次賦值賦值p1p1=&a=&a; ;p2p2=&b=&b; ;coutcouta,ba,b,* *p1,p1,* *p2p2endlendl; ;6.2 6.2 指針指針19/第第2 2次次賦值賦值* *p1=3;p1=3;* *p2=6;p2=6;coutcouta,ba,b,* *p1,p1,* *p2p2endlendl; ;/第第3 3次次賦值賦值a=1;a=1;b=2;b=2;coutcouta,ba,b,* *p1,p1,* *p2p2endlendl; ;/第第4 4次次賦值賦值* *p1=p1=* *p2;p2;coutcouta,ba,b,* *p1,

27、p1,* *p2p2endlendl; ;6.2 6.2 指針指針20/第第5 5次次賦值賦值p1=p2;p1=p2;* *p1=8;p1=8;coutcouta,ba,b,* *p1,p1,* *p2p2endlendl; ;return return 0 0; ; 上面上面的程序中,在第的程序中,在第1 1次賦值后,指針變量次賦值后,指針變量p1p1指向變量指向變量a a所對應(yīng)的內(nèi)存空間,指針變量所對應(yīng)的內(nèi)存空間,指針變量p2p2指向變量指向變量b b所對應(yīng)的內(nèi)存空所對應(yīng)的內(nèi)存空間,如圖間,如圖6-56-5(a a)所示,因此輸出)所示,因此輸出“5,10,5,10”5,10,5,10”;

28、在第;在第2 2次次賦值后,指針變量賦值后,指針變量p1p1所指向內(nèi)存空間中的數(shù)據(jù)值為所指向內(nèi)存空間中的數(shù)據(jù)值為3 3,指針,指針變量變量p2p2所指向內(nèi)存空間中的數(shù)據(jù)值為所指向內(nèi)存空間中的數(shù)據(jù)值為6 6,如圖,如圖6-56-5(b b)所示,)所示,因此輸出因此輸出“3,6,3,6”3,6,3,6”;在第;在第3 3次賦值后,變量次賦值后,變量a a所對應(yīng)所對應(yīng)內(nèi)存內(nèi)存6.2 6.2 指針指針21空間中的數(shù)據(jù)值為空間中的數(shù)據(jù)值為1 1,變量,變量b b所對應(yīng)內(nèi)存空間中的數(shù)據(jù)值為所對應(yīng)內(nèi)存空間中的數(shù)據(jù)值為2 2,如圖如圖6-56-5(c c)所示,因此輸出)所示,因此輸出“1,2,1,2”1,

29、2,1,2”;在第;在第4 4次賦值后,次賦值后,p2p2所指向內(nèi)存空間中的數(shù)據(jù)被賦到所指向內(nèi)存空間中的數(shù)據(jù)被賦到p1p1所指向的內(nèi)存空間中,所指向的內(nèi)存空間中,如圖如圖6-56-5(d d)所示,因此輸出)所示,因此輸出“2,2,2,2”2,2,2,2”;在第;在第5 5次賦值后,次賦值后,p2p2中所保存的內(nèi)存地址被賦到中所保存的內(nèi)存地址被賦到p1p1中,并且中,并且p1p1所指向內(nèi)存空間所指向內(nèi)存空間中的數(shù)據(jù)被賦為中的數(shù)據(jù)被賦為8 8,如圖,如圖6-56-5(e e)所示,因此輸出)所示,因此輸出“2,8,8,8”2,8,8,8”。圖中粗體文字表示每次賦值被修改的數(shù)據(jù)。圖中粗體文字表示每

30、次賦值被修改的數(shù)據(jù)。6.2 6.2 指針指針226.2 6.2 指針指針236.2 6.2 指針指針246.2 6.2 指針指針25u 6.2.4 6.2.4 使用使用指針訪問數(shù)指針訪問數(shù)組中的元素組中的元素定義定義一個數(shù)組后,一個數(shù)組后,系統(tǒng)會為其分配內(nèi)存系統(tǒng)會為其分配內(nèi)存空間空間,例如,有如下,例如,有如下數(shù)組定義數(shù)組定義: : 則系統(tǒng)為則系統(tǒng)為一維數(shù)組一維數(shù)組a a和二維數(shù)組和二維數(shù)組b b所分配的內(nèi)存空間如所分配的內(nèi)存空間如圖圖6-66-6所示。可見,所示??梢?,二二維數(shù)組中的元素在內(nèi)維數(shù)組中的元素在內(nèi)存中按照先行后列的存中按照先行后列的方式進(jìn)行存儲方式進(jìn)行存儲。6.2 6.2 指針指

31、針26前面前面的章節(jié)中都是使用的章節(jié)中都是使用“ ”或或“ ”的方式來訪問一維數(shù)組或二維的方式來訪問一維數(shù)組或二維數(shù)組中的元素。實際上,也可以使用指針來訪問數(shù)組中的元數(shù)組中的元素。實際上,也可以使用指針來訪問數(shù)組中的元素。例如,可以定義兩個指針變量素。例如,可以定義兩個指針變量p1p1和和p2p2并令它們分別指向并令它們分別指向元素元素a0a0和元素和元素b00b00的首地址,即的首地址,即: :intint * *p1, p1, * *p2;p2;p1=&a0;p1=&a0;p2p2=&=&b00;b00;根據(jù)根據(jù)6.2.36.2.3節(jié)的內(nèi)容,使用節(jié)的內(nèi)容,使用* *p1p1和和* *p2p

32、2可分別訪問可分別訪問a0a0和和b00b00。那么,應(yīng)該如何訪問后面的元素呢?下面介紹指。那么,應(yīng)該如何訪問后面的元素呢?下面介紹指針加減整數(shù)的運算,通過指針加整數(shù)的運算即可以計算出后針加減整數(shù)的運算,通過指針加整數(shù)的運算即可以計算出后面元素的首地址并通過面元素的首地址并通過“* * ”的方式訪問該元素的方式訪問該元素。6.2 6.2 指針指針27假設(shè)假設(shè)p p為指針,為指針,n n為正整數(shù),則為正整數(shù),則: : p+np+n: : 從從p p指向的地址開始的后面第指向的地址開始的后面第n n項數(shù)據(jù)的地址。項數(shù)據(jù)的地址。 p-n: p-n: 從從p p指向的地址開始的前面第指向的地址開始的前

33、面第n n項數(shù)據(jù)的地址項數(shù)據(jù)的地址。【例例6-26-2】指針加整數(shù)運算示例。指針加整數(shù)運算示例。參考參考程序如下程序如下: : #include #include using using namespace namespace stdstd; ;intint mainmain()() intint a= a=1,2,3,4, 1,2,3,4, b2=b2=5,6, 7,85,6, 7,8;intint * *p1p1=&=&a0, a0, * *p2p2=&=&b00;b00;6.2 6.2 指針指針28intint i i, j, j; ;for for ( (i i=0; =0; i i4

34、; 4; i i+)+)coutcoutaai i的首地址為的首地址為p1+ip1+i,其中存儲的數(shù)據(jù)為其中存儲的數(shù)據(jù)為* *( (p1+i)p1+i)endlendl; ;for for ( (i i=0; =0; i i2; 2; i i+)+)for for (j=0; j2; j(j=0; j2; j+)+)coutcoutbbi ij j的首地址的首地址為為 p2+ip2+i* *2+j2+j,其中存儲的數(shù)據(jù)其中存儲的數(shù)據(jù)為為 * *(p2+i(p2+i* *2+j2+j)endlendl; ;return return 0 0; ; 6.2 6.2 指針指針29上面上面的程序中,指

35、針變量的程序中,指針變量p1p1和和p2p2分別指向了元素分別指向了元素a0a0和和元素元素b00b00的首地址,的首地址,p1+ip1+i和和p2+ip2+i* *2+j2+j則分別指向了元素則分別指向了元素aai i 和元素和元素bbi ijj的首地址,如圖的首地址,如圖6-76-7所示所示。6.2 6.2 指針指針30因此因此,通過輸出,通過輸出p1+ip1+i和和p2+ip2+i* *2+j2+j,可以在屏幕上分別看,可以在屏幕上分別看到數(shù)組到數(shù)組a a和和b b中每一個元素的首地址(即中每一個元素的首地址(即& &aai i 的值和的值和& &bbi ijj的值);通過輸出的值);通

36、過輸出* *(p1+i)(p1+i)和和* *(p2+i(p2+i* *2+j)2+j),可以在屏幕上分,可以在屏幕上分別看到數(shù)組別看到數(shù)組a a和和b b中每一個元素的值(即中每一個元素的值(即aai i 的值和的值和bbi ijj的值)。一維數(shù)組的數(shù)組名是一個與數(shù)組同類型的指針常量,的值)。一維數(shù)組的數(shù)組名是一個與數(shù)組同類型的指針常量,即數(shù)組名即數(shù)組名a a是一個是一個intint類型的指針常量,因此,也可以用數(shù)組類型的指針常量,因此,也可以用數(shù)組名名a a代替指針變量代替指針變量p1p1改寫例改寫例6-26-2中的主函數(shù)中的主函數(shù): :for (for (i i=0=0; ; i i44

37、; ; i i+)+)coutcoutaai i的首地址為的首地址為a+Ia+I,其中存儲的數(shù)據(jù)為其中存儲的數(shù)據(jù)為* *( (a+ia+i)endlendl; ;6.2 6.2 指針指針31上面上面程序段的運行結(jié)果與例程序段的運行結(jié)果與例6-26-2完全一樣。數(shù)組名完全一樣。數(shù)組名a a與指與指針變量針變量p1p1的唯一區(qū)別在于的唯一區(qū)別在于: : 指針變量指針變量p1p1中存儲的內(nèi)存地址可中存儲的內(nèi)存地址可以改變,如以改變,如p1=p1+1p1=p1+1或或p1=&p1=&aai i 等給指針變量等給指針變量p1p1的賦值運算的賦值運算都是正確的;而數(shù)組名都是正確的;而數(shù)組名a a是一個指針

38、常量,它的值就是該數(shù)是一個指針常量,它的值就是該數(shù)組的首地址組的首地址, ,不可以改變,例如不可以改變,例如a=a+1a=a+1或或a=&a=&aai i 等給指針常等給指針常量量a a的賦值運算都是錯誤的的賦值運算都是錯誤的。另外另外,在,在C+C+中,中,* *(p1+i)(p1+i)(或(或* *( (a+ia+i) ))可以寫作)可以寫作p1p1i i (或(或aai i ),因此,),因此,p1+ip1+i(或(或a+ia+i)也可以寫作)也可以寫作& &p1p1i i (或(或& &aai i )??梢詫⒗?梢詫⒗?-26-2中的主函數(shù)改寫為中的主函數(shù)改寫為: : 6.2 6.

39、2 指針指針32for(for(i i=0=0; ; i i44; ; i i+)+)coutcoutaai i的首地址為的首地址為&p1p1i i ,其中存儲的數(shù)據(jù)為其中存儲的數(shù)據(jù)為p1p1i iendlendl; ;上面上面程序段的運行結(jié)果與例程序段的運行結(jié)果與例6-26-2完全一樣,完全一樣,& &p1p1i i 與例與例6-6-2 2中中的的p1+ip1+i等價,等價,p1p1i i 與例與例6-26-2中的中的* *(p1+i)(p1+i)等價。等價。6.2 6.2 指針指針33提示提示: : (1 1)對于對于任何一個任何一個 ,有如下兩組等價關(guān)系成立,有如下兩組等價關(guān)系成立: :

40、 * *(+i i) ) i i +i i &i i 例如例如,在例,在例6-26-2中,中,& &a0a0也可以寫作也可以寫作a+0a+0(即(即a a),&,&b00b00也也可以寫作可以寫作b0+b0+0 0(即(即b0b0),p1+i,p1+i也可以寫作也可以寫作& &p1p1i i,* *( (p1+i)p1+i)也可也可以寫作以寫作p1p1i i,p2+ip2+i* *2+j2+j也可以寫作也可以寫作& &p2p2i i* *2+j,2+j,* *( (p2+ip2+i* *2+j)2+j)也可也可以寫作以寫作p2p2i i* *2+j2+j。(2 2)自自增運算符增運算符+和自減

41、運算符和自減運算符-也可以用于指針運算,其使用也可以用于指針運算,其使用方法與普通變量的自增、自減運算相同。例如方法與普通變量的自增、自減運算相同。例如: : p+;/p+;/相當(dāng)于相當(dāng)于p=p+1p=p+1p-p-;/-;/相當(dāng)于相當(dāng)于p=p-1p=p-16.2 6.2 指針指針34二二維數(shù)組的數(shù)組名也是一個指針常量維數(shù)組的數(shù)組名也是一個指針常量,對于例,對于例6-26-2中的二中的二維數(shù)組維數(shù)組b b,其數(shù)組名,其數(shù)組名b b就表示二維數(shù)組的首地址。根據(jù)前面的就表示二維數(shù)組的首地址。根據(jù)前面的等價關(guān)系,等價關(guān)系,b b與與& &b0b0等價,而等價,而b0b0可以看作是由可以看作是由2 2

42、個元素組個元素組成的一維數(shù)組,即成的一維數(shù)組,即b0b0是是intint 22類型。在類型。在C+C+中,中,二維數(shù)組二維數(shù)組的首地址需要用指向行的指針變量來保存,其定義形式為的首地址需要用指向行的指針變量來保存,其定義形式為: : ( (* * );其中其中, 是指該指針變量所指向的二維數(shù)組中每行元是指該指針變量所指向的二維數(shù)組中每行元素的數(shù)量(即列數(shù))。因此,對于例素的數(shù)量(即列數(shù))。因此,對于例6-26-2中的二維數(shù)組中的二維數(shù)組b b,可,可以定義如下的指向行的指針變量以定義如下的指向行的指針變量: : intint ( (* *p)2;p)2;p=b;p=b;將將二維數(shù)組二維數(shù)組b

43、b的首地址賦給指向行的指針變量的首地址賦給指向行的指針變量p p后,就可后,就可以用以用p p替代替代b b訪問二維數(shù)組中的元素。訪問二維數(shù)組中的元素。6.2 6.2 指針指針35【例例6-36-3】指向行的指針變量示例。指向行的指針變量示例。參考參考程序如下程序如下: : #include #include using using namespace namespace stdstd; ;intint mainmain()() intint b2= b2=5,6, 7,85,6, 7,8;intint ( (* *p)2;p)2;intint i i, j, j; ;p=b;p=b;6.2

44、6.2 指針指針36for for ( (i i=0; =0; i i2; 2; i i+)+)for for (j=0; j2; j(j=0; j2; j+)+)coutcoutbbi ij j中存儲的數(shù)據(jù)中存儲的數(shù)據(jù)為為 ppi ijjpsps;/;/輸入輸入 abcabc“coutcoutpp; ;coutcoutp+2p;p;或或cincinp+2;p+2;等修改等修改p p所所指向內(nèi)存空間中的數(shù)據(jù)。指向內(nèi)存空間中的數(shù)據(jù)?!纠?-46-4】編寫程序?qū)崿F(xiàn)取子串的操作編寫程序?qū)崿F(xiàn)取子串的操作: : 從字符串從字符串“my my book!”book!”中自第中自第4 4個字符開始取子串,

45、共取個字符開始取子串,共取4 4個字符生成一個個字符生成一個新的字符串。新的字符串。參考程序如下參考程序如下: : #include #include using namespace using namespace stdstd; ;6.2 6.2 指針指針42intint mainmain()() char s=char s=my bookmy book!;!;char t5;char t5;intint i i, start=3, , start=3, lenlen=4=4; ;for for ( (i i=0; =0; i i lenlen; ; i i+)+)tti i=s=si+st

46、arti+start;tti i=0 0;coutcout取出的子串為取出的子串為:t tendlendl; ;return return 0 0; ; 6.2 6.2 指針指針43上面上面的程序中,通過的程序中,通過forfor循環(huán)將字符逐個從循環(huán)將字符逐個從s s中中復(fù)制到數(shù)組復(fù)制到數(shù)組t t中,最后在中,最后在t t的最后加上字符串結(jié)束符的最后加上字符串結(jié)束符00 ,如圖,如圖6-106-10所示所示。6.2 6.2 指針指針44如果如果要同時操作多個字符串,也可以定義一個字符型指要同時操作多個字符串,也可以定義一個字符型指針數(shù)組。針數(shù)組?!纠?-56-5】使用指針數(shù)組操作多個字符串。

47、使用指針數(shù)組操作多個字符串。參考參考程序如下程序如下: : # #include include using using namespace namespace stdstd; ;intint mainmain()() char char * *p3=p3=Beijing, Tianjin, ShanghaiBeijing, Tianjin, Shanghai;intint i i; ;for for ( (i i=0; =0; i i 3; 3; i i+)+)coutcoutppi ippi i;這樣的語句是錯誤的。這樣的語句是錯誤的。6.2 6.2 指針指針466.2 6.2 指針指針4

48、7u 6.2.6 6.2.6 動態(tài)動態(tài)內(nèi)存分配和釋放內(nèi)存分配和釋放在在C+C+中,除了可以通過定義變量的方式來使用內(nèi)存空間中,除了可以通過定義變量的方式來使用內(nèi)存空間外,還外,還可以使用可以使用newnew和和deletedelete兩個關(guān)鍵字進(jìn)行內(nèi)存空間的動兩個關(guān)鍵字進(jìn)行內(nèi)存空間的動態(tài)分配和釋放態(tài)分配和釋放。使用動態(tài)方式分配內(nèi)存時會在堆區(qū)分配內(nèi)存。使用動態(tài)方式分配內(nèi)存時會在堆區(qū)分配內(nèi)存空間來存儲數(shù)據(jù),因此動態(tài)內(nèi)存分配也通常稱為堆內(nèi)存分配??臻g來存儲數(shù)據(jù),因此動態(tài)內(nèi)存分配也通常稱為堆內(nèi)存分配。相應(yīng)地,動態(tài)內(nèi)存釋放也通常稱為堆內(nèi)存釋放。相應(yīng)地,動態(tài)內(nèi)存釋放也通常稱為堆內(nèi)存釋放。堆堆內(nèi)存分配內(nèi)存分

49、配newnew的語法格式為的語法格式為: : new new ; 指定了分配的內(nèi)存空間中存儲的數(shù)據(jù)的類型,指定了分配的內(nèi)存空間中存儲的數(shù)據(jù)的類型,由于不同類型的數(shù)據(jù)需要不同尺寸的內(nèi)存空間來保存,因此,由于不同類型的數(shù)據(jù)需要不同尺寸的內(nèi)存空間來保存,因此, 不同,分配的內(nèi)存空間大小也會不同不同,分配的內(nèi)存空間大小也會不同。6.2 6.2 指針指針48堆堆內(nèi)存分配成功后,會返回動態(tài)分配的內(nèi)存空間的首地內(nèi)存分配成功后,會返回動態(tài)分配的內(nèi)存空間的首地址。址。通常將該首地址保存在一個指針變量中,以便后面可以通常將該首地址保存在一個指針變量中,以便后面可以使用該指針變量操作內(nèi)存空間中的數(shù)據(jù)。使用該指針變量

50、操作內(nèi)存空間中的數(shù)據(jù)。在分配內(nèi)存的同時,在分配內(nèi)存的同時,還可以進(jìn)行內(nèi)存初始化工作還可以進(jìn)行內(nèi)存初始化工作: : new new (););其中其中, 確定了分配的內(nèi)存空間中初始存儲的數(shù)據(jù)確定了分配的內(nèi)存空間中初始存儲的數(shù)據(jù)。例如例如: :intint * *p; p; p=new p=new intint(3(3););兩兩條語句執(zhí)行結(jié)束后,指針變量條語句執(zhí)行結(jié)束后,指針變量p p就指向了通過就指向了通過new new intint動態(tài)分配的內(nèi)存空間,如圖動態(tài)分配的內(nèi)存空間,如圖6-126-12所示。所示。6.2 6.2 指針指針496.2 6.2 指針指針50也也可以動態(tài)分配用于存儲多個數(shù)

51、可以動態(tài)分配用于存儲多個數(shù)據(jù)元素的內(nèi)存空間,語法格式為據(jù)元素的內(nèi)存空間,語法格式為: : ;其中其中, 既可以是常量也既可以是常量也可以是變量,但必須是整數(shù),用于可以是變量,但必須是整數(shù),用于指定元素數(shù)目。例如指定元素數(shù)目。例如: : intint * *pArraypArray; ;pArraypArray=new =new intint3;3;兩兩條語句執(zhí)行結(jié)束后,指針變量條語句執(zhí)行結(jié)束后,指針變量pArraypArray就指向了通過就指向了通過new new intint33動動態(tài)分配的內(nèi)存空間,如圖態(tài)分配的內(nèi)存空間,如圖6-136-13所示。所示。6.2 6.2 指針指針51實際上實際

52、上,可以將動態(tài)分配的內(nèi)存空間看作是一個動態(tài)數(shù)可以將動態(tài)分配的內(nèi)存空間看作是一個動態(tài)數(shù)組,使用指針訪問堆內(nèi)存的方式與使用指針訪問數(shù)組的方式組,使用指針訪問堆內(nèi)存的方式與使用指針訪問數(shù)組的方式完全相同。唯一區(qū)別在于完全相同。唯一區(qū)別在于: : 數(shù)組定義時,必須用常量表達(dá)式數(shù)組定義時,必須用常量表達(dá)式指定數(shù)組長度;而進(jìn)行堆內(nèi)存分配時,既可以使用常量表達(dá)指定數(shù)組長度;而進(jìn)行堆內(nèi)存分配時,既可以使用常量表達(dá)式,也可以用變量表達(dá)式來指定元素數(shù)目。式,也可以用變量表達(dá)式來指定元素數(shù)目。使用使用newnew分配的內(nèi)存必須使用分配的內(nèi)存必須使用deletedelete釋放釋放,否則會造成內(nèi),否則會造成內(nèi)存泄露(

53、即內(nèi)存空間一直處于被占用狀態(tài),導(dǎo)致其他程序無存泄露(即內(nèi)存空間一直處于被占用狀態(tài),導(dǎo)致其他程序無法使用)。當(dāng)系統(tǒng)出現(xiàn)大量內(nèi)存泄露時,系統(tǒng)可用資源也會法使用)。當(dāng)系統(tǒng)出現(xiàn)大量內(nèi)存泄露時,系統(tǒng)可用資源也會相應(yīng)減少,從而導(dǎo)致計算機處理速度變慢,當(dāng)系統(tǒng)資源枯竭相應(yīng)減少,從而導(dǎo)致計算機處理速度變慢,當(dāng)系統(tǒng)資源枯竭時甚至?xí)斐上到y(tǒng)崩潰。時甚至?xí)斐上到y(tǒng)崩潰。堆內(nèi)存釋放堆內(nèi)存釋放deletedelete的語法格式為的語法格式為: : delete delete ;其中其中, 指向待釋放的堆內(nèi)存空間的首地址指向待釋放的堆內(nèi)存空間的首地址。6.2 6.2 指針指針52例如例如: :delete p;delete

54、 p;delete delete pArraypArray; ; 兩兩條語句可以將前面使用條語句可以將前面使用new new intint(3)(3)和和new new intint33動態(tài)動態(tài)分配的內(nèi)存空間釋放。分配的內(nèi)存空間釋放。如果如果 所指向的堆內(nèi)存空間只包含一個元素,所指向的堆內(nèi)存空間只包含一個元素,那么還可以那么還可以將將省掉,即省掉,即: : delete delete ;例如例如: : delete p;delete p;6.2 6.2 指針指針53上面上面的語句可以將前面使用的語句可以將前面使用new new intint(3)(3)動態(tài)分配的內(nèi)存動態(tài)分配的內(nèi)存空間釋放。由于

55、空間釋放。由于pArraypArray所指向的內(nèi)存空間中包含所指向的內(nèi)存空間中包含3 3個元素,個元素,因此不能使用因此不能使用delete delete pArraypArray來釋放這些內(nèi)存空間,而必須來釋放這些內(nèi)存空間,而必須使用使用delete delete pArraypArray。提示提示: : 在使用在使用newnew分配堆內(nèi)存時要區(qū)分分配堆內(nèi)存時要區(qū)分()()和和。()()中的中的表達(dá)式指定了內(nèi)存的初值,表達(dá)式指定了內(nèi)存的初值,而而中的表達(dá)式指定了元素數(shù)目。中的表達(dá)式指定了元素數(shù)目。例如例如: : p=new p=new intint(3(3););/分配了分配了1 1個個in

56、tint型元素大小的型元素大小的內(nèi)存內(nèi)存/空間空間, ,且其初值為且其初值為3 3pArraypArray=new =new intint3;/3;/分配了分配了3 3個個intint型元素大小的型元素大小的內(nèi)存內(nèi)存/空間空間6.2 6.2 指針指針54【例例6-66-6】使用堆內(nèi)存分配方式實現(xiàn)學(xué)生成績錄入功能,要使用堆內(nèi)存分配方式實現(xiàn)學(xué)生成績錄入功能,要求程序運行時由用戶輸入學(xué)生人數(shù)。求程序運行時由用戶輸入學(xué)生人數(shù)。參考參考程序如下程序如下: : #include #include using using namespace namespace stdstd; ;intint mainmai

57、n()() intint * *pScorepScore; ;intint n, n, i i; ;coutcoutnn; ;6.2 6.2 指針指針55pScorepScore=new =new intintn;/n;/根據(jù)學(xué)生人數(shù)動態(tài)分配根據(jù)學(xué)生人數(shù)動態(tài)分配內(nèi)存內(nèi)存if if ( (pScorepScore=NULL)/=NULL)/判斷堆內(nèi)存分配是否判斷堆內(nèi)存分配是否成功成功 coutcout堆內(nèi)存分配失敗堆內(nèi)存分配失敗!endlendl; ;return return 0 0; ; for for ( (i i=0; =0; i i n; n; i i+)/+)/通過通過forfor循

58、環(huán)輸入學(xué)生循環(huán)輸入學(xué)生成績成績 coutcout請輸入第請輸入第(i+1)(i+1)pScorepScore i i; for (for (i i=0; =0; i i n; n; i i+)/+)/通過通過forfor循環(huán)輸出學(xué)生成績循環(huán)輸出學(xué)生成績coutcout第第(i+1)(i+1)名學(xué)生的成績?yōu)槊麑W(xué)生的成績?yōu)?* *( (pScore+ipScore+i)endlendl; ;6.2 6.2 指針指針56delete delete pScorepScore;/;/不再使用時將堆內(nèi)存及時不再使用時將堆內(nèi)存及時釋放釋放return return 0 0; ; 上面上面的程序中,首先,根據(jù)

59、用戶輸入的學(xué)生人數(shù)動態(tài)分的程序中,首先,根據(jù)用戶輸入的學(xué)生人數(shù)動態(tài)分配內(nèi)存,并將分配到的堆內(nèi)存空間首地址賦給指針變量配內(nèi)存,并將分配到的堆內(nèi)存空間首地址賦給指針變量pScorepScore;其次,利用;其次,利用pScorepScore對堆內(nèi)存空間中的數(shù)據(jù)進(jìn)行訪問;對堆內(nèi)存空間中的數(shù)據(jù)進(jìn)行訪問;最后,堆內(nèi)存空間不再使用時,將其釋放。根據(jù)前面的等價最后,堆內(nèi)存空間不再使用時,將其釋放。根據(jù)前面的等價關(guān)系,關(guān)系,pScorepScore i i 與與* *( (pScore+ipScore+i) )的作用完全相同。的作用完全相同。提示提示: : 當(dāng)申請分配的內(nèi)存太大、系統(tǒng)資源不夠時,堆內(nèi)當(dāng)申請分配

60、的內(nèi)存太大、系統(tǒng)資源不夠時,堆內(nèi)存分配會失敗,此時會返回存分配會失敗,此時會返回NULLNULL,表示堆內(nèi)存分配失敗。因,表示堆內(nèi)存分配失敗。因此,分配內(nèi)存后,應(yīng)判斷返回值是否為此,分配內(nèi)存后,應(yīng)判斷返回值是否為NULLNULL,如果是,如果是NULLNULL則則報錯并退出程序。報錯并退出程序。6.2 6.2 指針指針57【例例6-76-7】使用堆內(nèi)存分配方式實現(xiàn)學(xué)生信息錄入功能,要使用堆內(nèi)存分配方式實現(xiàn)學(xué)生信息錄入功能,要求程序運行時由用戶輸入學(xué)生人數(shù)。求程序運行時由用戶輸入學(xué)生人數(shù)。參考參考程序如下程序如下: : # #include include using using namespa

溫馨提示

  • 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

提交評論