內(nèi)存單元的地址-指針程序設計(1)_第1頁
內(nèi)存單元的地址-指針程序設計(1)_第2頁
內(nèi)存單元的地址-指針程序設計(1)_第3頁
內(nèi)存單元的地址-指針程序設計(1)_第4頁
內(nèi)存單元的地址-指針程序設計(1)_第5頁
已閱讀5頁,還剩59頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

1、高級語言程序設計高級語言程序設計第第7章章 內(nèi)存單元的地址內(nèi)存單元的地址指針程序設計(指針程序設計(1)回顧跟回顧跟內(nèi)存單元地址內(nèi)存單元地址相關(guān)的問題相關(guān)的問題l地址是內(nèi)存單元的編號地址是內(nèi)存單元的編號: 32個二進制位編址個二進制位編址,可以用可以用&運算獲得變量的地址運算獲得變量的地址lint a=10;lprintf(“%x %pn”, &a);lscanf(“%d”, &a);l數(shù)組名數(shù)組名首地址首地址l int b10=0, int c32=0;l printf(“%p %pn”, b, &b0); l printf(“%p %p %pn”, c, c

2、0,&c00); 本章要解決的問題:本章要解決的問題:l定義一個可以交換兩個變量的值的函數(shù)定義一個可以交換兩個變量的值的函數(shù)l學生成績批量處理的指針版學生成績批量處理的指針版l學號學號/姓名字符串處理的指針版姓名字符串處理的指針版l一個簡單的文本編輯器一個簡單的文本編輯器l批量數(shù)據(jù)批量數(shù)據(jù)規(guī)模未知規(guī)模未知的問題求解的問題求解學習目標學習目標l理解指針的概念和意義理解指針的概念和意義l掌握指針的定義和使用方法掌握指針的定義和使用方法l熟悉指針作為函數(shù)參數(shù)的意義和具體方法熟悉指針作為函數(shù)參數(shù)的意義和具體方法l清楚指針與數(shù)組的關(guān)系、指針與字符串的清楚指針與數(shù)組的關(guān)系、指針與字符串的關(guān)系關(guān)系l

3、了解如何定義行指針、指針數(shù)組、指針的了解如何定義行指針、指針數(shù)組、指針的指針指針l了解如何建立動態(tài)數(shù)組和指向函數(shù)的指針了解如何建立動態(tài)數(shù)組和指向函數(shù)的指針問題問題1:定義交換兩個變量的值的函:定義交換兩個變量的值的函數(shù)數(shù)l問題描述:任意給定兩個變量并賦值,試問題描述:任意給定兩個變量并賦值,試定義一個函數(shù),它可以交換這兩個變量的定義一個函數(shù),它可以交換這兩個變量的值。值。分析:分析:l假設兩個變量是整型的假設兩個變量是整型的l如如int a = 5, b = 9;l定義一個函數(shù)定義一個函數(shù)swap, 調(diào)用調(diào)用swap之后,之后,a的的值就是值就是9,b的值就是的值就是5,swap函數(shù)該怎么函數(shù)

4、該怎么定義呢?定義呢?l也就是它的原型應該是什么樣子的?應不也就是它的原型應該是什么樣子的?應不應該有返回值類型?有沒有參數(shù)?應該有返回值類型?有沒有參數(shù)?l顯然不應該有返回值類型。顯然不應該有返回值類型。如果沒有參數(shù)如果沒有參數(shù)l函數(shù)的原型是函數(shù)的原型是 void swap(void);可以嗎可以嗎?lvoid swap(void)ll 在這里能交換主函數(shù)中在這里能交換主函數(shù)中a和和b的值嗎?的值嗎?l如果有參數(shù)如果有參數(shù)l函數(shù)的原型是函數(shù)的原型是 void swap(int x,int y); ? lvoid swap(int x,int y)ll 在這里能交換主函數(shù)中在這里能交換主函數(shù)中

5、a和和b的值嗎?的值嗎?l主調(diào)函數(shù)主調(diào)函數(shù)被調(diào)函數(shù)被調(diào)函數(shù)55ab實實 參參形形 參參99xya ab xy55temp9怎么樣才能使形參和實參之間建立起怎么樣才能使形參和實參之間建立起更加緊密的連系呢?更加緊密的連系呢?l我們希望函數(shù)操作我們希望函數(shù)操作形參形參時就如同操作時就如同操作實參實參一樣,一樣,如果能這樣的話,那么在如果能這樣的話,那么在swap函數(shù)中如果交換函數(shù)中如果交換了了x和和y的值,自然也就交換了的值,自然也就交換了a和和b的值的值 l對于簡單變量來說,能不能也把它們的地址傳對于簡單變量來說,能不能也把它們的地址傳給函數(shù),如果能的話,函數(shù)的參數(shù)該怎樣表達給函數(shù),如果能的話,

6、函數(shù)的參數(shù)該怎樣表達呢?看上去應該是呢?看上去應該是lvoid swap(可以接受可以接受整型變量整型變量a的地址的地址的形參的形參1,可以接受可以接受整型變量整型變量b的地址的地址的形參的形參2);主調(diào)函數(shù)主調(diào)函數(shù)被調(diào)函數(shù)被調(diào)函數(shù)&a&a實實 參參形形 參參&b&bxyabxy5temp5ab995因此我們現(xiàn)在的任務因此我們現(xiàn)在的任務1l1) 如何定義可以接受某種類型變量的地如何定義可以接受某種類型變量的地址的量。址的量。l swap(int ?x,int ?y) . l在在 ?處應該用什么說明一下,處應該用什么說明一下,x和和y就可就可以接收某個變量的地址了

