《C語言程序設(shè)計及應(yīng)用》課件第7章指針_第1頁
《C語言程序設(shè)計及應(yīng)用》課件第7章指針_第2頁
《C語言程序設(shè)計及應(yīng)用》課件第7章指針_第3頁
《C語言程序設(shè)計及應(yīng)用》課件第7章指針_第4頁
《C語言程序設(shè)計及應(yīng)用》課件第7章指針_第5頁
已閱讀5頁,還剩33頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、第7章 指 針 7.1 指針的概念7.2 指針變量7.3 函數(shù)之間的地址傳送7.4 函數(shù)的指針與指向函數(shù)的指針變量7.5 應(yīng)用舉例7.1 指針的概念指針是操作內(nèi)存的必要手段。運用指針編程是C語言最主要的風(fēng)格之一。利用指針變量可以表示各種數(shù)據(jù)結(jié)構(gòu);能很方便地使用數(shù)組和字符串;并能像匯編語言一樣處理內(nèi)存地址,從而編出精煉而高效的程序。指針極大地豐富了C語言的功能。7.2 指針變量7.2.1 指針變量的定義7.2.2 指針變量的引用7.2.1 指針變量的定義 在C語言中約定:“指針”是指地址,是常量,“指針變量”是指取值為地址的變量。定義指針的目的是為了通過指針去訪問內(nèi)存單元。如下圖所示指針示意圖。

2、 設(shè)有指針變量P,內(nèi)容為011A,這種情況稱為P指向變量C,或說P是指向變量C的指針。7.2.1 指針變量的定義 對指針變量的定義包括三個內(nèi)容:(1)指針類型:指針的類型就是它所指向的變量的類型。(2)指針類型標識符即“*”。(3)變量名。 其一般形式為: 類型說明符 *變量名 其中,“*”表示這是一個指針變量,變量名即為定義的指針變量名,類型說明符表示本指針變量所指向的變量的數(shù)據(jù)類型。7.2.2 指針變量的引用 指針變量同普通變量一樣,使用之前不僅要定義說明,而且必須賦予具體的值。指針變量的賦值只能賦予地址。兩個有關(guān)的運算符:(1)&:取地址運算符。(2)*:指針運算符(或稱“間接訪問”運算

3、符)。不允許把一個數(shù)賦予指針變量。被賦值的指針變量前不能再加“*”說明符,如寫為*p=&a 也是錯誤的。7.2.2 指針變量的引用 設(shè)有指向整型變量的指針變量p,如要把整型變量a的地址賦予p可有以下兩種方式:(1)指針變量初始化的方法。int a; 或者int *p=NULL;int *p=&a;(2)賦值語句的方法。int a;int *p;p=&a;7.2.2 指針變量的引用 假設(shè):int i=200, x;int *ip; 定義了兩個整型變量i、x還定義了一個指向整型數(shù)的指針變量ip??梢园裪的地址賦給ip:ip=&i; 此時指針變量ip指向整型變量i,假設(shè)變量i的地址為1800。7.2

