版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、第九章指 針1內(nèi)存(Random Access Memory)計(jì)算機(jī)內(nèi)的存儲(chǔ)部件,所有指令和數(shù)據(jù)都保存在內(nèi)存。地址(Address) 一個(gè)無(wú)符號(hào)整數(shù)。內(nèi)存中的每個(gè)字節(jié)都有唯一的一個(gè)地址。地址按字節(jié)編號(hào),按類型分配空間。9.1 引言2如何讀寫內(nèi)存中的數(shù)據(jù)?通過變量的地址訪問變量所在的存儲(chǔ)單元。兩種尋址方式直接(尋址)訪問直接按變量地址來(lái)存取變量?jī)?nèi)容的訪問方式。間接(尋址)訪問通過指針變量來(lái)間接存取它所指向的變量的訪問方式。兩種訪問方式的比較 一種情況是,甲知道乙在何處,直接去找就是(即直接訪問)。另一種情況是,甲不知道乙在哪,但丙(指針變量)知道,此時(shí)甲可以這么做:先找丙,從丙處獲得乙的去向,然
2、后再找乙(即間接訪問)。3使用原則永遠(yuǎn)要清楚每個(gè)指針指向了哪里(位置)永遠(yuǎn)要清楚指針指向的位置是什么(內(nèi)容)49.2 指針變量的定義、引用和初始化指針 是一種數(shù)據(jù)類型;指針類型的數(shù)據(jù) 就是內(nèi)存的地址;指針常量 內(nèi)存地址;指針變量 具有指針類型的變量,專門存放地址 ;變量的指針 變量的地址20003 p i2000p是指針變量p是i的指針p指向了i59.2 指針變量的定義、引用和初始化指針變量的定義基類型 *變量名;基類型 *變量1, *變量2, 變量3, 變量4;int *p1, *p2, a1, a2;指針變量初始化p1 = &a1; p2 = &a2;指針變量可以動(dòng)態(tài)地保存不同內(nèi)存的地址,
3、從而使指針變量指向不同的變量;但是,某種類型的指針,只能保存其基類型變量的地址。6&與*運(yùn)算符int i,*p,a10;p = &i;p = a;p = &a0;p = &a5; int i, *p, a10;p = &i;*p = 0;p = a;*p = 0;p = &a0;*p = 0;p = &a5;*p = 0;* 取得指針指向地址的內(nèi)存& 取變量的地址對(duì) *p 操作就是對(duì)p所指向的變量操作;對(duì) *p 操作就是對(duì)p所指向的內(nèi)存內(nèi)容操作;7p = &a;*p就像普通的變量一樣使用,其值是p指向的內(nèi)存的內(nèi)容(在上例和a等價(jià),但尋址方式不同)p可以動(dòng)態(tài)(任意)地指向不同內(nèi)存,從而使*p代表
4、不同的變量89.2 指針變量的定義、引用和初始化指針的指向指針指向非其定義時(shí)指明的數(shù)據(jù)類型,將引起warning;void*類型的指針可以指向任意類型的變量指針在初始化時(shí)一般為int *p=NULL;NULL表示空指針,即無(wú)效指針如果指針指向一個(gè)非你控制的內(nèi)存空間,并對(duì)該空間進(jìn)行訪問(特別是寫入操作),將可能造成危險(xiǎn)(如何測(cè)試? ) 【exp9_danger.c】99.2 指針變量的聲明、引用和初始化指針變量與其它類型變量的對(duì)比共性在內(nèi)存中占據(jù)一定大小的存儲(chǔ)單元先定義,后使用特殊性它的內(nèi)容只能是地址,而不能是數(shù)據(jù)必須初始化后才能使用,否則指向不確定的存儲(chǔ)單元只能指向同一基類型的變量可參與的運(yùn)算
5、:加、減一個(gè)整數(shù),自增、自減、關(guān)系、賦值109.3 指針的運(yùn)算賦值運(yùn)算指針在使用前一定要賦值為指針變量賦的值必須是一個(gè)地址(初始化、變量的地址、指針變量的值 等)void main() int *p; scanf(%d,p); void main() int a,*p=&a; scanf(%d,p); 錯(cuò)?111)一般并不直接把一個(gè)數(shù)賦予指針變量,故一般不使用下面的賦值:int *p;p=1000;2)被賦值的指針變量前不能再加“*”說(shuō)明符,如寫為*p=&a 也是錯(cuò)誤的。 請(qǐng)嚴(yán)格區(qū)分指針變量的定義和引用的不同形式。定義: int a,*p=&a;引用: p=&a;129.3 指針的運(yùn)算【例9-
6、1】利用指針求三個(gè)數(shù)中的最大值最小值。#include void main()int a, b, c, *pmax, *pmin;printf(“input three numbers:n”);scanf(“%d%d%d”, &a, &b, &c);if(ab)pmax = &a;pmin = &b;elsepmax = &b;pmin = &a;if(c*pmax) pmax = &c;if(c q p q p = q指針不與非指針量進(jìn)行比較,但可與NULL進(jìn)行等或不等的關(guān)系運(yùn)算判斷p是否為空指針if(p = NULL)if(p != NULL)【例9-2】16main() int a, b
7、; a = 15; b = 8; Swap(&a, &b); printf(a=%d,b=%d,a,b);void Swap(int *x, int *y) int temp; temp = *x; *x = *y; *y = temp;main() int a, b; a = 15; b = 8; Swap(a, b); printf(a:%d,b:%d,a,b);void Swap(int x, int y) int temp; temp = x; x = y; y = temp;【ex9_9.c】【ex9_611.c】例:編寫函數(shù)實(shí)現(xiàn)兩數(shù)的互換結(jié)果有何不同?17swap函數(shù)編寫中容易出現(xiàn)
8、的問題(1/3)參數(shù)單向傳遞void Swap(int x, int y) int temp; temp = x; /*x,y為內(nèi)部變量*/ x = y; y = temp;18swap函數(shù)編寫中容易出現(xiàn)的問題(2/3)參數(shù)單向傳遞void Swap(int *p1, int *p2) int *p; p = p1; /* p1,p2為內(nèi)部變量 */ p1 = p2; p2 = p; 19swap函數(shù)編寫中容易出現(xiàn)的問題(3/3)指針p沒有確切地址void Swap(int *p1, int *p2) int *p; /*指針p未初始化*/ *p = *p1; *p1 = *p2; *p2 =
9、 *p; 209.4 指針與數(shù)組作為函數(shù)的參數(shù)指針既然是數(shù)據(jù)類型,自然可以做函數(shù)的參數(shù)和返回值的類型指針做參數(shù)的經(jīng)典例子,包括:兩數(shù)的互換,使用函數(shù)來(lái)實(shí)現(xiàn)交換的過程數(shù)組名是所分配內(nèi)存單元的首地址,可以作為函數(shù)的實(shí)參 。219.4.1 指針與一維數(shù)組 數(shù)組名是數(shù)組的首地址;(指針)它的值不能再被改變; (常量) 指針也可當(dāng)作數(shù)組名使用 前提:int *p, a10; p = a;數(shù)組元素的幾種等價(jià)引用形式ai*(a+i)pi*(p+i)229.4.1 指針與一維數(shù)組void main() int a10; int i; for (i=0; i10; i+) scanf(%d, &ai); for
10、 (i=0; i10; i+) printf(%d , ai); void main() int a10; int *p, i; for (p=a; p(a+10); p+) scanf(%d, p); for (p=a; p(a+10); p+) printf(%d , *p); 方法1:下標(biāo)法方法2:指針法例:輸入輸出數(shù)組的全部元素239.4.2 指針與二維數(shù)組C語(yǔ)言將二維數(shù)組看作一維數(shù)組,其每個(gè)元素又是一個(gè)一維數(shù)組 a00 a0a01a02a10 a1 a11a12 a int a23;a &a0a+1 &a1a0 &a00a0+1 &a01a0+2 &a02a1 &a10a1+1 &a
11、11a1+2 &a12249.4.2 指針與二維數(shù)組int a34; a00 a01 a02 a03 a0 a0+1 a0+2 a0+3a0a0a1a2a+0 &a0a+1 &a1a+2 &a2a a10 a11 a12 a13 a1 a1+1 a1+2 a1+3a1 a20 a21 a22 a23 a2 a2+1 a2+2 a2+3a2259.4.2 指針與二維數(shù)組a&a0 代表二維數(shù)組的首地址,第0行的地址a+i&ai 代表第i行的地址*(a+i)ai &ai0 代表第i行第0列的地址*(a+i)+jai+j &aij &(*(a+i)j代表第i行第j列的地址*(*(a+i)+j)aij
12、*(ai + j) (*(a+i)j代表第i行第j列的元素269.4.2 指針與二維數(shù)組元素aij的地址的幾種等價(jià)的引用方式&aij ai+j *(a+i)+j &(*(a+i)j元素aij的幾種等價(jià)的引用方式aij *(ai+j) *(*(a+i)+j) (*(a+i)j279.4.2 指針與二維數(shù)組二維數(shù)組的列指針:每個(gè)二維元素的地址。int a34;int *p;p = &a00;相對(duì)于數(shù)組起始地址的偏移量i*m+jfor (i=0; in; i+)for (j=0; jm; j+) printf(%d,*(p+i*m+j);二維數(shù)組的行指針:每個(gè)一維元素的地址。(&a0 &a1 &a2
13、)int a34;int (*q)4;q = &a0;for (i=0; in; i+)for (j=0; jm; j+) printf(%d,*(*(p+i)+j);a00a01a02a03a10a11a12a13a20a21a22a23pp+1p=a0; p=*a;q = a;qq+1q+2數(shù)組的指針加一,越過一個(gè)數(shù)組。*(*(q+i) + j)*(p+i*m + j)aij289.6.1 指針數(shù)組元素均為指針類型數(shù)據(jù)的數(shù)組,稱為指針數(shù)組 。定義形式為: 類型關(guān)鍵字 *數(shù)組名數(shù)組長(zhǎng)度;例如: int a, b, c, d, e; int *p5; p0=&a; p1=&b; p2=&c;
14、p3=&d; p4=&e; 【例9-17】299.6.2 指向指針的指針 如果指針變量中保存的是另一個(gè)指針變量的地址,這樣的指針變量就稱為指向指針的指針定義形式: 類型關(guān)鍵字 *變量名; int i;int *p=&i;int *q=&p; *p i*q p *q *(*q) *p i 【例9-18】2008q200030002008p53000i309.4.2 指針與二維數(shù)組#define CLASS 3#define STUD 4void main() int scoreCLASSSTUD, i, j, maxScore, row, col;for(i = 0; iCLASS; i+) p
15、rintf(Please enter scores of class %d:n, i+1); for(j = 0; jSTUD; j+) scanf(%d, &scoreij); /*輸入成績(jī)*/maxScore = FindMax(*score, CLASS, STUD, &row, &col); printf(maxScore = %d, class = %d, number = %dn, maxScore, row+1, col+1); 例 :求最高分及其所在班級(jí)和學(xué)號(hào)319.4.2 指針與二維數(shù)組int FindMax(int *p, int m, int n, int *pRow,
16、int *pCol) int i, j, max;max = p0; *pRow = 0; *pCol = 0; for (i=0; im; i+)for (j = 0; j max) max = pi*n+j; *pRow = i; *pCol = j; return (max); 例 :求最高分及其所在班級(jí)和學(xué)號(hào)329.4.3 指針作為函數(shù)的參數(shù)任意給定某年某月某日,打印出它是這一年的第幾天 已知某一年的第幾天,計(jì)算它是該年的第幾月第幾日 int dayTab213 = 0,31,28,31,30,31,30,31,31,30,31,30,31, 0,31,29,31,30,31,30,3
17、1,31,30,31,30,31; 例:日期轉(zhuǎn)換問題 33計(jì)算某年某月某日是這一年的第幾天int DayofYear(int year, int month, int day) int i, leap; leap = (year % 4 = 0) & (year % 100 != 0) | (year % 400 = 0); for (i=1; idayTableapi; i+) yearDay = yearDay - dayTableapi; *pMonth = i; *pDay = yearDay; 35本章小結(jié) 指針的概念指針是一種特殊的數(shù)據(jù)類型永遠(yuǎn)要清楚每個(gè)指針指向了什么位置 永遠(yuǎn)要清
18、楚每個(gè)指針指向的位置中的內(nèi)容是什么 指針與數(shù)組之間的關(guān)系掌握二維數(shù)組在內(nèi)存中的存放方式,是理解二維數(shù)組的行指針和列指針的關(guān)鍵指針的應(yīng)用做函數(shù)參數(shù),傳地址調(diào)用排序算法36作業(yè)1、輸入3個(gè)數(shù),用指針編程實(shí)現(xiàn)按從大到小輸出。2、用指針和數(shù)組編程實(shí)現(xiàn)對(duì)一個(gè)4*3的矩陣實(shí)現(xiàn)轉(zhuǎn)置操作。3、從鍵盤輸入10個(gè)整數(shù),用指針和函數(shù)編程實(shí)現(xiàn)計(jì)算最大值和最小值,并返回其在數(shù)組中的位置。4、用指向指針的指針的方法實(shí)現(xiàn)對(duì)10個(gè)數(shù)排序并輸出。要求將排序功能用一個(gè)單獨(dú)的函數(shù)來(lái)實(shí)現(xiàn)。37用起泡法對(duì)10個(gè)數(shù)排序【ex9_9.c】第1次, a1和a2比較9 8 5 4 2 0 6 1 3 7 8 9 5 4 2 0 6 1 3 7 8 5 9 4 2 0 6 1 3 7 8
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 中國(guó)的疆域與人口復(fù)習(xí)25張
- 人教版八年級(jí)音下冊(cè)樂期末必背復(fù)習(xí)知識(shí)點(diǎn)
- 滬科版初中九年級(jí)物理能源開發(fā)和利用
- 高中語(yǔ)文散文部分第2單元捉不住的鼬鼠-時(shí)間片論美課件新人教版選修中國(guó)現(xiàn)代詩(shī)歌散文欣賞
- 2011-2012年LOW-E玻璃市場(chǎng)預(yù)測(cè)及市場(chǎng)調(diào)查分析報(bào)告
- 2024至2030年中國(guó)孕婦裝數(shù)據(jù)監(jiān)測(cè)研究報(bào)告
- 2024至2030年中國(guó)喇叭水仙花數(shù)據(jù)監(jiān)測(cè)研究報(bào)告
- 2024至2030年中國(guó)臥式聚乙烯貯槽數(shù)據(jù)監(jiān)測(cè)研究報(bào)告
- 2024至2030年中國(guó)分立式濾波器數(shù)據(jù)監(jiān)測(cè)研究報(bào)告
- 2024至2030年中國(guó)兒童休閑運(yùn)動(dòng)服數(shù)據(jù)監(jiān)測(cè)研究報(bào)告
- 校園廣場(chǎng)景觀設(shè)計(jì)教學(xué)課件
- 第十三講 全面貫徹落實(shí)總體國(guó)家安全觀PPT習(xí)概論2023優(yōu)化版教學(xué)課件
- 2023年煤礦企業(yè)安全生產(chǎn)管理人員安全資格考試題庫(kù)及答案
- 腦出血診療指南診療規(guī)范
- 穴位敷貼療法
- 兩棲動(dòng)物的生殖和發(fā)育說(shuō)課課件
- 上海市房屋租賃合同
- 新媒體運(yùn)營(yíng)PPT完整全套教學(xué)課件
- 五年級(jí)【美術(shù)(人美版)】動(dòng)態(tài)之美(一)-課件
- 幼兒園小班美術(shù)教案模板匯編七篇
- 廣東省學(xué)校安全條例競(jìng)賽模擬題(第二套)附有答案
評(píng)論
0/150
提交評(píng)論