版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領
文檔簡介
7.1指針的概念7.2指針變量7.3指針與一維數(shù)組7.4指針與多維數(shù)組7.5指針與字符串7.1指針的概念程序中的每條指令或數(shù)據(jù)都需要存放在計算機的存儲器中,在編譯或運行程序的過程中為它們分配內(nèi)存單元。內(nèi)存單元以字節(jié)為單位,每一個字節(jié)對應一個地址。對象(如變量、數(shù)組、函數(shù)等)的地址是指該對象所占存儲單元的首個字節(jié)的編號,而對象名作為一個標識符,是用來標注該對象的。標識符的使用是為了方便程序的編寫。系統(tǒng)在引用對象時,是通過地址找到該對象,再根據(jù)對象的類型在相應長度的存儲單元中存取數(shù)據(jù)。由于通過地址可以找到相應的對象,即地址指向該對象,因此地址也被稱為“指針”。換句話說,指針就是地址。對象的指針就是該對象所在存儲單元的首字節(jié)地址。7.2指針變量指針變量是專門用來存放地址的變量。通過指針變量來存放某一特定變量的地址,可以建立指針變量與其指向變量之間的關聯(lián)。為了表示指針變量和它所指向的變量之間的聯(lián)系,在程序中使用指針運算符“*”表示“指向”。變量名與變量的地址之間存在映射關系。在程序設計過程中,為了方便對變量的引用而使用變量名;在程序運行過程中,系統(tǒng)對變量的訪問使用的是地址;程序經(jīng)過編譯后,變量名會轉(zhuǎn)換為變量的地址。通過變量名訪問變量的方式稱為“直接訪問”。之前我們一直都是使用“直接訪問”的方式引用變量的。指針變量可以用來存放某一特定變量的地址。通過指針變量獲取地址從而訪問該地址所對應的變量,稱為“間接訪問”,如圖7-1所示。圖中的箭頭表示“指向”關系。int型變量a的值為5,a的地址為2000;現(xiàn)定義指向int型變量的指針變量p,用于存放int型變量a的地址,即p=&a,值為2000;而*p就表示指針變量p所指向的int型變量a,即*p=a。在通過指針實現(xiàn)對變量的間接訪問時,系統(tǒng)首先根據(jù)存放于變量p中的地址2000,找到變量a所在存儲單元的起始位置,并根據(jù)int型數(shù)據(jù)所占空間大小,將從地址2000開始到2003結(jié)束的4個字節(jié)存儲單元中的數(shù)據(jù)取出,即整數(shù)5。通過“間接訪問”的方式引用變量,可以大大提高程序的執(zhí)行效率并使程序更加簡潔。在深入介紹指針之前,我們先理順以下幾個概念:(1)地址:內(nèi)存中存儲單元的編號。
(2)變量:內(nèi)存中某個特定的存儲單元。(3)變量的地址:某一變量所在的存儲單元的地址編號。
(4)變量的名稱:為該存儲單元所定義的名稱,便于程序設計。(5)變量的值:存放在特定存儲單元中的數(shù)據(jù)。(6)指針:地址。(7)變量的指針:變量的地址。(8)指針變量:存放地址的變量。(9)指向變量的指針變量:存放某個特定變量地址的指針變量,通過該指針變量可以指向特定的變量。7.2.1指針變量的定義指針變量是專門用來存放地址的變量,變量的類型為“指針”類型。定義指針變量的基本格式為“指針變量名”是定義的指針變量的標識符。“*”是類型符,與“char”、“int”、“float”的作用相同,表示定義的變量為指針類型。“類型”用于聲明定義的指針變量所指向的變量的類型。7.2.2指針變量的賦值定義指針變量后,如果沒有對其賦值,那么該指針變量的值是不確定的,即不能確定指針變量中當前存放的是哪個內(nèi)存單元的地址。此時如果盲目訪問,可能會破壞內(nèi)存中原有的重要數(shù)據(jù)或程序代碼。因此,對于指針變量,應該先賦值、再引用。使用指針變量存放內(nèi)存中任意一個地址是沒有意義并且危險的。雖然地址是以整數(shù)形式表示的,但不要將一個整數(shù)賦值給指針變量,因為并不清楚該整數(shù)表示的地址中存放的是什么數(shù)據(jù)。正確的方法是用一個已知存在的變量地址為指針變量賦值。7.2.3指針變量的引用C語言標準提供了兩種運算符來引用指針:(1)“&”,取地址運算符,如“&a”為變量a的地址。(2)“*”,指針運算符,如“*p”為指針變量p所指向的變量。7.2.4指針變量的運算指針變量的算術(shù)運算其實就是地址的算術(shù)運算。C語言允許指針與一個整數(shù)進行加減運算,以實現(xiàn)移動指針的目的。以“inta=1,*p=&a;(設a的地址為2004)”為例,通過之前的學習,我們已經(jīng)知道:指針變量p存儲的是變量a的地址,即p=&a,值為2004。*p表示指針變量p所指向的變量a,即?*p=a,值為1。(1)“&”和“*”同為單目運算符,優(yōu)先級相同,結(jié)合性自右向左,所以,&*p表示指針p所指向的變量的地址,即&*p=&(*p)=&a,值為2004。而?*&a表示變量a的地址所指向的變量,即?*&a=*(&a)=*p,值為1。(2)指針變量可以作自增自減運算,++p或p++,表示p的值加1。由于p存放的是地址,所以此處的加“1”表示移動一個基類型的數(shù)據(jù)長度單位;由于變量p的基類型是int類型,數(shù)據(jù)長度單位為4個字節(jié),所以當?++p或p++?作為一個獨立、完整的表達式時,其存儲的地址均更新為2004?+?4?=?2008。(3)指針所指向的變量作自增自減運算,--(*p)?或?(*p)--,表示指針p所指向的變量的值減1,由于變量a的值為1,所以,當?--(*p)或(*p)--?作為一個獨立、完整的表達式時,其指向的變量a的值均為1-1?=?0。(4)自增自減運算符“++”、“--”和“*”同為單目運算符,優(yōu)先級相同,結(jié)合性都是自右向左,所以在兩種運算符同時使用的場合,為避免混淆,應使用括號進行區(qū)分。(5)針對指針變量的加減運算,應確認在運算后該指針變量的指向關系,避免運算后指向未知的內(nèi)存空間。7.2.5使用指針變量作函數(shù)參數(shù)使用基本類型變量作函數(shù)參數(shù)是“單向的值傳遞”,形參的值在被調(diào)函數(shù)中發(fā)生改變,不會影響到主調(diào)函數(shù)中的實參。并且,當主調(diào)函數(shù)需要獲取被調(diào)函數(shù)的運行結(jié)果時,必須使用return語句,而每調(diào)用一次被調(diào)函數(shù),只能執(zhí)行一條return語句,并且每條return語句只能返回一個值。使用指向變量的指針作函數(shù)實參,將主調(diào)函數(shù)中實參的地址傳遞給形參,則形參與實參共用該實參變量所指向的內(nèi)存空間。在被調(diào)函數(shù)中改變形參所指向的變量的值,實際上就是改變主調(diào)函數(shù)中實參變量所指向的變量的值。所以,從這個角度來看,“指針傳遞”帶來的影響是“雙向的”。同時,可以看出,主調(diào)函數(shù)中變量值的改變,并不需要通過執(zhí)行return語句來實現(xiàn)。這種方式,又叫做地址傳遞(傳地址)或者引用傳遞(傳引用)。主函數(shù)在調(diào)用square函數(shù)時,將實參的地址傳遞給square函數(shù)的形參,建立了形參到實參的指向關系,可以認為該指向關系的建立是通過“int*n=&inumber;”形式實現(xiàn)的。square函數(shù)中對指針變量n所做的處理由于指向關系的存在,實際修改的是主函數(shù)中變量inumber的值。square函數(shù)調(diào)用結(jié)束后,形參到實參的指向關系結(jié)束。7.3指針與一維數(shù)組指針既然可以指向變量,當然也可以指向數(shù)組元素。數(shù)組是同類型數(shù)據(jù)的有序集合,數(shù)組名就是數(shù)組的首元素的地址。通過對指向數(shù)組元素的指針做加減運算,可以很方便地獲取數(shù)組中任意一個元素的地址。指針做加減運算的特點,使得指針特別適合處理像數(shù)組這樣存儲在連續(xù)內(nèi)存空間中的數(shù)據(jù)。對數(shù)組元素的引用,可以使用下標來實現(xiàn),也可以借助指針來實現(xiàn),即通過指向數(shù)組元素的指針找到需要引用的元素。使用指針訪問數(shù)組元素,能使目標程序所占內(nèi)存更少,運行速度更快。7.3.1指向數(shù)組元素的指針為了實現(xiàn)借助指針引用數(shù)組元素,通常將數(shù)組的首元素的地址賦值給與數(shù)組類型相同的指針變量,建立指針變量到該數(shù)組首元素的指向關系,并通過執(zhí)行指針的加減運算,將指針指向數(shù)組中的各個元素,其關系如圖7-2所示。 將數(shù)組名賦值給指針變量:將數(shù)組首個元素的地址賦值給指針變量:以圖7-2為例,當指針p指向數(shù)組a的首字節(jié)地址時,則建立如下的等價關系:同樣以圖7-2為例,若指針p指向數(shù)組a的第i個元素,則得到如下的等價關系:其中,指針變量結(jié)合自增或自減運算符,可以使指針自動向后或向前移動,直接指向下一個或上一個數(shù)組元素,而不必每次都重新計算地址。這種有規(guī)律地改變地址值的做法可以大大提高程序的執(zhí)行效率。但是需要注意對數(shù)組元素的引用不能越界。在引用數(shù)組元素時,可以使用兩種方法:下標法和指針法。7.3.2指向數(shù)組元素的指針作函數(shù)參數(shù)將指向數(shù)組元素的指針作為實參傳遞給被調(diào)函數(shù)的形參,可以在被調(diào)函數(shù)中通過形參指針直接改變主調(diào)函數(shù)中的數(shù)組元素。實參可以是數(shù)組名,也可以是指向數(shù)組元素的指針變量;形參需要接收數(shù)組元素的地址,所以必須是指針變量且其類型與數(shù)組的類型一致?!纠?.8】通過指針傳遞,在被調(diào)函數(shù)中將數(shù)組元素的值翻倍。運行結(jié)果:在main函數(shù)中定義指針變量pm,并使用數(shù)組a的地址對指針變量pm進行了初始化,建立指針pm到數(shù)組a的首元素的指向關系。對數(shù)組元素的存取采用了指針方式,即“*(pm++)”,當然也可以采用下標法“a[i]”,或者“*(a+i)”和“*(pm+i)”的指針形式,但不能寫成“*(a++)”的形式,因為a是指針常量。在調(diào)用change函數(shù)前,以“*(pm++)”方式通過循環(huán)結(jié)構(gòu)逐一輸出數(shù)組元素,在結(jié)束循環(huán)之后,指針pm已經(jīng)越過了數(shù)組的界限而指向其后的4字節(jié)存儲單元;此時應將pm重新賦值為數(shù)組a的首元素地址,讓指針pm再次指向數(shù)組a,以保證在此之后,使用指針傳遞正確的地址。在調(diào)用change函數(shù)時,將元素個數(shù)和數(shù)組地址分別傳遞給了change函數(shù)的形參變量n和形參指針pc,表達式“change(4,pm)”可以改寫為“change(4,a)”、“change(4,&a[0])”。在change函數(shù)中執(zhí)行循環(huán)語句,先將指針pc所指向的變量的值更新為原值的2倍,再通過pc的自增,將指針指向下一個元素。表達式“*pc++”表示先引用指針pc所指向的變量,再對pc(地址)的值自增,而不是直接對?*pc(指向的變量)的值自增。在change函數(shù)中并沒有通過return語句向main函數(shù)返回數(shù)據(jù),但由于在函數(shù)調(diào)用時,傳遞的是數(shù)組地址,因此在change函數(shù)中通過改變形參指針直接影響了main函數(shù)中的數(shù)組元素。7.4指針與多維數(shù)組多維數(shù)組也是同一類型數(shù)據(jù)的有序集合,其存儲形式與一維數(shù)組的存儲形式相同,即所有元素按順序占用一段連續(xù)的內(nèi)存空間。通過前面的介紹,我們已掌握通過指針引用一維數(shù)組元素的方法。本節(jié)以二維數(shù)組為例,介紹通過指針引用多維數(shù)組元素的方法。7.4.1通過指針引用二維數(shù)組元素通過對指向數(shù)組元素的指針做加減運算,可以很方便地存取一維數(shù)組中任意一個元素。二維數(shù)組的存儲形式與一維數(shù)組的存儲形式相同,也是將所有的元素按順序存放在一段連續(xù)的內(nèi)存空間中,所以也可以建立指針與二維數(shù)組的關系,以便引用二維數(shù)組元素?!纠?.11】使用指針引用二維數(shù)組元素。運行結(jié)果:程序中定義了一個類型為int型的指針變量p,并使用數(shù)組名a初始化,建立指針p到二維數(shù)組的指向關系。由于二維數(shù)組在內(nèi)存中的存儲是行優(yōu)先,即按行的順序連續(xù)存儲,“inta[3][4]”表示二維數(shù)組a有3行,每行有4個元素,共有12(3行?×?4列)個元素。程序中以變量i表示元素的行下標、變量j表示元素的列下標,則有表達式“(p+i*4+j)”表示在二維數(shù)組第i行上的第j個元素的地址,輸出參數(shù)“*(p+i*4+j)”即表示該地址所指向的元素。在循環(huán)語句的控制下,指針p從指向二維數(shù)組a的首個元素開始,按照存儲順序,逐一指向數(shù)組中的各個元素。當然如果把二維數(shù)組當作一維數(shù)組來處理,程序中的循環(huán)語句也可以改為7.4.2指向數(shù)組的指針嚴格來說,C語言并沒有“多維數(shù)組”這一概念,程序設計人員所說的“多維數(shù)組”,C語言將其描述為“數(shù)組的數(shù)組”。因此,對于多維數(shù)組,C語言并不像處理一維數(shù)組那樣,簡單地將其轉(zhuǎn)換為指向同類型變量的指針,而是將其轉(zhuǎn)換為指向同類型數(shù)組的指針。數(shù)組是一個可以遞歸的概念:任何維數(shù)的數(shù)組都可以看作由比它少一維的數(shù)組作為元素組成的“一維”數(shù)組。C語言總是將多維數(shù)組轉(zhuǎn)換成一維數(shù)組來處理的,如果該一維數(shù)組的元素又是一個一維數(shù)組或多維數(shù)組,則根據(jù)遞歸定義,再次轉(zhuǎn)換,直到轉(zhuǎn)換后的一維數(shù)組元素為基本類型變量為止。這就是C語言描述的“數(shù)組的數(shù)組”的含義。C語言在處理一維數(shù)組時,將其轉(zhuǎn)換為指向同類型變量的指針。在處理多維數(shù)組時,將其轉(zhuǎn)換為指向同類型數(shù)組的指針。7.4.3指向數(shù)組的指針作函數(shù)參數(shù)只要能保證引用表達式的正確,無論是通過指向數(shù)組元素的指針還是通過指向數(shù)組的指針,都可以引用二維數(shù)組元素。然而,使用指向數(shù)組的指針引用二維數(shù)組元素,能夠更加便捷地訪問二維數(shù)組中特定一行的數(shù)據(jù),并且在語義上更能體現(xiàn)程序設計的思想。7.5指針與字符串類型為char型的指針變量,也稱為字符指針。字符指針可以指向一個字符變量,也可以指向一個字符數(shù)組。C語言沒有字符串數(shù)據(jù)類型,而是將字符串作為字符數(shù)組來處理,以“\0”作為字符串的結(jié)束標記。對于通過指針引用字符和字符數(shù)組,與前面的內(nèi)容并無區(qū)別。7.5.1字符串的引用形式在引用一個字符串時,可以采用以下兩種方式:(1)定義一個字符數(shù)組,將字符串存入該數(shù)組。使用字符串常量初始化字符數(shù)組,從數(shù)組的首地址開始,依次將字符串中的字符逐一寫入存儲單元,并自動存入一個“\0”作為結(jié)束符。對于該字符串的引用,可以采用數(shù)組的下標,也可以使用%s控制符讀取。(2)定義一個字符指針,建立對字符串常量的指向關系。通過定義一個字符指針并以字符串常量對該指針進行初始化,建立了指向關系。這個指向關系的建立,是通過把字符串的首元素賦值給了類型為char型的指針變量string來實現(xiàn)的,因此可以通過該指針變量逐一存取字符串,當然也可以通過%s控制符讀取。7.5.2指向字符串的指針在使用字符指針引用字符串時,需注意以下幾個問題:(1)字符指針對字符串的引用。定義字符指針時可以使用字符串進行初始化;定義字符指針后,使用字符串首字符的地址為字符指針賦值,從而建立指向關系。在指向關系的建立過程中,系統(tǒng)并不是用字符串“hello
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025-2030年中國光學儀器行業(yè)商業(yè)模式創(chuàng)新戰(zhàn)略制定與實施研究報告
- 2025-2030年中國幼小銜接教育行業(yè)商業(yè)模式創(chuàng)新戰(zhàn)略制定與實施研究報告
- 2025-2030年中國旅游行業(yè)并購重組擴張戰(zhàn)略制定與實施研究報告
- 2025-2030年中國休閑餐飲行業(yè)全國市場開拓戰(zhàn)略制定與實施研究報告
- 2025-2030年中國知識密集型服務行業(yè)營銷創(chuàng)新戰(zhàn)略制定與實施研究報告
- 2025-2030年中國鉭電容器行業(yè)全國市場開拓戰(zhàn)略制定與實施研究報告
- 新形勢下智能門鎖行業(yè)轉(zhuǎn)型升級戰(zhàn)略制定與實施研究報告
- 德州黑陶品牌推廣調(diào)研
- 單位辦公室2025年工作要點
- 護肝藥品知識培訓課件
- 梁平法制圖規(guī)則及鋼筋翻樣講解
- 乙肝 丙肝培訓課件
- 2024屆湖北省武漢實驗外國語學校數(shù)學七上期末統(tǒng)考模擬試題含解析
- 基于深度學習的網(wǎng)絡釣魚郵件識別技術(shù)研究
- 融資成本視角下的船舶融資租賃模式研究
- 感冒中醫(yī)理論知識課件
- 2023年希望杯數(shù)學培訓100題-六年級(含答案)
- 一年級科學人教版總結(jié)回顧2
- 個人住房貸款提前還款月供及節(jié)省利息EXCEL計算
- 第五單元《圓》教材解析-人教版數(shù)學六年級上冊
- 患者突發(fā)昏迷應急預案演練腳本-
評論
0/150
提交評論