7、呢?實際上這是以接收某個變量的地址了呢?實際上這是一種特別的變量,它專門存放內(nèi)存空間的一種特別的變量,它專門存放內(nèi)存空間的地址,這就是本章研究的主題:地址,這就是本章研究的主題:指針指針(指指針變量針變量)。任務任務2:l2) 如何通過存放變量地址的如何通過存放變量地址的特殊變量特殊變量指針(變量),指針(變量),間接訪問它所指向的那個間接訪問它所指向的那個變量。變量。l temp = ?x; l ? x = ? y; l ? y = temp ;數(shù)據(jù)的訪問方式數(shù)據(jù)的訪問方式l 通過地址通過地址間接訪問間接訪問與與通過變量名通過變量名直接訪直接訪問問變量是截然不同的變量是截然不同的 哪種方式更

8、好呢?哪種方式更好呢?l如果說通過存儲單元的名字訪問數(shù)據(jù)是如果說通過存儲單元的名字訪問數(shù)據(jù)是比較高級比較高級的操作的操作(傻瓜型的,不管你存儲在哪里,是在邏(傻瓜型的,不管你存儲在哪里,是在邏輯上通過輯上通過名字直接對數(shù)據(jù)進行讀寫名字直接對數(shù)據(jù)進行讀寫,這是高級程這是高級程序設計語音的特點),序設計語音的特點),l那么通過存儲單元的地址訪問數(shù)據(jù)那么通過存儲單元的地址訪問數(shù)據(jù)就是比較低級就是比較低級的操作,的操作,它是從比較底層上面操縱數(shù)據(jù)的,先找它是從比較底層上面操縱數(shù)據(jù)的,先找到變量的物理存儲地址再到變量的物理存儲地址再去間接的對數(shù)據(jù)進行訪去間接的對數(shù)據(jù)進行訪問。問。l高級的訪問方式比較方便

9、,低級的地址操作更加高級的訪問方式比較方便,低級的地址操作更加靈活自如。靈活自如。l任何存儲在內(nèi)存中的數(shù)據(jù)都可以通過存儲它們的任何存儲在內(nèi)存中的數(shù)據(jù)都可以通過存儲它們的變量名直接訪問變量名直接訪問,或通過它們的,或通過它們的存儲地址間接訪存儲地址間接訪問。問。算法設計算法設計lvoid swap(地址作為函數(shù)的形參地址作為函數(shù)的形參1,2)ll 通過地址間接操作實參數(shù)據(jù),進行交換通過地址間接操作實參數(shù)據(jù),進行交換l什么是指針什么是指針l 一個變量的地址就是該變量的一個變量的地址就是該變量的指針指針(Pointer)。l例如:例如: int a; a的地址的地址&a就是就是指向變量指向變

10、量a的指針的指針l注意,注意,&a實際上是變量實際上是變量a的的4個連續(xù)字節(jié)內(nèi)存?zhèn)€連續(xù)字節(jié)內(nèi)存的首地址的首地址,我們還可以說,我們還可以說指針指針&a指向了指向了a。簡單來說指針就是地址,但一定要相對于某簡單來說指針就是地址,但一定要相對于某個變量或某塊連續(xù)內(nèi)存單元而言。個變量或某塊連續(xù)內(nèi)存單元而言。 l指針(常量)作為一種特別的數(shù)據(jù),也可指針(常量)作為一種特別的數(shù)據(jù),也可以存放到以存放到指針變量指針變量中,中,l如果定義了一個變量如果定義了一個變量x是存放是存放a的地址的指的地址的指針變量,針變量,就可以寫成就可以寫成 x = &a; 這時可以稱這時可以稱x指向了指

