C語言程序設(shè)計任務(wù)驅(qū)動式 課件 第八單元 指針_第1頁
C語言程序設(shè)計任務(wù)驅(qū)動式 課件 第八單元 指針_第2頁
C語言程序設(shè)計任務(wù)驅(qū)動式 課件 第八單元 指針_第3頁
C語言程序設(shè)計任務(wù)驅(qū)動式 課件 第八單元 指針_第4頁
C語言程序設(shè)計任務(wù)驅(qū)動式 課件 第八單元 指針_第5頁
已閱讀5頁,還剩36頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

8單元指針C語言程序設(shè)計任務(wù)驅(qū)動式前面曾經(jīng)提出如果定義一個變量,就會在內(nèi)存開辟空間存放變量的數(shù)據(jù)。在程序中引用變量名來使用這個內(nèi)存空間,而編譯時計算機則使用內(nèi)存的地址來引用它。如果定義了一個整型變量intsum=0;,內(nèi)存就開辟了一個整型變量的空間存放sum的值。那么每一個變量都有一個對應(yīng)的內(nèi)存地址,還可以定義一個存放內(nèi)存地址的變量,就是指針,存儲在指針中的地址是另一個變量的首地址。可以定義指針變量p,存放變量sum的首地址,變量sum是一個值為0的整型變量。存儲在p中的地址是sum的第一字節(jié)的地址。指針是C語言中最強大的工具之一,是精華所在,也是最容易讓人困惑的主題。只有在正確理解指針概念的基礎(chǔ)上,才能熟練運用指針。問題引入QuestionIntroduction目錄導(dǎo)航任務(wù)1交換兩個變量的值—指針概述任務(wù)23個數(shù)排序—指針變量作為函數(shù)參數(shù)思考與訓(xùn)練單元小結(jié)任務(wù)3字母放大鏡—通過指針訪問數(shù)組任務(wù)1交換兩個變量的值—指針概述通過編程解決兩個變量數(shù)據(jù)交換的問題,這里使用指針變量指向兩個整型變量,并完成交換。工作任務(wù)任務(wù)1交換兩個變量的值—指針概述思路指導(dǎo)定義變量:定義兩個整型變量inta,b。定義指針:定義兩個指針變量int*p1,*p2。輸入:a、b的值。交換:將兩個指針指向兩個整型變量,運用指針完成a與b值的交換。相關(guān)知識(一)指針變量的定義格式:基類型*指針變量名例如:int*p1;(定義p1為指向整型變量的指針變量)char*p2;(定義p2為指向字符型變量的指針變量)float*p3;(定義p3為指向?qū)嵭妥兞康闹羔樧兞浚﹊nt、char、float分別稱為指針變量p1、p2、p3的“基類型”,“基類型”意為指針變量所指變量的類型,不是指針變量的類型。(二)指針變量賦值1.通過取地址運算符(&)獲得地址值單目運算符(&)用來求出運算對象的地址,利用它可以把一個變量的地址賦給指針變量。例如:inta=5,*p,*q;p=&a;scanf("%d",&a);和scanf("%d",p);是等價的。可以通過賦值運算,把一個指針變量中的地址值賦給另一個指針變量,從而使這兩個指針變量指向同一地址。例如,若有上面的定義,則語句q=p;使指針變量q中也存放了變量a的地址,也就是說,指針變量p和q都指向了整型變量a。注意:賦值號兩邊指針變量的基類型必須相同。2.通過指針變量獲得地址值(二)指針變量賦值3.給指針變量賦“空”值格式:p=NULL;NULL是在stdio.h頭文件中定義的預(yù)定義符,因此在使用NULL時,應(yīng)該在程序的前面出現(xiàn)預(yù)定義行:#include"stdio.h"。(三)指針變量的引用注意,&、*運算符是用在指針變量上的,而不是“位與”和“乘”運算符。&運算符(取地址運算符)表示取變量的地址;*運算符(指針運算符、間接訪問運算符)表示訪問指針變量指向的變量的值。任務(wù)1交換兩個變量的值—指針概述任務(wù)實施1.流程圖程序流程圖如圖所示。2.程序代碼#include"stdio.h"Main(){

