華中科技大學光電子學院C語言課件第七章.ppt_第1頁
華中科技大學光電子學院C語言課件第七章.ppt_第2頁
華中科技大學光電子學院C語言課件第七章.ppt_第3頁
華中科技大學光電子學院C語言課件第七章.ppt_第4頁
華中科技大學光電子學院C語言課件第七章.ppt_第5頁
已閱讀5頁,還剩43頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1 第七章指針1 指針與數(shù)組的關系2 指針與函數(shù)的關系 1 指針及定義一 指針變量的定義指針變量 存放對象地址的變量 指針變量定義的基本形式 類型說明符 變量名 例 int pi pj pi pj指向整型變量的指針變量 float p3 p3是指向浮點型變量的指針變量 注 1 定義指針變量的物理意義 機器給指針變量分配內存單元 此單元只能存放對象的地址 2 2 指針類型是指針所指對象的類型 指針本身沒有類型 例 int fpi a 10 pa 10 復雜變量的指針 fpi是一個整型指針函數(shù) 函數(shù)返回值是指向int變量的指針 a是含有10個元素的整型指針數(shù)組 每個元素是一個指向int變量的指針 pa是指向含有10個int元素的數(shù)組的指針 3 二 指針變量的運算符 指針變量運算符 間接取對象的內容 取操作對象的地址 都是一目運算符 例 int p p1 t t1 p 將0送p指向的t單元中 即t 0 4 例 inti j p 1 i 123 2 p 表達式 r a 0 a 1 是正確的 2 r a k是非法的 2 與 直接尋址 訪問c 三 指針運算1 賦值運算1 同類型的指針變量可以相互賦值 指向同一類型的對象 int p1 p2 a p1 7 4 兩種特殊指針 void指針和NULL指針void指針 指向空值類型的指針變量 可以與任何類型指針變量相互賦值 不需要強制類型轉換 如 int p void p1 p p1 p1 p NULL指針 具有整數(shù)0值的指針 即不指向任何對象的指針NULL符號常量 在有定義 或用 defineNULL0定義 void f f是無參數(shù)的指針函數(shù) void pa 8 例 main int p1 p2 p a b scanf d d 9 2 算術運算僅限于加法和減法1 指針變量加 減 一個整數(shù) int p p1 p 訪問p后 p從當前位置向后移一個單元的數(shù)據 p 訪問p后 p從當前位置向前移一個單元的數(shù)據 p 訪問p前 p從當前位置向前移一個單元的數(shù)據 p 5 指向p當前所指數(shù)據后面第5個單元的數(shù)據 2 同類型指針變量之間僅只能相減 結果為整數(shù) 不為指針 大小為相隔的字節(jié)數(shù) 如 上面p p1 注 不允許兩指針變量相加 乘除 移位 屏敝運算 以及float或double數(shù)與指針相加運算 10 例 用指針定義求字符串長度的函數(shù)intstrlen char s char p s while p 0 p return p s 3 關系運算兩個指針指的類型相同 可以進行比較 q若值為非0 則p所指的數(shù)據位于q所指的數(shù)據之前 反之為0指針變量不能與常量比較 但常量0 NULL 可與任何類型的指針變量作 或 的比較 11 2 指針與數(shù)組指針與數(shù)組有密切關系 任何由數(shù)組下標完成的操作 都可由指針實現(xiàn) 一 一維數(shù)組的指針表示例 inta 10 pa pa 或pa a 0 指針指向數(shù)組的首址規(guī)定 pa 1指向a 1 a 1 第1個元素pa 2指向a 2 a 2 第2個元素 pa i指向a i a i 第i個元素故 pa i 或 a i 就是a i 的內容 12 注 1 當指針變量指向數(shù)組首址后 以下標為i的數(shù)組元素引用的方法有3種 指針變量 i 數(shù)組名 i 數(shù)組名 i 指針法數(shù)組元素法 2 數(shù)組名與指針之間有區(qū)別 指針是變量 數(shù)組名是地址常量如 pa a pa 是有意義的操作a pa a pa 都是非法的 訪問一個數(shù)組元素 可用下標法 a i 也可用指針法 p i 或 a i 1 下標法 main inti min max a 10 for i 0 imax max a i elseif a i min min a i printf max d min d n max min 例 求整型數(shù)組a 10 中的最大值和最小值 2 用數(shù)組名訪問元素main inti min max a 10 for i 0 imax max a i elseif a i min min a i printf max d min d n max min 3 用指針間接訪問main int p min max a 10 p a for pmax max p elseif p min min p printf max d min d n max min 注 1 指針變量的定義和沒有指明長度的數(shù)組視為一樣例 在函數(shù)定義中 參數(shù)說明 f chars f char s 2 在C語言中 只要出現(xiàn)未加下標的數(shù)組名 字符串常量名 結構名 聯(lián)合名或不帶參數(shù)的函數(shù)名 都可以解釋成指針 因此可同指針變量一樣置初值3 指針與字符串 字符數(shù)組 如 chars It sastring char s It sastring 但有區(qū)別 如 char p 指向一個字符的指針變量 p It sastring 指向字符串的串首址 scanf s p 錯誤 沒有為p所指的對象分配空間 又如 chars s It sastring 錯誤s為地址常量 例 lenth s 計算s的長度 chars intn for n 0 s n 0 n return n lenth s char s intn for n 0 s 0 n return n includemain staticchars1 abcdef 等價于char s1 abcded intstring string lenth s1 等價于string lenth 例 把字符串t復制到字符串s中的函數(shù)strcpy s t 用指針strcpy s t char s t while s t 0 用數(shù)組strcpy chars chart inti for i 0 s i t i 0 s i t i 二 指針與多維數(shù)組1 二維數(shù)組元素的表示例 inta 2 3 1 2 3 4 5 6 1 下標表示 元素的地址表示 a i j 取地址 元素的內容表示 a i j 2 元素的數(shù)組名表示例 inta 2 3 1 2 3 4 5 6 數(shù)組名a被看成由元素a 0 a i 的一維數(shù)組 但a 0 又可看成包含3個元素a 0 0 a 0 1 a 0 2 一維數(shù)組a 1 又可看成包含3個元素a 1 0 a 1 1 a 1 2 一維數(shù)組即 根據C語言規(guī)定 數(shù)組名代表數(shù)組的首地址 因此 a代表二維數(shù)組的首址 即第0行的首址 a 1 代表第一行的首址同理 a 0 為另一個一維數(shù)組的首址 即第0行第0列元素的首址 即 a 0 是a 1 2是 a 1 2 即 a i j 元素的地址用數(shù)組名表示 a i j 或 a i j與二維數(shù)組地址 a i j 一樣a i j 元素值用數(shù)組名表示 有以下幾種等價形式 a i j a i j a i j 數(shù)組名與下標混合表示 或 a 0 0 2 i j 注 inta 2 3 例 編程用指針變量輸出數(shù)組元素的值 main inta 3 4 1 2 3 4 5 6 7 8 9 10 11 12 int p for a 0 p a 0 12 p if p a 0 4 0 printf n 一行輸出4個數(shù)據 printf 5d p 3 指向數(shù)組指針變量的定義如 int pa 3 a 2 3 指針變量pa指向3個元素的數(shù)組 pa a 使pa指向數(shù)組a的第0行 注 int pa 3 與int pa 3 不同 后者為由三個指針組成的指針數(shù)組 例 上例 main inta 3 4 1 2 3 4 5 6 7 8 9 10 11 12 int p 4 j for p a p a 3 p for j 0 j 4 j printf 5d p j printf n 2 多維數(shù)組的指針表示三維及以上的數(shù)組用指針表示比較復雜 一般采用下標表示元素法比較好 3 指向二維數(shù)組的指針變量的使用1 指針變量指向二維數(shù)組的某個元素定義時 指針變量 inta 2 3 p a 或 p 24 for i 0 i 2 i printf for j 0 j 3 j p 2 指針變量指向二維數(shù)組的首地址定義時 指針變量 二維數(shù)組名 指針變量 三數(shù)組名 0 0 引用時 指針變量 二維數(shù)組名指針變量 二數(shù)組名 0 0 3 指針變量指向二維數(shù)組中的某一個一維數(shù)組 P a 或p 25 定義時 指針變量 m 二維數(shù)組名 m為列長 引用時 指針變量 二維數(shù)組名數(shù)組元素的地址引用 指針變量 行下標 列下標數(shù)組元素的內容引用 指針變量 行下標 列下標 例 上例 main inta 2 3 p 3 a inti j for I 0 i 2 i for j 0 j 3 j scanf d p i j 或 a i j for i 0 i 2 i printf for j 0 j 3 j printf 5d p i j 或 a i j 三 指針數(shù)組和命令行處理由指針變量組成的數(shù)組1 指針數(shù)組說明的一般形式 類型標識符 數(shù)組名 常量表達式 例 int a 4 注 1 a 4 是指針數(shù)組而 p 4 是指向數(shù)組的指針變量2 指針數(shù)組主要用于字符串數(shù)組的處理和命令行參數(shù)的處理因為字符串數(shù)組中每一個字符串不等長 例 輸入一個表示月份的整數(shù) 輸出該月份的名字main intn char month Illegalmonth Jan Feb March April May June July Aug Sep Oct Nov Dec printf Inputnumberofmonth n scanf d 2 命令行參數(shù)的處理命令行帶有任選變元或參數(shù)稱為命令行參數(shù) 如 c echohelloworld 操作系統(tǒng)下的命令行 發(fā)布命令行的時刻 在操作系統(tǒng)下執(zhí)行時如何將命令的參數(shù)接收到程序中 方法是 通過函數(shù)main argc argv 中argc argv傳送給程序 其中 argc 計算命令行中參數(shù)的個數(shù)argv 指針數(shù)組 每個元素是指向包含這些參數(shù) 字符串 的指針 如 c echohelloworldargc 3argv 0 echo argv 1 hello argv 2 world 參數(shù)argc argv的定義 main argc argv intargc char argv 或char argv 注 1 argc和argv位置不能顛倒2 argc和argv的初始化 由鍵入的命令 包括命令字 的個數(shù)決定 例 編一命令行執(zhí)行程序 c echowhatdayistoday 輸出命令行參數(shù) whatdayistaday main argc argv intargc char argv while argc 0 printf s c argv argc 1 n 編譯echo c生成echo exe文件 在dos狀態(tài)下執(zhí)行c echowhatdayistoday 顯示 whatdayistoday 它告訴我們 可在操作系統(tǒng)狀態(tài)下 利用程序 接收字符串 然后處理這些串 例如 輸入 c day22001 設計程序day c 接收月份 年份 顯示該月的天數(shù) 四 指向指針的指針變量定義形式 類型標識符 標識符例 char p 相當于 p 其中 p是指針變量的說明 它說明了一個指向字符型數(shù)據的指針變量前 星號表示指針變量p是指向一個字符型指針變量的指針變量 指針變量的嵌套定義 注 訪問內容時 需要二次間址操作 用 p表示 p是間接指向對象的地址 而 p是p間接指向的對象的值 例 includemain inti a 5 num 5 p printf inputinteger5 n for i 0 i 5 I num i 輸入 integer5 輸出 指針與函數(shù)一 指針變量作為函數(shù)參數(shù)1 指針變量作為函數(shù)形參可改變對應實參的值 傳地址 如 main inta 5 i 3 out out changer 注 除數(shù)組名外 任何以地址傳遞的實參變量必須在變量名前加上 符號 表示傳地址 在被調用函數(shù)中形參要說明為指針 2 通過指針參數(shù)可以從被調用參數(shù)中返回多個值例 求10個整數(shù)中奇數(shù)和偶數(shù)的個數(shù)voidcount intx intp1 intp2 if x 2 0 p1 else p2 main inti j sum1 0 sum2 0 for i 0 i 10 i scanf d 2 指針作形參 對應實參的形式voidsort int v intn v 和 v都是數(shù)組指針變量 調用函數(shù) inta 10 p p 2 形參說明為指向數(shù)組元素的指針 實參為數(shù)組元素的地址或指向元素的指針變量 如 voidf int p intsize 調用函數(shù) inta 2 3 f a 0 2 3 或 a 0 0 3 形參說明為指向下一級數(shù)組的指針 實參為下一組數(shù)組的指針 或指向下一級數(shù)組的指針變量 如 voidf int pa 3 intsize 調用函數(shù) inta 2 3 f a 2 或 inta 2 3 p 3 p a f p 2 C語言中 函數(shù)不能返回數(shù)組 函數(shù) 結構 聯(lián)合類型的值 但可以用返回指向此類數(shù)據的指針的方法實現(xiàn) 二 指向函數(shù)的指針變量 函數(shù)指針 定義形式 類型標識符 指針變量名 例 int p 與數(shù)組指針定義類似 char p 說明 1 p是指向一個函數(shù)的指針變量 指向該函數(shù)名代表的入口地址送指針p 此函數(shù)返回int類型的值2 用函數(shù)指針變量調用函數(shù)時 用函數(shù)名送入p中即可 作用 利用函數(shù)指針將函數(shù)名傳給一個函數(shù) 例 求a b中的最小數(shù)的程序 1 一般函數(shù)調用main inta b c scanf d d 2 用函數(shù)指針調用main inta b c int p scanf d d 注 函數(shù)指針作為函數(shù) 函數(shù)名作為形參 實現(xiàn)將函數(shù)名作為參數(shù)傳給其他函數(shù)的目的 例 有函數(shù)max min mean分別起兩個整數(shù)中最大 最小 平均值 max intx inty intz if x y z x elsez y return z min intx inty intz if x y z x elsez y return z mean intx inty 轉右邊 intz z x y 2 return z main inta b c e d scanf d d 通過函數(shù)指針將函數(shù)名作為參數(shù)傳給其他函數(shù) 便能創(chuàng)造出功能很強的高級函數(shù)系統(tǒng) 在大型c程序設計中很有作用定義另一個函數(shù)all如下 voidall intx inty func int func 函數(shù)名傳遞 intz z func x y printf d n z main inta b scanf d d 三 指針函數(shù) 與指針數(shù)組類似 返回指針的函數(shù)定義形式 類型標識符 函數(shù)名 參數(shù)表 例 int f x y 與指針數(shù)組類似 int f 10 返回值是一個指向整型數(shù)據的指針 可返回數(shù)組的首址 結構首址 聯(lián)合首址 指針變量的地址和變量地址 例 將兩個字符串連成一個串 并輸出 char cat char p1 char p2 staticchara 160 p p a while p1 0 p p1 while p2 0 p p2 p p2 return a main chars1 80 s2 80 scanf s s1 scanf s s2 prin

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論