11、向了a; 指針變量的定義(聲明)指針變量的定義(聲明)l指針變量的定義形式如下:指針變量的定義形式如下: 類型說明符類型說明符 *指針變量名指針變量名;l例如例如 int *aPtr; /注意命名方法注意命名方法 double *dPtr; 指針變量指針變量aPtr, dPtr指向誰了嗎?指向誰了嗎?指針變量的初始化指針變量的初始化l要想讓它們具體指向某個變量必須對其要想讓它們具體指向某個變量必須對其初初始化始化或者或者定義之后用賦值語句賦值定義之后用賦值語句賦值,即,即l 設設 int a; double d; int *aPtr = &a; double *dPtr = &

12、d;l或者定義之后再或者定義之后再 aPtr = &a; dPtr = &d;l指針就是一個地址,是某種類型的內(nèi)存單指針就是一個地址,是某種類型的內(nèi)存單元的首地址。元的首地址。指針是與數(shù)據(jù)類型密切相關(guān)指針是與數(shù)據(jù)類型密切相關(guān)的。的。l aPtr = &d; ?l dPtr = &a; ?l某一類型的內(nèi)存單元一旦申請或定義某一類型的內(nèi)存單元一旦申請或定義,其其首地址是不會變化的首地址是不會變化的,因此可以稱,因此可以稱首地址首地址是是常指針或指針常量常指針或指針常量。7.1.1.1 指針變量的引用l有了指向某個變量的指針變量之后,就可有了指向某個變量的指針變量之后

13、,就可以通過指針變量以通過指針變量間接引用間接引用變量了,例如,變量了,例如,通過指針變量通過指針變量x間接引用間接引用a再賦值給臨時變再賦值給臨時變量量templtemp = ?x;l使用一個使用一個*號稱作號稱作間接引用運算符間接引用運算符,放在,放在一個指針變量的前面,即一個指針變量的前面,即l temp = *x; /把指針把指針x指向的變量的值賦指向的變量的值賦給給temp幾點說明幾點說明:l(1) *有三種含義有三種含義 在在指針定義指針定義中中 * 稱為稱為指針類型說明符指針類型說明符,它,它不是不是乘法乘法,也不是,也不是間接引用運算符間接引用運算符,*號在號在不同場合有不同的

14、含義;不同場合有不同的含義; l(2)通過指針變量間接引用某個變量,在使通過指針變量間接引用某個變量,在使用之前該指針變量必須真正指向某個變量;用之前該指針變量必須真正指向某個變量;不然將導致致命性錯誤。不然將導致致命性錯誤。l(3) 指針變量可以初始化為一個空指針指針變量可以初始化為一個空指針NULL或或0;l(4) 指針變量是有類型的,它必須指向同類指針變量是有類型的,它必須指向同類型的變量型的變量l l(5) 指針變量可以指向一個同類型的變量,指針變量可以指向一個同類型的變量,也可以指向其它同類型的變量,因為指針也可以指向其它同類型的變量,因為指針變量本身是變量。變量本身是變量。l(6)

15、聲明多個同類型的指針變量,聲明多個同類型的指針變量,不能省不能省略指針類型說明符略指針類型說明符*l(7)指針變量的命名通常從字面能看出它指針變量的命名通常從字面能看出它是指針變量是指針變量,如:如:l int *aPtr = &a ;l(8)指針的間接引用運算指針的間接引用運算*與變量的取地址與變量的取地址運算運算&是互逆的,是互逆的,l * & aPtr和和 & * aPtr 的結(jié)果都是的結(jié)果都是aPtr。l(9) void*類型的指針可以指向任意類型的類型的指針可以指向任意類型的變量。變量。算法實現(xiàn):指針作為函數(shù)參數(shù)注意實參注意實參l swap( &

16、;a, &b);l 指針作為函數(shù)的參數(shù)調(diào)用過程示意圖指針作為函數(shù)的參數(shù)調(diào)用過程示意圖 l 圖圖7.4 用指針變量作函數(shù)參數(shù)實現(xiàn)兩數(shù)互換函數(shù)的示意圖用指針變量作函數(shù)參數(shù)實現(xiàn)兩數(shù)互換函數(shù)的示意圖158815&a&b&a&b15(a) 調(diào)用調(diào)用swap函數(shù)函數(shù) (b) 執(zhí)行執(zhí)行swap函函數(shù)數(shù) a a b b *x *x *y *y y y x x &a &b main函數(shù)函數(shù) swap函數(shù)函數(shù) temptemp實參也可以用同類型的指針變量實參也可以用同類型的指針變量l如如 int *aPtr = &a, *bPtr = &b;