inta,b,*p1,*p2,p;printf("請輸入a和b:\n");scanf("%d,%d",&a,&b);p1=&a;p2=&b;if(a<b)//用指針交換a,b{p=*p1;*p1=*p2;*p2=p;}printf("\na=%d,b=%d\n",a,b);printf("指針1max=%d,指針2min=%d\n",*p1,*p2);

}程序運行結(jié)果如圖8-2所示。圖8-2任務(wù)1運行結(jié)果任務(wù)1交換兩個變量的值—指針概述特別提示(1)C語言變量“先定義后使用”,指針變量也不例外,為了表示指針變量是存放地址的特殊變量,定義變量時要在變量名前加“*”號。(2)指針變量的基類型(簡稱:指針變量類型)為指針變量所指向數(shù)據(jù)的類型。我們知道,整型數(shù)據(jù)占用2字節(jié),浮點數(shù)據(jù)占用4字節(jié),字符數(shù)據(jù)占用1字節(jié)。指針變量類型使得指針變量的某些操作具有特殊的含義。比如,pt1++;不是將地址值增1,而是表示將地址值+2(指向后面一個整數(shù))。(3)指針變量的基類型實際上是指針變量所指向空間存儲的數(shù)據(jù)的類型。(4)本程序中定義語句中的*p1和*p2是定義兩個指針變量,而交換和輸出語句中出現(xiàn)的*p1和*p2是指針變量指向的變量的值,即a和b。目錄導(dǎo)航任務(wù)1交換兩個變量的值—指針概述任務(wù)23個數(shù)排序—指針變量作為函數(shù)參數(shù)思考與訓(xùn)練單元小結(jié)任務(wù)3字母放大鏡—通過指針訪問數(shù)組任務(wù)23個數(shù)排序—指針變量作為函數(shù)參數(shù)下面編寫一個程序,將3個數(shù)由小到大排序。可以把兩個數(shù)交換編寫成自定義函數(shù),如果用變量名作為函數(shù)參數(shù),參數(shù)傳遞是單向的,形參數(shù)據(jù)交換了但實參仍然不變。所以本任務(wù)考慮應(yīng)用指針作為函數(shù)參數(shù)。工作任務(wù)任務(wù)23個數(shù)排序—指針變量作為函數(shù)參數(shù)思路指導(dǎo)自定義函數(shù):swap(*pi,*pj),應(yīng)用指針作為函數(shù)參數(shù)完成數(shù)據(jù)交換。主函數(shù):輸入3個整數(shù)inta,b,c。條件判斷:3個數(shù)中的a和b比較,如果a比b大就交換;b和c比較,如果b比c大就交換;a和c比較,如果a比c大就交換。交換:調(diào)用自定義函數(shù)swap。任務(wù)23個數(shù)排序—指針變量作為函數(shù)參數(shù)相關(guān)知識指針變量作為函數(shù)的參數(shù),格式為函數(shù)名(*指針變量)功能:用指針變量作為函數(shù)的參數(shù),將實參值傳遞給形參。注意:實參和形參都要是指針變量。任務(wù)23個數(shù)排序—指針變量作為函數(shù)參數(shù)任務(wù)實施1.流程圖程序流程圖如圖8-3所示。2.程序代碼voidswap(int*p1,int*p2){inttemp;temp=*p1;*p1=*p2;*p2=temp;//交換指針指向變量的值}main(){inta,b,c;int*pa,*pb,*pc;任務(wù)23個數(shù)排序—指針變量作為函數(shù)參數(shù)printf("請輸入a,b,c:\n");scanf("%d%d%d",&a,&b,&c);pa=&a;pb=&b;pc=&c;if(*pa>*pb)swap(pa,pb);//調(diào)用交換函數(shù)

if(*pb>*pc)swap(pb,pc);if(*pa>*pc)swap(pa,pc);printf("swaped:\n");printf("a=%d,b=%d,c=%d\n",*pa,*pb,*pc);}程序運行結(jié)果如圖8-4所示。圖8-4任務(wù)2運行結(jié)果任務(wù)23個數(shù)排序—指針變量作為函數(shù)參數(shù)特別提示被調(diào)用函數(shù)swap中通過參數(shù)傳遞獲得了實參指針變量指向的變量地址,此時形參指針變量p1、p2也已經(jīng)分別指向?qū)崊⒅羔樧兞克赶虻淖兞縜、b。也就是說,實參、形參指針變量指向共同的變量。在函數(shù)swap中,可通過形參指針交換形參指針變量p1、p2指向的變量的值。返回main()函數(shù)后,p1、p2仍然指向a、b。但是a、b的值已經(jīng)交換。目錄導(dǎo)航任務(wù)1交換兩個變量的值—指針概述任務(wù)23個數(shù)排序—指針變量作為函數(shù)參數(shù)思考與訓(xùn)練單元小結(jié)任務(wù)3字母放大鏡—通過指針訪問數(shù)組任務(wù)3字母放大鏡—通過指針訪問數(shù)組我們玩過字符放大游戲,利用Flash動畫可以制作字符串中每一個字符放大的效果。本任務(wù)是編寫C程序?qū)崿F(xiàn)一個小寫字符串中每個字母放大為大寫字母的效果。準備利用指針操作字符數(shù)組來完成任務(wù)。工作任務(wù)任務(wù)3字母放大鏡—通過指針訪問數(shù)組思路指導(dǎo)字符串初始化:定義字符串a(chǎn)[20]和b[20],并用gets函數(shù)輸入字符串a(chǎn)。數(shù)組的指針:定義指針變量指向兩個數(shù)組首地址*p1、*p2。循環(huán)條件判斷:循環(huán)判斷每個字符是否為小寫字母。處理:將小寫字母轉(zhuǎn)換為大寫字母,其余字母不變,存入數(shù)組b。輸出字符串:輸出“放大”后的字符串b。相關(guān)知識(一)數(shù)組的指針1.定義指向數(shù)組的指針變量存放數(shù)組元素地址的變量,稱為指向數(shù)組的指針變量。2.定義數(shù)組的指針變量格式:數(shù)組基類型*p;p=數(shù)組名;p=&數(shù)組名[0]或數(shù)組基類型*p=數(shù)組名;假如p=a,把數(shù)組的首地址賦給指針變量p,那么a[i]甚至可以表示為p[i](指針變量帶下標)。3.說明定義數(shù)組的指針變量與定義數(shù)組元素的指針變量相同,實質(zhì)就是定義基類型指針變量。例如,inta[10],*p;,定義了一個整型數(shù)組a,如果需要定義指向該數(shù)組的指針變量,就要定義一個整型指針變量p。(一)數(shù)組的指針4.?dāng)?shù)組指針變量的初始化(1)定義時初始化。例如,inta[10],*p=a;,在定義數(shù)組的指針變量p的同時,初始化指向已經(jīng)定義的數(shù)組a。(2)通過賦值初始化。例如:inta[10],*p;/*定義了一個整型數(shù)組a、一個整型指針變量p*/p=a;或者p=&a[0];/*將數(shù)組a的首地址賦值給整型變量p,此時p就是指向數(shù)組的指針變量*/(一)數(shù)組的指針5.通過指針引用數(shù)組元素不是地址值p增加i字節(jié)后的地址值,而是p向后移動i個基類型元素后的地址值。p?i、p++、p??都有類似的含義。①數(shù)組元素的地址表示。假如p定義為指向數(shù)組a的指針。數(shù)組元素a[i]的地址可以表示為&a[i],p+i,a+i。(2)通過指針引用數(shù)組元素。(1)指針p+i的含義。②數(shù)組元素的訪問。例如,數(shù)組元素a[i]的訪問可以是:a[i],*(p+i),*(a+i)。數(shù)組指針變量,數(shù)組名在許多場合甚至可以交換使用。假如p=a,那么a[i]甚至可以表示為p[i](指針變量帶下標)。(二)字符串的指針1.字符串指針的定義與賦值例如: char*ps="Hello!";(2)通過賦值運算使字符指針指向字符串。(1)定義時賦初值使指針指向一個字符串。例如:char*ps;ps="Hello!";2.字符數(shù)組與字符串的區(qū)別在C語言中,有關(guān)字符串的大量操作都與字符串標志'\0'有關(guān),因此,在字符數(shù)組中的有效字符后面加上'\0'這一特定情況下,可以把這種一維字符數(shù)組看作“字符串變量”。任務(wù)3字母放大鏡—通過指針訪問數(shù)組任務(wù)實施1.流程圖流程圖如圖所示。2.程序代碼#include"stdio.h"#include<string.h>main(){chara[20],b[20],*p1,*p2;inti;printf("請輸入字符串:\n");gets(a);for(p1=a,p2=b;*p1!='\0';p1++,p2++)//循環(huán)

