




已閱讀5頁,還剩109頁未讀, 繼續免費閱讀
版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
8 1什么是指針8 2指針變量8 3通過指針引用數組8 4通過指針引用字符串8 5提高部分 第8章善于使用指針 P210 8 1什么是指針 在定義變量時 系統就給這個變量分配內存單元 編譯系統根據程序中定義的變量類型 分配一定長度的空間 P210 8 1什么是指針 內存區的每一個字節有一個編號 這就是內存單元的 地址 在地址所標志的內存單元中存放數據 P210 由于通過地址能找到所需的變量單元 我們可以說 地址指向該變量單元 在C語言中 將地址形象化地稱為 指針 意思是通過它能找到以它為地址的內存單元 8 1什么是指針 P210 inta b a b 2000 2002 a 3 3 直接訪問 8 1什么是指針 P210 inta 3 a a pointer 2000 a pointer 間接訪問 定義特殊變量a pointer 2000 通過a pointer取值 8 1什么是指針 P210 為了表示將數值 送到變量中 可以有兩種表達方法 1 將3直接送到變量a所代表的單元中 2 將3送到變量a pointer所指向的單元 即a所代表的存儲單元 指向就是通過地址來體現的假設a pointer中的值是變量a的地址 2000 這樣就在a pointer和變量a之間建立起一種聯系 即通過a pointer能知道a的地址 從而找到變量a的內存單元 一個變量的地址稱為該變量的 指針 例如 地址2000是變量i的指針如果有一個變量專門用來存放另一變量的地址 即指針 則它稱為 指針變量 a pointer就是一個指針變量 指針變量就是地址變量 用來存放地址的變量 指針變量的值是地址 即指針 指針 和 指針變量 是不同的概念可以說變量a的指針是2000 而不能說a的指針變量是2000指針是一個地址 而指針變量是存放地址的變量 8 2指針變量 8 2 1使用指針變量訪問變量的例子8 2 2怎樣定義指針變量8 2 3怎樣引用指針變量8 2 4指針變量作為函數參數 P211 8 2 1使用指針變量訪問變量的例子 例8 1通過指針變量訪問整型變量 P211 includevoidmain inta b int pointer 1 pointer 2 a 100 b 10 pointer 1 定義兩個指針變量 使pointer 1指向a 直接輸出變量a和b的值 間接輸出變量a和b的值 includevoidmain inta b int pointer 1 pointer 2 a 100 b 10 pointer 1 此處 與類型名在一起 此時共同定義指針變量 此處 與指針變量一起使用 此時代表指針變量所指向的變量 8 2 2怎樣定義指針變量 P212 定義指針變量的一般形式為 類型 指針變量名 如 int pointer 1 pointer 2 int是為指針變量指定的 基類型 基類型指定指針變量可指向的變量類型如pointer 1可以指向整型變量 但不能指向浮點型變量 8 2 2怎樣定義指針變量 P212 下面都是合法的定義和初始化 float pointer 3 char pointer 4 inta b int pointer 1 pointer 1 錯誤 pointer 3 錯誤 pointer 1 正確 pointer 3 2000 錯誤 8 2 3怎樣引用指針變量 P214 在引用指針變量時 可能有三種情況 給指針變量賦值 如 p 使p指向a p相當于a 以八進制輸出a的地址 8 2 3怎樣引用指針變量 P214 要熟練掌握兩個有關的運算符 1 取地址運算符 把1賦給a 例8 2輸入a和b兩個整數 按先大后小的順序輸出a和b 解題思路 用指針方法來處理這個問題 不交換整型變量的值 而是交換兩個指針變量的值 includevoidmain int p1 p2 p a b scanf d d a b p1 p2 p 5 9 a b 成立 5 9 includevoidmain int p1 p2 p a b scanf d d a b p1 p2 p 5 9 a b b a includevoidmain int p1 p2 p a b scanf d d a b p1 p2 p 5 9 a b b a a 5 b 9 9 5 includevoidmain int p1 p2 p a b scanf d d a b p1 p2 p 5 9 a b b a 可否改為p1 注意 a和b的值并未交換 它們仍保持原值但p1和p2的值改變了 p1的值原為 a 后來變成 b p2原值為 b 后來變成 a這樣在輸出 p1和 p2時 實際上是輸出變量b和a的值 所以先輸出9 然后輸出5 8 2 4指針變量作為函數參數 P215 例8 3題目要求同例8 2 即對輸入的兩個整數按大小順序輸出 要求用函數處理 用指針變量作函數參數 解題思路 將指向兩個變量的指針變量 內放兩個變量的地址 作為實參傳遞給形參的指針變量 在形參中通過指針交換兩個變量的值 includevoidmain voidswap int p1 int p2 inta b int pointer 1 pointer 2 scanf d d a b pointer 1 5 9 a b pointer 2 5 9 voidswap int p1 int p2 inttemp temp p1 p1 p2 p2 temp a b pointer 1 5 9 a b pointer 2 p1 a p2 b 9 5 voidswap int p1 int p2 inttemp temp p1 p1 p2 p2 temp voidswap int p1 int p2 int temp temp p1 p1 p2 p2 temp 錯 無確定的指向 includevoidmain if a b swap a b printf max d min d n a b voidswap intx inty inttemp temp x x y y temp 錯 無法交換a b a b 5 9 x y 5 9 9 5 如果想通過函數調用得到n個要改變的值 在主調函數中設 個變量 用n個指針變量指向它們 設計一個函數 有n個指針形參 在這個函數中改變這 個形參的值 在主調函數中調用這個函數 在調用時將這n個指針變量作實參 將它們的地址傳給該函數的形參 在執行該函數的過程中 通過形參指針變量 改變它們所指向的n個變量的值 主調函數中就可以使用這些改變了值的變量 例8 4企圖通過改變指針形參的值來改變指針實參的值 不能實現 includevoidmain pointer 1 調用結束后指向不變 錯 只交換形參指向 例8 5輸入3個整數a b c 要求按大小順序將它們輸出 用函數實現改變這3個變量的值 解題思路 采用例8 3的方法在函數中交換兩個變量的值 includevoidmain voidexchange int q1 int q2 int q3 inta b c p1 p2 p3 scanf d d d 調用結束后不會改變指針的指向 9 0 10 voidexchange int q1 int q2 int q3 voidswap int pt1 int pt2 if q1 q2 swap q1 q2 if q1 q3 swap q1 q3 if q2 q3 swap q2 q3 voidswap int pt1 int pt2 inttemp temp pt1 pt1 pt2 pt2 temp 交換指針指向的變量值 9 0 10 10 9 0 8 3通過指針引用數組 P220 8 3 1數組元素的指針8 3 2通過指針引用數組元素8 3 3用數組名作函數參數 8 3 1數組元素的指針 P220 一個變量有地址 一個數組包含若干元素 每個數組元素都有相應的地址指針變量可以指向數組元素 把某一元素的地址放到一個指針變量中 所謂數組元素的指針就是數組元素的地址 可以用一個指針變量指向一個數組元素inta 10 1 3 5 7 9 11 13 15 17 19 int p p 等價于p a 等價于int p a 或int p 注意 數組名a不代表整個數組 只代表數組首元素的地址 p a 的作用是 把a數組的首元素的地址賦給指針變量p 而不是 把數組a各元素的值賦給p 8 3 2通過指針引用數組元素 引用數組元素 可用下面兩種方法 1 下標法 用數組名加下標如a i 2 指針法 即地址法 a i 或 p i 其中初值p a P221 例8 6有一個數組存放10個學生的年齡 用不同的方法輸出數組中的全部元素 解題思路 設整型數組a 10 可以用下面方法實現輸出全部學生的年齡 用數組名加下標 通過數組名計算數組元素地址 找到元素 通過指針變量計算數組元素地址 找到元素 用指針變量先后指向各數組元素 includevoidmain inta 10 19 17 20 18 16 22 24 15 23 25 inti p a for i 0 i 10 i printf d a i printf n for i 0 i 10 i printf d a i printf n for i 0 i 10 i printf d p i printf n for p p a 10 p printf d p printf n 指針運算 通過指針的運算 可以方便地引用數組中的元素 1 如果指針變量p已指向數組中的一個元素 則p 1指向同一數組中的下一個元素 p 1指向同一數組中的上一個元素 floata 10 p a 假設a 0 的地址為2000 則p的值為2000p 1的值為2004 2 如果p的初值為 a 0 則p i和a i就是數組元素a i 的地址 或者說 它們指向a數組序號為i的元素 p p 1 a 1 p i a i p 9 a 9 3 p i 或 a i 是p i或a i所指向的數組元素 即a i p p 1 a 1 p i a i p 9 a 9 p i 4 如果指針p1和p2都指向同一數組p2 p1的值是4不能p1 p2 p1 p2 例8 7通過指針變量讀入數組的10個元素 然后輸出這10個元素 includevoidmain int p i a 10 p a for i 0 i 10 i scanf d p for i 0 i 10 i p printf d p printf n 退出循環時p指向a 9 后面的存儲單元 因此執行此循環出問題 重新執行p a 8 3 3用數組名作函數參數 P224 用數組名作函數參數時 因為實參數組名代表該數組首元素的地址 形參應該是一個指針變量C編譯都是將形參數組名作為指針變量來處理的 voidfun intarr intn voidmain voidfun intarr intn intarray 10 fun array 10 fun int arr intn voidfun intarr intn voidmain voidfun intarr intn intarray 10 fun array 10 array 0 arr 0 array數組 arr array 3 arr 3 arr 3 實參數組名是指針常量 但形參數組名是按指針變量處理在函數調用進行虛實結合后 它的值就是實參數組首元素的地址在函數執行期間 形參數組可以再被賦值voidfun arr intn printf d n arr arr arr 3 printf d n arr 例8 8將數組a中n個整數按相反順序存放解題思路 將a 0 與a n 1 對換 將a 4 與a 5 對換 j i 例8 8將數組a中n個整數按相反順序存放解題思路 將a 0 與a n 1 對換 將a 4 與a 5 對換 j i 例8 8將數組a中n個整數按相反順序存放解題思路 將a 0 與a n 1 對換 將a 4 與a 5 對換 j i 例8 8將數組a中n個整數按相反順序存放解題思路 將a 0 與a n 1 對換 將a 4 與a 5 對換 j i 例8 8將數組a中n個整數按相反順序存放解題思路 將a 0 與a n 1 對換 將a 4 與a 5 對換 j i includevoidmain voidinv intx intn inti a 10 3 7 9 11 0 6 7 5 4 2 for i 0 i 10 i printf d a i printf n inv a 10 for i 0 i 10 i printf d a i printf n return0 voidinv intx intn inttemp i j m n 1 2 for i 0 i m i j n 1 i temp x i x i x j x j temp voidinv intx intn int p temp i j m n 1 2 i x j x n 1 p x m for i p i j temp i i j j temp 優化 例8 9編寫一個函數用選擇法對10個整數按由大到小順序排序 用數組名作實參 編程思路 用選擇法排序 其算法前已介紹 includevoidmain voidsort intx intn int p i a 10 p a for i 0 i 10 i scanf d p p a sort p 10 for p a i 0 i 10 i printf d p p printf n voidsort intx intn inti j k t for i 0 ix k k j if k i t x i x i x k x k t voidsort int x intn if x j x k k j t x i x i x k x k t 8 4通過指針引用字符串 8 4 1字符串的表示形式8 4 2字符指針作函數參數8 4 3對使用字符指針變量和字符數組的討論 P229 8 4 1字符串的表示形式 可以用兩種方法訪問一個字符串 1 用字符數組存放一個字符串 然后用字符數組名和下標可以訪問字符數組中的元素 也可以通過字符數組名用 s格式符輸出一個字符串 2 用字符指針指向一個字符串 可以不定義字符數組 而定義一個字符指針 用字符指針指向字符串中的字符 P229 例8 10定義字符指針 使它指向一個字符串 includevoidmain char string IloveChina printf s n string string char string string IloveChina 例8 11有一字符數組a 內存有字符串 Iamaboy 要求把該字符串復制到字符數組b中 解題思路 從第一個字符開始 將數組a中的字符逐個復制到數組b中 直到遇到a數組中的某一元素值為 0 為止 此時表示數組a中的字符串結束 然后在已復制到b數組中的字符最后加一個 0 表示字符串結束 includevoidmain chara Iamaboy b 20 inti for i 0 a i 0 i b i a i b i 0 printf stringais s n a printf stringbis for i 0 b i 0 i printf c b i printf n 相當于b i a i 用字符數組實現的 例8 12用指針變量來處理例8 11問題 編程思路 1 使兩個指針p1和p2分別指向字符串a和b 2 將 p1復制到 p2中 p1 a b p2 例8 12用指針變量來處理例8 11問題 編程思路 1 使兩個指針p1和p2分別指向字符串a和b 2 將 p1復制到 p2中 3 使p1和p2分別下移一個位置 p1 a b p2 I 例8 12用指針變量來處理例8 11問題 編程思路 1 使兩個指針p1和p2分別指向字符串a和b 2 將 p1復制到 p2中 3 使p1和p2分別下移一個位置 4 將 p1復制到 p2中 5 再使p1和p2分別下移一個位置 p1 a b p2 I 例8 12用指針變量來處理例8 11問題 編程思路 1 使兩個指針p1和p2分別指向字符串a和b 2 將 p1復制到 p2中 3 使p1和p2分別下移一個位置 4 將 p1復制到 p2中 5 再使p1和p2分別下移一個位置 p1 a b p2 I a 例8 12用指針變量來處理例8 11問題 編程思路 1 使兩個指針p1和p2分別指向字符串a和b 2 將 p1復制到 p2中 3 使p1和p2分別下移一個位置 4 將 p1復制到 p2中 5 再使p1和p2分別下移一個位置 發現p1指向的字符是 0 時不再進行復制 6 在p2所指的位置上賦予 0 p1 a b p2 I a m a b o y 0 includevoidmain chara Iamaboy b 20 p1 p2 inti p1 a p2 b for p1 0 p1 p2 p2 p1 p2 0 printf stringais s n a printf stringbis for i 0 b i 0 i printf c b i printf n printf stringbis s n b 用指針實現的 8 4 2字符指針作函數參數 如果想把一個字符串從一個函數 傳遞 到另一個函數 可以用地址傳遞的辦法 即用字符數組名作參數 也可以用字符指針變量作參數 在被調用的函數中可以改變字符串的內容在主調函數中可以引用改變后的字符串 P233 8 4 2字符指針作函數參數 例8 13任務同例8 11 即復制字符串 但要求用函數調用來實現 P233 includevoidmain voidcopy string char from char to char a Iamateacher charb Youareastudent char p b printf a s nb s n a p printf copystringatostringb n copy string a p printf a s nb s n a b voidcopy string char from char to for from 0 from to to from to 0 from a b to voidcopy string char from char to for from 0 from to to from to 0 from a b to voidcopy string char from char to for from 0 from to to from to 0 from a b to 0 例8 14有字符串a Iamateacher 字符串b Youareastudent 要求把字符串b連接到字符串a的后面 即字符串a的內容為 Iamateacher Youareastudent 解題思路 1 使p1和p2分別指向字符串a和b 2 使p1下移到字符串a的 0 處 3 從p1指向的元素處開始 將字符串b中的字符逐個復制到字符數組a中用一個函數來實現字符串連接的功能 includevoidmain voidlink string char arr1 char arr2 chara 40 Iamateacher charb Youareastudent char p1 a p2 b printf a s nb s n p1 p2 link string p1 p2 printf a s nb s n a b p1 a b p2 0 0 voidlink string char arr1 char arr2 inti for i 0 arr1 0 i arr1 for arr2 0 arr1 arr2 arr1 arr2 arr1 0 arr1 a b arr2 0 0 voidlink string char arr1 char arr2 inti for i 0 arr1 0 i arr1 for arr2 0 arr1 arr2 arr1 arr2 arr1 0 arr1 a b arr2 0 0 voidlink string char arr1 char arr2 inti for i 0 arr1 0 i arr1 for arr2 0 arr1 arr2 arr1 arr2 arr1 0 arr1 b arr2 0 0 調用函數時實參與形參的對應關系 8 4 3對使用字符指針變量和字符數組的討論 雖然用字符數組和字符指針變量都能實現字符串的存儲和運算 但它們二者之間是有區別的 不應混為一談 主要有以下幾點 P236 1 字符數組由若干個元素組成 每個元素中放一個字符 而字符指針變量中存放的是地址 字符串第1個字符的地址 決不是將字符串放到字符指針變量中 2 賦值方式 對字符數組只能對各個元素賦值 不能用以下辦法對字符數組賦值 charstr 14 str IloveChina 而對字符指針變量 可用下面方法賦值 char a a IloveChina 但注意賦給a的不是字符 而是字符串第一個元素的地址 3 對字符指針變量賦初值 char a IloveChina 等價于char a a IloveChina 而對數組的初始化 charstr 14 IloveChina 不能等價于charstr 14 str IloveChina 4 如果定義了一個字符數組 在編譯時為它分配內存單元 它有確定的地址 而定義一個字符指針變量時 給指針變量分配內存單元 在其中可以放一個字符變量的地址 char a scnaf s a 錯char a str 10 a str scanf s a 對 5 指針變量的值是可以改變的 例8 15改變指針變量的值 解題思路 先使指針變量a指向字符串第1個字符 然后改變指針變量a的值 使之指向字符串中第1個字符 輸出其后面的字符 includevoidmain char a IloveChina a a 7 printf s n a 不能改為chara IloveChina a a 7 China 6 對字符數組可以用下標法和地址法引用數組元素 a 5 a 5 如果字符指針變量p a 則也可以用指針變量帶下標的形式和地址法引用 p 5 p 5 char a IloveChina 則a 5 的值是第6個字符 即字母 e 7 字符數組中各元素的值是可以改變的 可以對它們再賦值 但字符指針變量指向的字符串常量中的內容是不可以被取代的 不能對它們再賦值 如 chara House char b House a 2 r 對b 2 r 錯 8 5提高部分 8 5 1指針使用的技巧8 5 2多維數組的指針8 5 3指向函數的指針8 5 4返回指針值的函數8 5 5指針數組8 5 6多重指針 指向指針的指針 P239 8 5 1指針使用的技巧 P239 voidcopy string char from char to for from 0 from to to from to 0 while to from 0 to from 8 5 1指針使用的技巧 P239 voidcopy string char from char to while to from 0 to from while to from 0 8 5 1指針使用的技巧 P239 voidcopy string char from char to while to from 0 to from while from 0 to from 8 5 1指針使用的技巧 P239 voidcopy string char from char to while from 0 to from while from 8 5 1指針使用的技巧 P239 voidcopy string char from char to while to from for to from 8 5 2多維數組的指針 指針變量可以指向一維數組中的元素 也可以指向多維數組中的元素 P240 inta 3 4 1 3 5 7 9 11 13 15 17 19 21 23 a a 1 a 2 int p 4 指向一
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年體育休閑廣場健身俱樂部市場分析初步評估報告
- 藥品調劑分裝管理制度
- 藥品間接銷售管理制度
- 藥店員工獎罰管理制度
- 藥店督導各項管理制度
- 菜園農藥使用管理制度
- 設備人員技能管理制度
- 設備單獨使用管理制度
- 設備技術檔案管理制度
- 設備檢測檢驗管理制度
- 2025年全國新高考II卷高考全國二卷真題英語試卷(真題+答案)
- 《老年人認知記憶訓練》課件
- 經濟法學-001-國開機考復習資料
- 2024年廣東省中考生物+地理試卷(含答案)
- 內蒙古自治區安全評價收費指導性意見(試行)(2006年)
- 食品中日文加工用語
- 小班化教育課堂教學.ppt
- ISO 鑄件尺寸公差標準 ISO8062
- 巧克力糖自動包裝機說明書
- 等效內摩擦角計算表
- 繼承不動產登記具結書
評論
0/150
提交評論