4、.2 指針變量的引用 以后便可以通過指針變量ip間接訪問變量i,例如:x=*ip; *ip訪問的是地址為1800的存貯區(qū)域(因為是整數(shù),實際上是從1800開始的兩個字節(jié)),它就是i所占用的存貯區(qū)域,所以上面的賦值表達式等價于:x=i;7.2.2 指針變量的引用 【例7-1】main() int a,b; int *pointer_1, *pointer_2; /*定義兩個指針變量*/ a=100;b=10; pointer_1=&a; /*pointer_1指向a*/ pointer_2=&b; /* pointer_2指向b */ printf(%d,%dn,a,b); printf(%d,

5、%dn,*pointer_1, *pointer_2);7.2.2 指針變量的引用 【例7-1】程序運行結(jié)果如下圖所示。7.2.2 指針變量的引用 【例7-2】輸入a和b兩個整數(shù),按先大后小的順序輸出a和b。main() int *p1,*p2,*p,a,b; /*定義三個指針變量*/ scanf(%d,%d,&a,&b); p1=&a;p2=&b; /*為指針賦值*/ if(ab) p=p1;p1=p2;p2=p;7.2.2 指針變量的引用 printf(“na=%d,b=%dn”,a,b); /*輸出a和b*/printf(“max=%d,min=%dn”,*p1, *p2); /*輸出指

6、 針變量的值*/【例7-2】程序運行結(jié)果如下圖所示。7.3 函數(shù)之間的地址傳送 7.3.1 指針做函數(shù)參數(shù)7.3.2 返回指針值的函數(shù)7.3.1 指針做函數(shù)參數(shù)函數(shù)的參數(shù)還可以是指針類型。它的作用是將一個變量的地址傳送到另一個函數(shù)中。【例7-3】題目同【例7-2】,即輸入的兩個整數(shù)按大小順序輸出。在此用函數(shù)處理,而且用指針類型的數(shù)據(jù)作函數(shù)參數(shù)。swap(int *p1,int *p2) /*定義函數(shù)swap,參數(shù)為指針類型*/int temp; temp=*p1; *p1=*p2; *p2=temp;7.3.1 指針做函數(shù)參數(shù)main() int a,b;int *pointer_1,*poi

7、nter_2; /*定義兩個指針變量*/ scanf(%d,%d,&a,&b); pointer_1=&a;pointer_2=&b; /*為指針變量賦值*/ if(ab) swap(pointer_1,pointer_2); /*調(diào)用函數(shù)swap*/ printf(n%d,%dn,a,b); 7.3.1 指針做函數(shù)參數(shù)對程序的說明如下圖所示。7.3.1 指針做函數(shù)參數(shù)【例7-3】程序運行結(jié)果如下圖所示。不能企圖通過改變指針形參的值而使指針實參的值改變。 7.3.2 返回指針值的函數(shù) 在C語言中允許一個函數(shù)的返回值是一個指針(即地址),這種返回指針值的函數(shù)稱為指針型函數(shù)。 定義指針型函數(shù)的一般

8、形式為:函數(shù)類型說明符 *函數(shù)名(形參表) /*函數(shù)體*/7.3.2 返回指針值的函數(shù) 【例7-6】本程序是通過指針函數(shù),輸入一個17之間的整數(shù),輸出對應(yīng)的星期名。main() int i; char *day_name(int n); printf(input Day No:n); scanf(%d,&i); /*輸入一個17之間的整數(shù)*/ if(i%sn,i,day_name(i);/*輸出對應(yīng)的星期名*/ char *day_name(int n) /*定義了一個指針型函數(shù)day_name*/7.3.2 返回指針值的函數(shù) static char *name= Illegal day, M

9、onday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday; return(n7) ? name0 : namen); /*返回星期名*/7.3.2 返回指針值的函數(shù) 【例7-6】程序運行結(jié)果如下圖所示。對于指針型函數(shù)定義,int *p()只是函數(shù)頭部分,一般還應(yīng)該有函數(shù)體部分。7.4 函數(shù)的指針與指向函數(shù)的指針變量 在C語言中,一個函數(shù)總是占用一段連續(xù)的內(nèi)存區(qū),而函數(shù)名就是該函數(shù)所占內(nèi)存區(qū)的首地址??梢园押瘮?shù)的這個首地址(或稱入口地址)賦予一個指針變量,使該指針變量指向該函數(shù)。把這種指向函數(shù)的指針變量稱為“函數(shù)指針變量”。函數(shù)指

10、針變量定義的一般形式為:類型說明符 *指針變量名(); 其中“類型說明符”表示被指函數(shù)的返回值的類型。 *指針變量名()”表示“*”后面的變量是定義的指針變量,最后的空括號表示指針變量所指的是一個函數(shù)。7.4 函數(shù)的指針與指向函數(shù)的指針變量 【例7-7】本例用來說明用指針形式實現(xiàn)對函數(shù)調(diào)用的方法。int max(int a,int b) /*定義函數(shù),參數(shù)為整形*/ if(ab)return a; else return b;main() int max(int a,int b);7.4 函數(shù)的指針與指向函數(shù)的指針變量 int(*pmax)(); /*定義 pmax為函數(shù)指針變量*/ int