17、l swap( aPtr, bPtr);思考題思考題1 下面的實現(xiàn)正確嗎?下面的實現(xiàn)正確嗎?lvoid swap(int *p1, int *p2)l l int *p; /p1, p2是局部變量是局部變量l p = p1; l p1 = p2;l p2 = p;l l l思考題思考題2:下面的實現(xiàn)正確嗎?:下面的實現(xiàn)正確嗎?lvoid swap(int *p1, int *p2)l l int *p; /注意指針注意指針p未初始化未初始化l *p = *p1; /注意注意p 和和 *p的不同的不同l *p1 = *p2;l *p2 = *p;l l作業(yè)作業(yè)l 定義一個函數(shù),求一組數(shù)據(jù)的最大值

18、和定義一個函數(shù),求一組數(shù)據(jù)的最大值和最小值最小值問題問題2 批量數(shù)據(jù)處理的指針版批量數(shù)據(jù)處理的指針版l問題描述:用指針作為函數(shù)的參數(shù),實現(xiàn)問題描述:用指針作為函數(shù)的參數(shù),實現(xiàn)輸入學生學號和成績函數(shù)輸入學生學號和成績函數(shù)input,按成績,按成績進行排序(升序或降序)函數(shù)進行排序(升序或降序)函數(shù)sort,及排,及排序的結(jié)果輸出到屏幕上序的結(jié)果輸出到屏幕上print。分析分析l回顧一下數(shù)組作為函數(shù)的參數(shù)的實現(xiàn)方法回顧一下數(shù)組作為函數(shù)的參數(shù)的實現(xiàn)方法和特點和特點l數(shù)組參數(shù)為數(shù)組參數(shù)為數(shù)組名數(shù)組名首地址首地址l數(shù)組名訪問每個元素的方法是借助數(shù)組名訪問每個元素的方法是借助下標下標l數(shù)組作為函數(shù)參數(shù)可以

19、數(shù)組作為函數(shù)參數(shù)可以“帶回帶回”批量結(jié)果批量結(jié)果指針作為函數(shù)的參數(shù)要解決指針作為函數(shù)的參數(shù)要解決l指針能夠指向一個簡單變量,可以指針能夠指向一個簡單變量,可以指向一指向一個數(shù)組嗎?個數(shù)組嗎?l指針與數(shù)組的關(guān)系指針與數(shù)組的關(guān)系,如何,如何通過指針訪問它通過指針訪問它所指向的一組數(shù)據(jù)所指向的一組數(shù)據(jù)l指針作為函數(shù)的參數(shù)指針作為函數(shù)的參數(shù)能帶回批量結(jié)果嗎能帶回批量結(jié)果嗎?l數(shù)組名實際上是一個數(shù)組名實際上是一個常指針常指針。l指針變量可以存放任意同類型的指針,所指針變量可以存放任意同類型的指針,所以以指針可以指向數(shù)組指針可以指向數(shù)組指向數(shù)組的指針指向數(shù)組的指針lint a=1,3,3,5,6,7,7,

20、9,8,2;lint *pa = a; lchar str =“Hello!”;lchar *ps = str;如何用指針訪問數(shù)組的元素如何用指針訪問數(shù)組的元素?l一種方法是指針作相對的一種方法是指針作相對的偏移偏移,即指針指,即指針指向首地址保持不變,只是給它一個向首地址保持不變,只是給它一個相對位相對位置偏移,置偏移,l偏移的單位是什么呢?偏移的單位是什么呢? l設設int a=1,3,3,5,6,7,7,9,8,2; int *pa = a; pa + 1意味著什么?意味著什么? 假設假設a的首地址為的首地址為1000,則指針,則指針pa = a = 1000, pa + 1=?l另一種