if(*p1>='a'&&*p1<='z')任務(wù)3字母放大鏡—通過指針訪問數(shù)組{*p1=*p1-32;*p2=*p1;}else*p2=*p1;*p2='\0'; //為p2加結(jié)束標志printf("放大鏡:");puts(b);}程序運行結(jié)果如圖8-6所示。圖8-6任務(wù)3運行結(jié)果任務(wù)3猜年齡—函數(shù)的遞歸調(diào)用特別提示此題可以思考如何實現(xiàn)加密,如將a/A→e/E,b/B→f/F,…,w/W→a/A……拓展與提高(一)指針與二維數(shù)組1.二維數(shù)組的地址二維數(shù)組s可以看成由一維數(shù)組作為數(shù)組元素的數(shù)組,在內(nèi)存中按行順序存放,s是元素為行數(shù)組的一維數(shù)組的數(shù)組名,就是說s是元素為行數(shù)組的一維數(shù)組的首地址,s+i即元素為行數(shù)組的一維數(shù)組的第i個元素的地址,即*(s+i)=s[i]。同理,s[i](i=0~2)是第i個行數(shù)組的數(shù)組名,s[i]+j就是第i個行數(shù)組中第j個元素的地址。也就是說,二維數(shù)組任何一個元素s[i][j]的地址可以表示為s[i]+j,即二維數(shù)組任何一個元素s[i][j]=*(s[i]+j)。綜上所述,二維數(shù)組任何一個元素s[i][j]的地址都可以表示為&s[i][j]=s[i]+j=*(s+i)+j因此,二維數(shù)組任何一個元素都可以表示為s[i][j]=*(s[i]+j)=*(*(s+i)+j)事實上s[i][j]還可以表示為*(s+i)[j],*(&s[0][0]+m*i+j)(m為列數(shù))(一)指針與二維數(shù)組2.指向二維數(shù)組的指針變量典型例題:用指向元素的指針變量輸出數(shù)組元素的值。main(){inta[3][4]={{0,2,4,6},{1,3,5,7},{9,10,11,12}};int*p;for(p=a[0];p<a[0]+12;p++){if((p-a[0])%4==0)printf("\n");printf(*p);}}(二)指針數(shù)組指針數(shù)組是一組有序的指針的集合。指針數(shù)組的所有元素都必須是具有相同存儲類型和指向相同數(shù)據(jù)類型的指針變量。指針數(shù)組格式為類型說明符*數(shù)組名[數(shù)組長度]其中類型說明符為指針值所指向的變量的類型。例如,int*pa[3]表示pa是一個指針數(shù)組,它有3個數(shù)組元素,每個元素值都是一個指針,指向整型變量。通常可用一個指針數(shù)組來指向一個二維數(shù)組。指針數(shù)組中的每個元素被賦予二維數(shù)組每一行的首地址,因此也可理解為指向一個一維數(shù)組。(二)指針數(shù)組例8.1比較指針數(shù)組和二維數(shù)組指針變量inta[3][3]={1,2,3,4,5,6,7,8,9};int*pa[3]={a[0],a[1],a[2]};int*p=a[0];main(){inti;for(i=0;i<3;i++)printf("%d,%d,%d\n",a[i][2-i],*a[i],*(*(a+i)+i));for(i=0;i<3;i++)printf("%d,%d,%d\n",*pa[i],p[i],*(p+i));}注意指針數(shù)組和二維數(shù)組指針變量的區(qū)別,這兩者雖然都可用來表示二維數(shù)組,但是其表示方法和含義是不同的。二維數(shù)組指針變量是單個的變量,其一般形式中,"(*指針變量名)"兩邊的括號不可少。而指針數(shù)組類型表示的是多個指針(一組有序指針),在一般形式中,"*指針數(shù)組名"兩邊不能有括號。目錄導(dǎo)航任務(wù)1交換兩個變量的值—指針概述任務(wù)23個數(shù)排序—指針變量作為函數(shù)參數(shù)思考與訓(xùn)練單元小結(jié)任務(wù)3字母放大鏡—通過指針訪問數(shù)組單元小結(jié)Summary本單元主要介紹了指針的概念、賦值與引用,還介紹了指向數(shù)組的指針、指向字符串的指針,最后討論了二維數(shù)組的指針和指針數(shù)組。所謂指針其實就是地址,由于可以通過地址找到存儲于內(nèi)存中的變量,所以形象地把地址稱為指針。指針變量是存儲地址的變量,通過指針變量可以很方便地操作存儲于內(nèi)存單元中的變量。在用指針處理數(shù)組時,可以通過指針的移動來訪問數(shù)組的每一個元素。在用指針處理字符串時,可以充分利用字符串結(jié)束標志'\0'。二維數(shù)組被看作是按行順序存放的一維數(shù)組,指針的處理也可以同一維數(shù)組。指針數(shù)組一般用來處理多個字符串的情況,或多維數(shù)組的行。目錄導(dǎo)航任務(wù)1交換兩個變量的值—指針概述任務(wù)23個數(shù)排序—指針變量作為函數(shù)參數(shù)思考與訓(xùn)練單元小結(jié)任務(wù)3字母放大鏡—通過指針訪問數(shù)組思考與訓(xùn)練1.討論題指針變量、指針變量作為函數(shù)參數(shù)、數(shù)組的指針和指針數(shù)組的概念與應(yīng)用。Thinkingandpracticing思考與訓(xùn)練2.選擇題(1)若chars[10],*p=s;,則下列語句錯誤的是()。A.p=s+5 B.s=[p+s] C.s[2]=p[4] D.*p=s[0](2)已知定義char**s;,下列語句正確的是()。A.s="computer" B.*s="computer"C.**s="computer" D.*s='A'(3)說明語句int(*p)()的含義是()。A.p是一個指針型函數(shù),返回值為指針B.p是指針變量,它指向一個整型數(shù)據(jù)的指針C.p是一個指向函數(shù)的指針,該函數(shù)的返回值為整型D.以上答案都不對Thinkingandpracticing思考與訓(xùn)練(4)下列語句中,能表示p是一個指向整型變量的指針變量的是()。A.int**p B.int*p C.int(*p)() D.int*p[](5)下列敘述中,錯誤的是()。A.一個變量的地址稱為該變量的指針B.一個指針變量只能指向同一數(shù)據(jù)類型的變量C.指針變量中只能存放地址D.指針變量可以由整型數(shù)賦值(6)若有

溫馨提示

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

最新文檔

評論

0/150

提交評論