




下載本文檔
版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
1、第六章 指 針1指針 (Pointer)1. 指針概念2. 指針變量和指針運算3. 指向數(shù)組的指針4. 指向字符串的指針5. 指針數(shù)組和指向指針的指針6. 指針應用程序舉例21. 指針的概念指針表示變量等的存儲地址使用指針可以獲得緊湊、高效的代碼使用指針也可能使程序晦澀難懂指針的使用靈活方便指針操作容易出錯且難以調(diào)試指針與數(shù)組關系密切3指針的故事“該程序執(zhí)行了非法操作,即將關閉”這種錯誤絕大部分都是指針和數(shù)組造成的黑客攻擊服務器利用的 bug絕大部分都是指針和數(shù)組造成的有些用C的人,盡量避免使用指針4關于指針的原則學習原則復雜的應用也不建議使用Keep it simple and stupid
2、 (KISS)使用原則永遠要清楚每個指針指向了哪里永遠要清楚每個指針指向的地方存放的是什么5指針與地址地址通過首地址和數(shù)據(jù)類型可以訪問內(nèi)存中某一數(shù)據(jù)數(shù)據(jù)類型決定所占用存儲單元數(shù)指針就是地址和類型有關61、變量與地址 程序中: short i; float k; 內(nèi)存中每個字節(jié)有一個編號-地址.2000200120022005內(nèi)存02003ik 編譯或函數(shù)調(diào)用時為其分配內(nèi)存單元變量是對程序中數(shù)據(jù)存儲空間的抽象指針與地址72、數(shù)組與地址 地址內(nèi)存單元整型數(shù)組元素a0整型數(shù)組元素a1整型數(shù)組元素a2123300030013002300330043005數(shù)組與地址對照表 數(shù)組名 數(shù)據(jù)類型 長 度 首地
3、址 a 整型 3 3000程序中:short a3=1,2,3;82. 指針變量和指針運算變量的指針和指針變量指針變量的定義地址運算符和指針運算符指針變量的引用指針的運算9變量的指針和指針變量變量的指針變量的地址,即內(nèi)存中存儲某個變量的存儲單元的首地址可以通過變量的地址來間接的訪問變量指針變量具有指針類型的變量,專門存放地址數(shù)據(jù)的變量 通過指針變量可以間接訪問變量或內(nèi)存數(shù)據(jù)10.2000200420062005short型變量i10變量i_pointer200120022003指針:一個變量的地址指針變量:專門存放變量地址的變量2000指針指針變量 變量的內(nèi)容 變量的地址指針變量變量變量地址(
4、指針)變量值指向地址存入指針變量變量的指針和指針變量11如何定義指針變量?定義指針變量int *p;定義了一個指針變量p,簡稱指針pp是變量,int* 是類型p里保存一個地址。此時這個地址是哪呢(p指向哪呢)?指針變量初始化p = &a;*p就像普通的變量一樣使用,其值是p指向的內(nèi)存的內(nèi)容(在上例和a等價,但尋址方式不同)p可以動態(tài)(任意)地指向不同內(nèi)存,從而使*p代表不同的變量12指針變量的定義一般形式基類型 *指針變量名;說明“基類型”表示該指針指向的數(shù)據(jù)的類型可以定義基類型為空類型void的指針變量舉例int *pi;char *pc1, *pc2;void *p;13int i,*p;
5、p=&i; int *p;float *q;p=q;int i;float *p;p=&i;int *p;p=1.1;判斷是真?是假?指針變量只存放地址!一個指針變量不能指向與其類型不同的變量!我是真的,你猜對了嗎?應在類型相同的指針變量之間賦值14地址運算符 (Address Operator)地址運算符 &獲得操作數(shù)的地址(指針)單目運算符,自右向左結合,優(yōu)先級較高操作數(shù)應為各種類型的內(nèi)存變量、數(shù)組元素、結構體成員等操作數(shù)不能是表達式、常量、寄存器變量舉例scanf(%f, &score);int i, *p=&i;15指針運算符 (Indirection Operator)指針運算符 *
6、獲得指針指向的內(nèi)存數(shù)據(jù)又稱“間接訪問運算符”單目運算符,自右向左結合,優(yōu)先級較高操作數(shù)為具有指針(地址)意義的值舉例int i, *p=&i;(*p)+; /* i+; */16指針變量的引用指針變量也要“先賦值,后使用”沒有賦值的指針變量所存儲的地址數(shù)據(jù)是不確定的,對它的引用非常危險對指針的賦值要注意類型匹配,必要時可以使用強制類型轉換,但要慎重使用*p可以用于與指針p的基類型相同類型的變量可以使用的任何場合指針變量可以作為函數(shù)的參數(shù)17指針變量引用舉例 int a, b, c, *pa, *pb, *pc;pa = &a;pb = &b;pc = &c;a = 100;printf(“*p
7、a=%dn”, *pa);/ *pa=100 *pb = 200;printf(b=%dn, b);/ b=200 scanf(%d, pc);/ 輸入34 printf(c=%dn, c);/ c=34 18指針變量與所指變量的關系1020papbabint a, b;int *pa, *pb;pa = &a;pb = &b;*pa = 10;b = 20;pa = pb;pb = &a;&a,&*pa*pa,*&a19指針的運算運算類型算術運算:加、減、自增、自減關系運算:所有關系運算賦值運算:一般賦值、加賦值、減賦值上述運算在一定約束條件下才有意義(后詳)變量說明p,q是同類型的指針變量
8、n是整型變量20指針的算術運算運算方式說 明p+np之后第n個元素的地址p-np之前第n個元素的地址p+p作為當前操作數(shù),然后后移一個元素+pp后移一個元素,然后作為當前操作數(shù)p-p作為當前操作數(shù),然后前移一個元素-pp前移一個元素,然后作為當前操作數(shù)p-q表示p和q兩者之間的元素個數(shù)條件:p,q是指向同一數(shù)據(jù)集合(數(shù)組)的指針注意避免數(shù)組越界21指針的關系運算條件p,q是指向同一數(shù)據(jù)集合(數(shù)組)的指針運算方式pq、p=q、pqpq) printf(%d, p-q);else printf(%d, q-p);pq3個short253. 指向數(shù)組的指針指針與數(shù)組的關系指向數(shù)組的指針通過指針引用數(shù)
9、組元素指向二維數(shù)組的指針26指針與數(shù)組的關系數(shù)組名是“常量指針”數(shù)組名表示數(shù)組的首地址,因此數(shù)組名也是一種指針(地址)數(shù)組名表示的地址(指針)不能被修改,所以稱之為“常量指針”數(shù)組的指針數(shù)組的起始地址與數(shù)組名表示的指針相同與數(shù)組的第一個元素(a0)的地址相同27數(shù)組和指針的用法數(shù)組名不能被賦值和修改,可以直接使用, 若指針指向數(shù)組,則兩者的其他用法基本相同定義指針時,只分配一段用來存放地址的空間,而沒有分配存放數(shù)據(jù)的空間定義數(shù)組時,為所有元素分配相應的連續(xù)的存儲空間,但沒有存放地址的空間指針應賦值后才能使用28指向數(shù)組的指針char a10, *p;p = &a0;char a10, *p=&
10、a0;char a10, *p;p = a;char a10, *p=a;ap&a029通過指針引用數(shù)組元素當一個指針變量指向數(shù)組或某個數(shù)組元素時,可以通過這個指針變量引用所有的數(shù)組元素引用數(shù)組元素的方法下標運算符,例如ai、pi指針運算符*,例如*(a+i)、*(p+i)注意數(shù)組名不能被修改和賦值注意防止下標越界30通過指針引用數(shù)組元素圖示p0, *p, *ap, ap+1, a+1p1, *(p+1), *(a+1)q+i-2, p+i, a+ipi, *(p+i), *(a+i)qi-2, *(q+i-2), p+9, a+9p9, *(p+9), *(a+9)q, p+2, a+2p2
11、, *(p+2), *(a+2) q0, *q31數(shù)組名和指針引用數(shù)組元素比較 (1)指針指向數(shù)組首地址前提條件:int a10, *p=a;ai、pi、*(a+i)、*(p+i)等用法都是合法的,且它們都表示同一個數(shù)組元素a+i(或p+i)不是簡單的在a(或p)表示的地址值上簡單的加i,而是加上i個基類型所需的地址偏移量,即加上i*sizeof(int)指針值可以改變,如p+為下一元素的地址數(shù)組名的值不能修改,如a+是非法操作32數(shù)組名和指針引用數(shù)組元素比較 (2)指針指向某個數(shù)組元素前提條件:p=a+i;*(p+)與ai+等價*(p-)與ai-等價*(+p)與a+i等價*(-p)與a-i等
12、價注意不能使用*(a+)或a=p+i這種形式注意區(qū)分運算順序,*(p+)與(*p)+注意防止下標越界,注意掌握指針位置33有一個整型數(shù)組a,有10個元素,要求輸出數(shù)組中的全部元素。 1.下標法 #include int main() int a10, i; printf(“enter 10 integer numbers:n); for(i=0;i10;i+) scanf(%d,&ai); for(i=0;i10;i+) printf(“%d ”,ai); printf(%n); return 0; 34(2) 通過數(shù)組名計算數(shù)組元素地址,找出元素的值 #include int main()
13、int a10, i; printf(“enter 10 integer numbers:n); for(i=0;i10;i+) scanf(%d,&ai); for(i=0;i10;i+) printf(“%d ”,*(a+i); / *(a+i) 和 ai 等價 printf(n); return 0; 35(3) 用指針變量指向數(shù)組元素 #include int main() int i,*p,a10,; printf(“enter 10 integer numbers:n); for(i=0;i10;i+) scanf(%d,&ai); for(p=a;p=(a+9);p+) / 數(shù)組
14、名a賦值給p /a+9表示 數(shù)組最后一個元素a9的起始地址 printf(“%d ”,*p); printf(n); return 0; 36#include int main() int i,*p,a10; printf(please enter 10 integer numbers:); for(p=a,i=0;i10;i+) / 用指針變量輸入,要將數(shù)組起始地址賦值給p scanf(“%d”,p+); /指針向后移動 p=a; /指針重新指向數(shù)組起始位置 for(i=0;i10;i+,p+) /用指針變量p直接指向數(shù)組元素 printf(%d ,*p); printf(n); retur
15、n 0;373種方法的比較: 第(1)和第(2)種方法執(zhí)行效率相同 編譯系統(tǒng)是將ai轉換為*(a+i)處理的,即先計算元素地址。因此用第(1)和第(2)種方法找數(shù)組元素費時較多。第(3)種方法比第(1)、第(2)種方法快 用指針變量直接指向元素,不必每次都重新計算地址,像p+這樣的自加操作是比較快的這種有規(guī)律地改變地址值(p+)能大大提高執(zhí)行效率用下標法比較直觀,能直接知道是第幾個元素。 用地址法或指針變量的方法不直觀,難以很快地判斷出當前處理的是哪一個元素。384. 指向字符串的指針字符串是存放在字符數(shù)組中的。引用一個字符串,可以用以下兩種方法。(1) 用字符數(shù)組存放一個字符串,可以通過數(shù)組
16、名和格式聲明“%s”輸出該字符串,也可以通過數(shù)組名和下標引用字符串中一個字符。(2) 用字符指針變量指向一個字符串常量,通過字符指針變量引用字符串常量。39直接用字符指針指向字符串字符串常量可對字符指針直接賦值這是把字符串常量的地址賦給字符指針不是把字符串的內(nèi)容賦給字符指針使用字符指針可以修改字符串的內(nèi)容注意防止越過原字符串常量的范圍注意字符串末尾應保留結束標志040字符串(String)與字符數(shù)組、字符指針字符串一串以0結尾的字符在C語言中被看作字符串用雙引號括起的一串字符是字符串常量,C語言自動為其添加0終結符C語言并沒有為字符串提供任何專門的表示法,完全使用字符數(shù)組和字符指針來處理字符數(shù)
17、組每個元素都是字符類型的數(shù)組char string100;字符指針指向字符類型的指針char* p;41字符指針變量與字符數(shù)組的區(qū)別定義方法不同 char str10; char *ptr;賦值方法和含義不同 char str10; str = ”china”; strcpy(str,”china”); char *ptr; ptr = ”china”;/*錯誤*/*正確*/*正確*/42字符指針變量與字符數(shù)組的區(qū)別在定義一個數(shù)組時,在編譯時即分配單元,有確定地址,而定義一個字符指針變量時,如未對它賦初值,則其所指數(shù)據(jù)是不定的,因而使用是危險的。例如,輸入字符串時 char str10; sc
18、anf(%s, str); char *a; scanf(%s, a); char *a; char str10; a = str; scanf(%s, a); /*錯誤*/*正確*/*正確*/43字符指針變量與字符數(shù)組的區(qū)別初始化含義不同 char *pstr = ”china”; 等價于 char *pstr; pstr = ”china”; char str14 = ”china”;不等價于 char str14; str = ”china”;字符指針是變量,而數(shù)組名是地址常量44字符數(shù)組和字符指針變量比較 (1)定義char astr=Hello, World!;char *pstr=Hello, World!;數(shù)組在定義時分配存放若干字符的空間指針定義時只分配存放一個地址的空間Hello, World!0 pstr:Hello, World!0astr:45字符數(shù)組和字符指針變量比較 (2)字符數(shù)組可以直接使用; 指針要先指向一個字符串后才能使用字符串常量只能對數(shù)組賦初值; 指針可以用字符串常量或字符數(shù)組任意賦值,但只是把字符串的
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025貴州遵義茅臺機場有限責任公司招聘12人筆試歷年參考題庫附帶答案詳解
- 江蘇省蘇州市蘇州工業(yè)園區(qū)2024-2025學年七年級下學期期末語文試題
- 大學生健康網(wǎng)絡構建路徑
- 動漫介紹課件圖片素材
- 2025年中國濟南市智慧燈桿市場全面調(diào)研及行業(yè)投資潛力預測報告
- 2025年中國生物轉盤行業(yè)市場發(fā)展監(jiān)測及投資戰(zhàn)略咨詢報告
- 2025年服務機器人項目立項申請報告
- 2022-2027年中國木材行業(yè)市場供需現(xiàn)狀及投資戰(zhàn)略研究報告
- 市管企業(yè)安全生產(chǎn)監(jiān)督管理暫行辦法
- 網(wǎng)絡安全等級保護工作會議
- 爆破三員培訓
- 浙江首考2025年1月普通高等學校招生全國統(tǒng)一考試 歷史 含答案
- 2025重慶電費收費標準
- 露天采石場應急預案
- 2025-2030中國水溶性肥料行業(yè)市場發(fā)展分析及前景趨勢與投資研究報告
- 復雜特征點云的高精度快速配準技術
- 2024年1月國家開放大學漢語言文學本科《古代詩歌散文專題》期末紙質考試試題及答案
- DBJ50T-098-2019 城市綠化養(yǎng)護質量標準
- 消防接警調(diào)度(一級)理論考試題庫(含答案)
- 教材教法基礎培訓
- DB3301T 0410-2023 城市河道生態(tài)清淤管理規(guī)范
評論
0/150
提交評論