21、方法另一種方法是真的移動指針,指針發(fā)生了是真的移動指針,指針發(fā)生了位移。位移。l指針指針pa開始指向第一個元素即開始指向第一個元素即pa=a=&a0lpa+之后,之后,pa=&a1,l再一次再一次pa+,pa=&a2等等等等 如何用指向數(shù)組的指針作為函數(shù)的參數(shù)如何用指向數(shù)組的指針作為函數(shù)的參數(shù)lvoid func( int *p); 或者或者 void func( int *); l int main()ll int a10=0; int *p = a;l /實參是實參是數(shù)組名數(shù)組名或或指向數(shù)組的指針指向數(shù)組的指針l func(a); 或者或者 func(p); l l

22、 void func( int *p)l l 用用p訪問訪問p所指向的數(shù)組所指向的數(shù)組 l 算法設計:算法設計:同上一章的數(shù)組作為函數(shù)同上一章的數(shù)組作為函數(shù)的參數(shù)版的參數(shù)版l 0 確定人數(shù)確定人數(shù)SIZE, 定義學號和成績數(shù)組并初始化定義學號和成績數(shù)組并初始化l 1 原始數(shù)據(jù)輸入原始數(shù)據(jù)輸入l l 2 用交換法排序用交換法排序l 3 輸出排序結(jié)果輸出排序結(jié)果算法實現(xiàn)(主函數(shù))算法實現(xiàn)(主函數(shù))lvoid input (int*grade,int*num,int size);lvoid exchangeSort(int *grade, int*num, int size);lvoid print

23、(int* grade, int* num, int);lint main(void)ll int gradeSIZE,numSIZE;l int *pGrade = grade;l int *pNum = num;l input( pGrade, pNum, SIZE);l exchangeSort(pGrade, pNum, SIZE);l print(pGrade, pNum, SIZE);l return 0;l輸入模塊輸入模塊(指針偏移方法指針偏移方法)lvoid input (int *grade, int *num, int size)ll int i;l for(i=0; is

24、ize; i+)l scanf(%d %d, num+i, grade+i);l輸入模塊輸入模塊(指針位移方法指針位移方法)lvoid input (int *grade, int *num, int size)ll int i;l int *p = num, *q = grade;l for(i=0; isize; i+)l scanf(%d %d, p+, q+);ll或或 /for( ; pnum+size; p+, q+)l /scanf(“%d %d”, p, q);交換排序模塊(交換排序模塊(指針偏移法指針偏移法)lvoid exchangeSort(int *grade, int

25、 *num, int size)ll int i, j;l for(i=0; isize-1; i+)l for(j=i+1; j *( grade+i ) )l swap( grade+j , grade+i );l swap( num+j, num+i );l l l l交換排序模塊(交換排序模塊(指針位移法指針位移法)lvoid exchangeSort(int *grade, int *num, int size)ll int *p,*q,*s,*t;l for( p=grade, q=num; p grade+size-1; p+, q+)l for( s=p+1,t=q+1; s

26、*p )l swap( s, p ); /q 和和 p同步同步l swap( t, q ); /s 和和 t 同步同步l l l l輸出函數(shù)的實現(xiàn)輸出函數(shù)的實現(xiàn)(指針偏移法指針偏移法)lvoid print(int *grade, const int *num, int size)ll int i;l for( i=0;isize; i+)l printf(%d : %dn, *(num+i) , l *( grade+i ) );l輸出函數(shù)的實現(xiàn)輸出函數(shù)的實現(xiàn)(指針位移法指針位移法)lvoid print(int *grade, int *num, int size)ll int *p,*q

27、;l for( p = grade, q = num; p (grade + size); l p+, q+ )l printf(%d : %dn, *q, *p);l指向數(shù)組的指針指向數(shù)組的指針作為作為形參形參實參實參可以直接用可以直接用數(shù)組名數(shù)組名/也可以用也可以用指針指針l input( pGrade, pNum, SIZE);l exchangeSort(pGrade, pNum, SIZE);l print(pGrade, pNum, SIZE);l等價于等價于l input( grade, num, SIZE);l exchangeSort(grade, num, SIZE);l print(grade, num, SIZE);數(shù)組或指針做為函數(shù)的參數(shù)數(shù)組或指針做為函數(shù)的參數(shù) 實參與形參有四種形式實參與形參有四種形式l實參用數(shù)組名,形參用指針變量。實參用數(shù)組名,形參用指針變量。l實參用指針變量,形參用指針變量實參用指針變量,形參用指針變量。l實參用數(shù)組名,實參用數(shù)組名,形參用數(shù)組名形參用數(shù)組名。

溫馨提示

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

評論

0/150

提交評論