11、x,y,z; pmax=max; /*把被調(diào)函數(shù)的入口地址(函數(shù)名)賦予pmax函數(shù)指針變量*/ printf(input two numbers:n); scanf(%d%d,&x,&y); z=(*pmax)(x,y); /*用函數(shù)指針變量形式調(diào)用函數(shù)*/ printf(maxmum=%d,z);7.4 函數(shù)的指針與指向函數(shù)的指針變量 【例7-7】程序運行結(jié)果如下圖所示。7.5 應(yīng)用舉例 7.5.1 指針運算符7.5.2 指針變量的運算7.5.1 指針運算符1. 取地址運算符& 取地址運算符&是單目運算符,其結(jié)合性為自右至左,其功能是取變量的地址。 2. 取內(nèi)容運算符* 取內(nèi)容運算符*是單

12、目運算符,其結(jié)合性為自右至左,用來表示指針變量所指的變量。在*運算符之后跟的變量必須是指針變量。7.5.1 指針運算符【例7-8】main() int a=5,*p=&a; /*指針變量p獲得整型變量a的地址*/ printf (%d,*p); 表示指針變量p取得了整型變量a的地址。printf(%d,*p)語句表示輸出變量a的值。7.5.1 指針運算符【例7-8】程序運行結(jié)果如下圖所示。7.5.2 指針變量的運算 1. 賦值運算 指針變量的賦值運算有以下幾種形式。(1)指針變量初始化賦值。(2)把一個變量的地址賦予指向相同數(shù)據(jù)類型的指針變量。(3)把一個指針變量的值賦予指向相同類型變量的另一

13、個指針變量。(4)把數(shù)組的首地址賦予指向數(shù)組的指針變量。(5)把字符串的首地址賦予指向字符類型的指針變量。(6)把函數(shù)的入口地址賦予指向函數(shù)的指針變量。7.5.2 指針變量的運算 指針變量加或減一個整數(shù)n的意義是把指針向前或向后移動n個位置。如指針變量加1,即向后移動1個位置表示指針變量指向下一個數(shù)據(jù)元素的首地址,而不是在原地址基礎(chǔ)上加1。 例如: int a5,*pa; pa=a; /*pa指向數(shù)組a,也是指向a0*/ pa=pa+2; /*pa指向a2,即pa的值為&pa2*/7.5.2 指針變量的運算 3. 兩個指針變量之間的運算只有指向同一數(shù)組的兩個指針變量之間才能進行運算。兩指針變量

14、相減:兩指針變量相減所得之差是兩個指針所指數(shù)組元素之間相差的元素個數(shù)。兩個指針變量不能進行加法運算。 兩指針變量進行關(guān)系運算:指向同一數(shù)組的兩指針變量進行關(guān)系運算可表示它們所指數(shù)組元素之間的關(guān)系。指針變量未賦值時,可以是任意值,是不能使用的。而指針變量賦0值后,則可以使用,只是它不指向具體的變量而已。7.5.2 指針變量的運算 【例7-9】main() int a=10,b=20,s,t,*pa,*pb; /*說明pa,pb為整型指針變量*/ pa=&a; /*給指針變量pa賦值,pa指向變量a*/ pb=&b; /*給指針變量pb賦值,pb指向變量b*/ s=*pa+*pb; /*求a+b之和,(*pa就是a,*pb就是b)*/ t=*pa*pb; /*本行是求a*b之積*/printf(a=%dnb=%dna+b=%dna*b=%dn,a,b,a+b,a*b);7.5.2 指針變量的運算 printf(s=%dnt=%dn,s,t);【例7-9】程序運行結(jié)果如下圖所示。7.5.2 指針變量的運算 【例7-10】輸入三個數(shù),打印最大和最小值。main()/*pmax,pmin為整型指針變量*/ printf(input three numbers:n); /*輸入提示*/ scanf(%d%d%d,&a,&b,&c); /*輸入三個數(shù)字*/ if(ab) /*如果第一個數(shù)字大

溫馨提示

  • 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

提交評論