




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
指針解析
教學目的內容1
教學要求2
重點難點3
教學內容4教學目的通過本章的學習,使讀者對指針有一定的了解,并能夠使用指針進行編程。教學要求掌握指針的相關概念;掌握指針與數組之間的關系;掌握指向指針的指針;掌握如何使用指針變量做函數參數;了解main函數的參數。重點難點重點:地址與指針的關系;指針自加自減運算
;數組與指針的關系;函數參數的指針變量;難點:指向指針的指針;指針數組作main函數的參數。教學內容函數參數的指針變量;概述指針;數組與指針;指向指針的指針;返回指針值的函數;指針函數作main函數的參數。概述指針指針是C語言顯著的優點之一,指針使用起來十分靈活而且能提高某些程序的效率,但是指針使用不當,很容易就造成系統錯誤,往往許多程序“掛死”的大部分原因都是由于錯誤地使用指針所造成的。1.地址與指針系統的內存就像是帶有編號的小房間,如果想使用內存就需要得到房間編號。如圖所示,定義一個整型變量i,整型變量需要4個字節,所以編譯器為變量i分配編號從1000到1003,如圖所示。地址就是內存區中對每個字節的編號那么指針又是什么呢?這里僅將指針看作是內存中的一個地址,多數情況下,這個地址是內存中另一個變量的位置。如圖所示。概述指針
2解讀變量與指針變量的地址是變量和指針這兩者之間連接的紐帶,如果一個變量包含了另一個變量的地址,那么,第1個變量可以說成是指向第2個變量。所謂“指向”就是通過地址來體現的,在程序中用“*”符號表示“指向”。因為指針變量是指向一個變量的地址,所以將一個變量的地址值賦給這個指針變量后,這個指針變量就“指向”了該變量。例如,將變量i的地址存放到指針變量p中,p就指向i。其關系如圖所示。在程序代碼中是通過變量名來對內存單元進行存取操作,但是代碼經過編輯后已經將變量名轉換為該變量在內存的存放地址,對變量值的存取都是通過地址進行的。例如對上圖中所示的變量i和變量j進行如下操作。i+j;其含義根據變量名與地址的對應關系,找到變量i的地址1000,然后從1000開始讀取四個字節數據放到CPU寄存器中,再找到變量j的地址1004,從1004開始讀取四個字節的數據放到CPU另一個寄存器中,通過CPU計算出結果。在低級語言的匯編語言中都是直接通過地址來訪問內存單元,而在高級語言中才使用變量名訪問內存單元,但C語言作為高級語言卻提供了通過地址來訪問內存單元的方法。概述指針
3使用指針變量1.指針變量的一般形式如果有一個變量專門用來存放另一變量的地址,則它稱為“指針變量”。如果一個變量包含有指針(指針等同于一個變量的地址),則必須對它作說明。定義指針變量的一般形式如下。類型說明*變量名其中,*表示這是一個指針變量,變量名即為定義的指針變量名,類型說明表示本指針變量所指向的變量的數據類型。2.指針變量的賦值指針變量同普通變量一樣,使用之前不僅要定義,而且必須賦予具體的值。未經賦值的指針變量不能使用。給指針變量所賦的值與給其它變量所賦的值不同,給指針變量的賦值只能賦予地址,而不能賦予任何其它數據,否則將引起錯誤。C語言中提供了地址運算符“&”來表示變量的地址。其一般形式為。&變量名;如&a表示變量a的地址,&b表示變量b的地址。給一個指針變量賦值可以有以下兩種方法。定義指針變量的同時就進行賦值。inta;int*p=&a;先定義指針變量之后再賦值。inta;int*p;p=&a;實例
從鍵盤中輸入兩個數分別代表蘋果和香蕉的價格,利用指針的方法將這兩個數輸出。概述指針
3.指針變量的引用引用指針變量是對變量進行間接訪問的一種形式。對指針變量的引用形式如下。*指針變量其含義是引用指針變量所指向的值。實例
利用指針變量實現數據輸入、輸出。4.“&”和“*”運算符在前面介紹指針變量的過程中用到了兩個運算符分別是“&”和“*”,運算符“&”是一個返回操作數地址的單目運算符,叫做取地址運算符,例如p=&i;就是將變量i的內存地址賦給p,這個地址是該變量在計算機內部的存儲位置。運算符“*”是單目運算符,叫做指針運算符,作用是返回指定的地址內的變量的值,例如前面提到過p中裝有變量i的內存地址,則q=*p;就是將變量i的值賦給q,假如變量i的值是5,則q的值也是5。5.“&*”和“*&”區別如果有如下語句。inta;p=&a;那么通過以上兩條語句來分析下“&*”和“*&”之間的區別,&和*的運算符優先級別相同,按自右而左的方向結合。因此&*p先進行*運算,*p相當于變量a;再進行&運算,&*p就相當于取變量a的地址。*&a先計算&預算符,&a就是取變量a的地址,然后計算*運算,*&a就相當于取變量a所在地址的值,實際就是變量a。下面通過兩個例子具體看下。實例“&*”應用。
實例“*&”應用
概述指針
4指針自加自減運算指針的自加自減運算不同于普通變量的自加自減運算,也就是說它并不是簡單的加1減1,這里就通過兩個例題具體分析。實例
整型變量地址輸出。
實例
整型變量地址輸出。
數組與指針系統需要提供一定量連續的內存來存儲數組中的各元素,內存都有地址,指針變量就是存放地址的變量,如果把數組的地址賦給指針變量,就可以通過指針變量來引用數組。下面就將介紹下如何用指針來引用一維數組及二維數組元素。1一維數組與指針當定義一個一維數組,系統會在內存中為該數組分配一個存儲空間,其數組的名字就是數組在內存的首地址。若再定義一個指針變量,并將數組的首地址傳給指針變量,則該指針就指向了這個一維數組。例如:int*p,a[10];p=a;這里a是數組名,也就是數組的首地址,將它賦給指針變量p,也就是將數組a的首地址賦給p,也可以寫成如下形式。int*p,a[10];p=&a[0];上面這個語句是將數組a中的首個元素的地址賦給指針變量p。由于a[0]的地址就是數組的首地址,所以,兩條賦值操作效果完全相同,如實例。實例
輸出數組中的元素。根據上面語句將通過以下幾方面進行介紹。
p+n與a+n表示數組元素a[n]的地址,即&a[n]。對整個a數組來說,共有5個元素,n的取值為0~4,則數組元素的地址就可以表示為p+0~p+4或a+0~a+4。如何來表示數組中的元素用到了前面介紹的數組元素的地址表示,用*(p+n)和*(a+n)來表示數組中的各元素。表示指針的移動可以使用“++”和“--”這兩個運算符。數組與指針
2二維數組與指針定義一個3行5列的二維數組,其在內存中的存儲形式如圖所示。從上圖中可以看到幾種表示二維數組中元素地址的方法,下面逐一進行介紹。(1)&a[0][0]既可以看作數組0行0列的首地址,同樣還可以看作是二維數組的首地址。&a[m][n]就是第m行n列元素的地址。(2)a[0]+n,表示第0行第n個元素地址。實例
利用指針對二維數組進行輸入輸出。(3)&a[0]是第0行的首地址,當然&a[n]就是第n行的首地址。實例
將一個3行5列的二維組的第3行元素輸出。(4)a+n表示第n行的首地址。前面講過了如何利用指針來引用一維數組,這里在一維數組的基礎上來介紹一下如何通過指針來引用一個二維數組中的元素。*(*(a+n)+m)表示第n行第m列元素。*(a[n]+m)表示第n行第m列元素。數組與指針
3字符串與指針訪問一個字符串可以通過兩種方式,第一種方式就是前面講過的使用字符數組來存放一個字符串,從而實現對字符串的操作,另一種方法就是下面將要介紹到的使用字符指針指向一個字符串,此時可不定義數組。實例
字符型指針應用。
實例
聲明兩個字符數組,將str1中的字符串復制到str2中。
數組與指針
4字符串數組字符串數組是以字符串作為數組元素的數組,可以將其看成一個二維字符數組,下面定義一個簡單的字符串數組。charcountry[5][20]={"China","Japan","Russia","Germany","Switzerland"}字符型數組變量country被定義為含有5個字符串的數組,每個字符串的長度要小于20(這里要考慮字符串最后的‘\0’)。通過觀察上面定義的字符串數組會發現像“China”和“Japan”這樣的字符串其長度僅為5,加上字符串結束符也僅為6,而內存中卻要給它們分別分配一個20字節的空間,這樣就會造成資源浪費。為了解決這個問題,可以使用指針數組,每個指針指向所需要的字符常量,這種方法雖然需要在數組中保存字符指針,同樣也占用空間,但要遠少于字符串數組需要的空間。那么什么是指針數組?一個數組,其元素均為指針類型數據,稱為指針數組,也就是說,指針數組中的每一個元素都相當于一個指針變量。一維指針數組的定義形式如下。類型名數組名[數組長度]實例
輸出12月。指向指針的指針一個指針變量可以指向整型變量、實型變量、字符類型變量,當然也可以指向指針類型變量。當這種指針變量用于指向指針類型變量時,則稱之為指向指針的指針變量。這種雙重指針如圖所示整型變量i地址是&i,其值傳遞給指針變量p1,則p1指向i,同時,將p1的地址&p1傳遞給p2,則p2指向p1。這里的p2就是前面講到的指向指針變量的指針變量,即指針的指針。指向指針的指針變量定義如下。類型標識符**指針變量名;例如:int**p;其含義為定義一個指針變量p,它指向另一個指針變量,該指針變量又指向一個基本整型變量。由于指針運算符“*”是自右至左結合,所以上述定義相當于:int*(*p);既然知道了如何定義指向指針的指針,那么可以將上面圖更形象的表示出來。下面看一下指向指針變量的指針變量在程序中是如何應用的。實例
使用指向指針的指針輸出12月。
實例
利用指向指針的指針輸出一維數組中是偶數的元素,并統計偶數的個數。函數參數的指針變量通過前面的學習知道整型變量、實型變量、字符型變量、數組名和數組元素等均可作為函數參數。此外,指針型變量也可以作為函數參數,這節會具體介紹下。首先通過下面的實例來看下如何用指針變量來做函數參數的。實例
調用自定義函數交換兩變量值。在函數調用過程中,主調用函數與被調用函數之間有一個數值傳遞過程。函數調用中發生的數據傳遞是單向的,只能把實參的值傳遞給形參,在函數調用過程中,形參的值發生改變,實參的值不會發生變化,所以上面的這段代碼同樣不能實現x和y值的互換。通過指針傳遞參數可以減少值傳遞帶來的開銷,也可以使函數調用不產生值傳遞。下面來看下嵌套的函數調用是如何來使用指針變量做函數參數的。實例
嵌套的函數調用。
C語言中實參變量和形參變量之間的數據傳遞是單項的“值傳遞”方式。指針變量作函數參數也是如此,調用函數不可能改變實參指針變量的值,但可以改變實參指針變量所指變量的值。函數參數的指針變量前面兩個例子都是用一個指向數組的指針變量作函數參數,在前面介紹過指向指針的指針,這里就來通過一個例子看下如何用指向指針的指針作函數參數。實例
編程實現對英文的12月份按字母順序進行排序。下面將通過一個二維數組使用指針變量作函數參數的例子來加深讀者對該部分知識的理解。實例
找出數組每行中最大的數,并將這三個數相加求和。
前面介紹過了指向數組的指針變量的定義和使用,這里介紹下如何指向數組的指針變量做函數參數。形式參數和實際參數均為指針變量。實例
任意輸入15個數據,先將這15個數據中是奇數的數據輸出,再求這15個數據中所有奇數之和。數組名就是這個數組的首地址,所以也可以將數組名作為實參傳遞給形式參數。例如:order(a,n); /*調用order函數*/就是直接使用數組名做函數參數的。實例
使用指針實現冒泡排序
當形參為數組時,實參也可以為指針變量。可將上例改寫成如下形式。返回指針值的函數指針變量也可以指向一個函數。一個函數在編譯時被分配給一個入口地址。這個函數入口地址就稱為函數的指針。可以用一個指針變量指向函數,然后通過該指針變量調用此函數。一個函數可以帶回一個整型值、字符值、實型值等,也可以帶回指針型的數據,即地址。其概念與以前類似,只是帶回的值的類型是指針類型而已。返回指針值的函數簡稱為指針函數。定義指針函數的一般形式為。類型名*函數名(參數表列);例如:int*fun(intx,inty)fun是函數名,調用它以后能得到一個指向整型數據的指針。x和y是函數fun的形式參數,這兩個參數也均為基本整型。這個函數的函數名前面有一個*,表示此函數是指針型函數,類型說明是int表示返回的指針指向整型變量。實例
求長方形的周長
指針數組作main函數的參數main函數的第一行一般形式如下。main()從上面會發現main函數是沒有參數的,那么到底main函數能否有參數呢?實際上main函數可以是無參函數也可以是有參的函數。對于有參的形式來說,就需要向其傳遞參數。下面先看一下main()函數的帶參的形式。main(intargc,char*argv[])從函數參數的形式上看,包含一個整型和一個指針數
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025買賣鋼材簡易合同范本
- 2025合同違約與合同無效的差異
- 2025鋁合金窗戶安裝合同
- 2025標準個人住宅抵押擔保借款合同
- 2025網簽版私人購房合同
- 2025租賃合同范本匯編
- 2025標準版土地轉讓合同
- 2025年國際貿易代理合同范本
- 2025年安徽省淮北市五校聯考中考二模歷史試題(含答案)
- 用戶受電施工合同協議
- 初中道德與法治實踐性作業創新設計
- 永善縣污水處理廠污泥無害化處理工程環評報告
- 移動應用程序安全漏洞檢測項目可行性分析報告
- 易燃液體罐式運輸半掛車合格證
- 齒輪泵泵體的加工工藝與專用夾具設計
- 《全國非融資性擔保機構規范管理指導意見》
- 高溫下的安全生產教育培訓
- 固定資產盤點情況范文
- 畢業設計(論文):智能環境監控系統設計
- 2023山西焦煤集團有限責任公司井下操作工招聘2000人筆試備考試題及答案解析
- 勞動與技術教育課程資源開發和整合
評論
0/150
提交評論