![指 針基本問題1.為什么要使用指針 課件_第1頁](http://file4.renrendoc.com/view/a514d391c47d103fb563549646daf743/a514d391c47d103fb563549646daf7431.gif)
![指 針基本問題1.為什么要使用指針 課件_第2頁](http://file4.renrendoc.com/view/a514d391c47d103fb563549646daf743/a514d391c47d103fb563549646daf7432.gif)
![指 針基本問題1.為什么要使用指針 課件_第3頁](http://file4.renrendoc.com/view/a514d391c47d103fb563549646daf743/a514d391c47d103fb563549646daf7433.gif)
![指 針基本問題1.為什么要使用指針 課件_第4頁](http://file4.renrendoc.com/view/a514d391c47d103fb563549646daf743/a514d391c47d103fb563549646daf7434.gif)
![指 針基本問題1.為什么要使用指針 課件_第5頁](http://file4.renrendoc.com/view/a514d391c47d103fb563549646daf743/a514d391c47d103fb563549646daf7435.gif)
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、第八章 指 針基本問題1.為什么要使用指針 C語言作為高級程序設(shè)計語言與其它高級程序設(shè)計語言的不同之處在于C語言能直接對內(nèi)存的物理地址進(jìn)行操作,也就是允許利用變量的地址訪問變量或利用數(shù)組的地址訪問數(shù)組元素。 如果C語言要對內(nèi)存地址操作就需要用指針。2.什么是指針 指針就是存放數(shù)據(jù)的內(nèi)存單元地址,它是一種數(shù)據(jù)類型。3.變量與內(nèi)存單元地址的關(guān)系(1)程序中可以用變量來存放各種數(shù)據(jù),因此每個變量都需要分配連續(xù)的字節(jié)。(2)由于數(shù)據(jù)類型的不同,每個變量需要分配的字節(jié)數(shù)目也不同。(3)對源程序進(jìn)行編譯時,每遇到一個變量,就給它分配內(nèi)存單元,同時在“變量與地址對照表”中記錄變量的名稱、數(shù)據(jù)類型和地址。例如
2、:在程序清單中有下列數(shù)據(jù)定義語句: char ch=A;short s=5;float f;則分配的內(nèi)存單元如圖所示,“變量與地址對照表”如表所示。 假設(shè)有賦值語句:f=ch+s;4.數(shù)組與內(nèi)存單元地址的關(guān)系(1)對一個數(shù)組來說,所分配的內(nèi)存單元必須是連續(xù)的。每個數(shù)組元素占用連續(xù)的內(nèi)存單元。(2)一個數(shù)組占用的總字節(jié)數(shù)等于數(shù)組長度每個數(shù)組元素占用的字節(jié)數(shù)。(3)對源程序進(jìn)行編譯時,每遇到一個數(shù)組,就給它分配內(nèi)存單元,同時在“數(shù)組與地址對照表”中記錄數(shù)組名、數(shù)據(jù)類型、數(shù)組長度和數(shù)組首地址。(4)一個數(shù)組的首地址,就是第一個元素(即下標(biāo)為0的數(shù)組元素)的地址。(5)如果知道數(shù)組a的首地址和數(shù)據(jù)類型
3、,可以通過下列公式計算出每個數(shù)組元素的地址,從而找到每個數(shù)組元素。數(shù)組元素ai的地址=數(shù)組首地址+i*數(shù)據(jù)類型所占的字節(jié)數(shù)8.1 指針變量1.什么是指針變量 指針?biāo)硎镜牡刂啡绻娣牛脖仨氁娣旁谧兞恐?,而存放地址值的變量就是指針變量。一、指針變量的定義和初始化1.定義格式:數(shù)據(jù)類型符 *指針變量名=初值;2.功能:定義指向“數(shù)據(jù)類型”的變量或數(shù)組的指針變量,同時給其賦初值。3.說明:(1)指針變量名的構(gòu)成規(guī)則是標(biāo)識符,前面必須有*號。例如:int a; int *p=&a; /*指針變量p指向了變量a*/ float f1,f5,*p1=&f1,*p2=f,*p3=&f2;int a;f
4、loat *p=&a; /*錯誤的*/二、取地址運算符和指針運算符1.運算符2.說明(1)取地址運算符(&)的運算對象必須是已定義過的變量、數(shù)組元素,但不可以是數(shù)組名。 int a,b10,*p; p=&a; (或p=&b2;)是正確的。 p=&b; (是錯誤的) p=b;是正確的。(2)指針運算符(*)的運算對象必須是地址??梢允且奄x值過的指針變量,也可以是變量或數(shù)組元素的地址,但不能是整數(shù)、也不能是非地址型的變量。運算結(jié)果就是地址對應(yīng)的對象。例如:int a,b5,*p=&a,*p1=b; a=10; *p=10; *&a=10; b0=5; *p1=5; *&b0=5;等價等價8.2 指
5、針變量的使用一、指向變量的指針變量的使用1.使用說明:(1)如果要使用指針變量指向某個變量時,首先要定義變量和同類型的指針變量;(2)將變量的地址賦值給指針變量,則指針變量就可以指向該變量;(3)當(dāng)指針變量一旦指向了某個變量后,就可以利用指針變量來使用該變量。2.舉例說明例1:指針變量引用舉例。假設(shè)有如下的定義語句,則列表給出了幾個指針引用的表達(dá)式及其含義。 int a6=3,7,11,13,17,19,b,*p,*q;例3:輸入3個整數(shù),按從小到大的順序輸出。要求用指針變量處理。先考慮不用指針變量編程:void main() int a,b,c,t; scanf(%d,%d,%d,&a,&b
6、,&c); if (ab)t=a,a=b,b=t; if (ac)t=a,a=c,c=t; if (bc)t=b,b=c,c=t; printf(%d=%d*pb)p=pa,pa=pb,pb=p; if (*pa*pc)p=pa,pa=pc,pc=p; if (*pb*pc)p=pb,pb=pc,pc=p; printf(%d=%d=%dn,*pa,*pb,*pc);2.用指向一維數(shù)組的指針變量處理數(shù)組元素 用指針變量處理一維數(shù)組元素的關(guān)鍵是引用數(shù)組元素,用指針變量引用數(shù)組元素的方法如下: *(指針變量+i)說明:(1)其中i是要引用的數(shù)組元素的下標(biāo),(指針變量+i)是該元素的地址, *(指針
7、變量+i)就是要引用的數(shù)組元素。(2)當(dāng)指針變量指向一維數(shù)組后,對下標(biāo)為i的數(shù)組元素引用可有下列四種方式: *(指針變量+i) 或 *(數(shù)組名+i)(稱為指針法) 指針變量i 或 數(shù)組名i (稱為下標(biāo)法)3. 指向一維數(shù)組的指針變量的運算(1)指針變量和整數(shù)的算術(shù)運算說明:從運算結(jié)果來看,值仍為地址型數(shù)據(jù)。要特別注意對指向一維數(shù)組的指針進(jìn)行算術(shù)運算時,所加減的整數(shù)不是指絕對的地址整數(shù)值,而是該指針變量向后或向前移動的同類型一維數(shù)組元素的數(shù)目。舉例說明:例如,設(shè)有定義語句:short a5,*pa=a;假定分配給數(shù)組a的首地址為2000。執(zhí)行pa=pa+4后,pa指向a4,pa中的地址值為:20
8、00+4*2=2008。再執(zhí)行pa-后,pa將指向a3,pa中的地址值為:2008-1*2=2006。(2)指針變量和指針變量的減法運算運算規(guī)則:指針變量1-指針變量2說明:運算結(jié)果為它們所指向的數(shù)組元素下標(biāo)相差的整數(shù)要求這兩個指針變量必須指向同一個數(shù)組,否則不能進(jìn)行減法運算。例如:int a10,*p1,*p2; p1=&a2;p2=&a6; p1-p2; 結(jié)果為整數(shù)-4 p2-p1; 結(jié)果為整數(shù)4(3)指針變量的關(guān)系運算運算規(guī)則:指針變量1 關(guān)系運算符 指針變量2說明:該運算是按指針變量中的地址值比較大小。當(dāng)兩個指針變量的值(地址值)滿足關(guān)系運算時,結(jié)果為1(真),否則結(jié)果為0(假)。關(guān)系
9、運算符為可以用于兩個地址常量之間的比較,或一個地址常量和一個地址變量之間的比較。4. 指向一維數(shù)組的指針變量的應(yīng)用舉例例4:輸入10個整數(shù)存入一維數(shù)組,從中查找某個整數(shù)(該數(shù)從鍵盤上讀?。?,若查到,則輸出它是10個整數(shù)中的第幾個數(shù)(序號規(guī)定從1開始);查不到則輸出“Not Find!”。要求用指針變量處理數(shù)組元素。算法分析:使用簡單的順序查找法。即依次比較一維數(shù)組元素和待查數(shù),相等則查到,強(qiáng)迫退出循環(huán)。否則,繼續(xù)查找。正常退出循環(huán),表示沒有查到。由于循環(huán)有兩個出口,分別代表查到和未查到,需要使用標(biāo)記變量來區(qū)分。程序清單如下:void main() int a10,*p,x,n,flag=0;
10、for (p=a;pa+10;p+) scanf(%d,p); scanf(%d,&x); for (n=1,p=a;pa+10;p+,n+) if (*p=x)flag=1;break; if (flag) printf(%dn,n); else printf(Not Findn);結(jié)構(gòu)之二:把二維數(shù)組a的每一行看成是一個一維數(shù)組,即二維數(shù)組由多個一維數(shù)組組成,其結(jié)構(gòu)如圖所示:其中a是二維數(shù)組名,a0、a1、a2是每一個一維數(shù)組的數(shù)組名。2.通過二維數(shù)組名引用數(shù)組元素假設(shè)有定義語句:int a34引用某一個元素(aij)的方法如下:(1)aij元素的地址: *(a+i)+j 或 ai+j (
11、2)通過地址引用aij元素: *(*(a+i)+j) 或 *(ai+j)3.通過一般指針引用數(shù)組元素假設(shè)有定義語句:int a34,*p=*a;(其中*p=*a表示指針p指向a數(shù)組的首元素地址)引用某一個元素(aij)的方法如下:(1)aij元素的地址:p+i*4+j(2)通過地址引用aij元素:*(p+i*4+j)4.通過指向一維數(shù)組的指針變量引用數(shù)組元素用該方法引用數(shù)組元素時,首先必須先定義指針變量,再指向?qū)?yīng)的二維數(shù)組的首行地址。定義指針格式:數(shù)組類型 (*指針變量名)m其中m是二維數(shù)組的列數(shù);指向數(shù)組首行地址格式:指針變量=數(shù)組名假設(shè)有定義語句:int a34,(*p)4=a;(其中(
12、*p)4=a表示指針p指向a數(shù)組的首行地址)引用某一個元素(aij)的方法如下:(1)aij元素的地址:*(p+i)+j 或 pi+j(2)通過地址引用aij元素:*(*(p+i)+j )5. 指向二維數(shù)組的指針變量的應(yīng)用舉例例5:編寫程序,建立如下形式的二維數(shù)組,再以矩陣形式輸出之。 1 2 3 4 5 2 1 2 3 4 3 2 1 2 3 4 3 2 1 2 5 4 3 2 1算法分析:二維數(shù)組的每一個元素的值是該數(shù)組元素的(行號-列號)取絕對值再加1。方法1:利用二維數(shù)組元素本身處理#include #include void main() int i,j,a55; for (i=0;
13、i5;i+) for (j=0;j5;j+) aij=fabs(i-j)+1; for (i=0;i5;i+) for (j=0;j5;j+) printf(%-3d,aij); printf(n); 方法2:利用二維數(shù)組名處理#include #include void main() int i,j,a55; for (i=0;i5;i+) for (j=0;j5;j+) *(*(a+i)+j)=fabs(i-j)+1; for (i=0;i5;i+) for (j=0;j5;j+) printf(%-3d,*(*(a+i)+j); printf(n); 方法3:利用一般指針方法處理#inc
14、lude #include void main() int i,j,a55,*p=*a; for (i=0;i5;i+) for (j=0;j5;j+) *(p+i*5+j)=fabs(i-j)+1; for (i=0;i5;i+) for (j=0;j5;j+) printf(%-3d,*(p+i*5+j); printf(n); 方法4:利用指向一維數(shù)組的指針方法處理#include #include void main() int i,j,a55,(*p)5=a; for (i=0;i5;i+) for (j=0;j5;j+) *(*(p+i)+j)=fabs(i-j)+1; for (
15、i=0;i5;i+) for (j=0;j5;j+) printf(%-3d,*(*(p+i)+j); printf(n); 四、指向字符串的指針變量的使用1.定義和賦值(1)定義格式:char *指針變量;(2)賦值方法1:定義時用賦初值的方式 *指針變量=字符串常量方法2:程序中用賦值方式 指針變量=字符串常量例如 char *p=“abcd”;或 char *p; p=“abcd”;(3)說明:(3)說明:賦值時并不是將字符串常量賦予指針變量,而是將存放字符串常量的連續(xù)內(nèi)存單元的首地址賦予指針變量。C語言中允許在同一個程序中,使同一個字符型指針變量先后指向不同的字符串常量。例如:char
16、 *pa; pa=“abcdefghijk”; pa=“123456789”;2.指向字符串常量的指針變量的使用 當(dāng)一個字符型指針變量已指向某個字符串常量,就可以利用指針變量來處理這個字符串。處理的方式主要有兩種:(1)處理整個字符串 輸出字符串 printf(“%s”,指針變量); 輸入新的字符串代替原字符串 scanf(“%s”,指針變量);(2)處理字符串中的單個字符 第i個字符的表示方法 *(指針變量+i)例6:閱讀下列程序,判斷輸出結(jié)果。#include void main() char s10,*p1,*p2=1234; p1=p2; p2=ab; printf(%sn,p2);
17、printf(%sn,p1); p1=ABCD; printf(%sn,p1); printf(%c,%cn,*(p1+1),*(p1+3);例7:用字符型指針p指向字符串常量“12345678”,然后反復(fù)從鍵盤上輸入字符串,若大于給定的字符串常量,則輸出“Larger!”;若小于給定的字符串常量,則輸出“Smaller!”。直到輸入的字符串等于這個字符串常量時結(jié)束。本程序中要求用指向字符串和存放字符串的字符數(shù)組的指針變量來處理其中字符串。字符串比較使用系統(tǒng)函數(shù)strcmp( )。程序清單如下:#include #include void main() char *p=12345678,a10
18、, *pp=a; while (1) gets(pp); if (strcmp(pp,p)=0) break; else if (strcmp(pp,p)0) printf(Larger!n); else printf(Smallern); printf(%s=%sn,p,a);8.3 指針數(shù)組1.什么是指針數(shù)組 如果某個數(shù)組的元素是指針類型,這樣的數(shù)組稱為指針數(shù)組。2.指針數(shù)組的特點(1)指針數(shù)組中的每個元素都相當(dāng)于一個指針變量,只能存放地址型數(shù)據(jù)。(2)指針數(shù)組的全部數(shù)組元素必須是指向相同數(shù)據(jù)類型的指針。一、指針數(shù)組的定義定義格式 數(shù)據(jù)類型符 *數(shù)組名常量表達(dá)式;例如:int *p4; p是一個指針數(shù)組,它的每個元素是指向一個int類型對象的指針變量。float *q5;q是一個指針數(shù)組,它的每個元素是指向一個float類型對象的指針變量。char *u6;u是一個指針數(shù)組,它的每個元素是指向一個char類型對象的指針變量。二、指針數(shù)組的應(yīng)用例8:輸入3個實數(shù),然后按照從大到小順序輸出。要求用指向這3個實數(shù)的指針數(shù)組元素來處理這3個實數(shù)。算法分析:3個實數(shù)存入數(shù)組x3。用長度為3的指針數(shù)組的元素分別指向這3個實數(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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 現(xiàn)代商務(wù)場合下的著裝與舉止規(guī)范
- 居然之家國慶節(jié)活動方案
- 現(xiàn)代農(nóng)業(yè)旅游產(chǎn)業(yè)鏈構(gòu)建與農(nóng)業(yè)可持續(xù)發(fā)展
- 未來生態(tài)社區(qū)的規(guī)劃與水環(huán)境關(guān)系探討
- 災(zāi)害預(yù)防教育在學(xué)校的推廣與應(yīng)用
- 匯報邏輯清晰度職場的制勝法寶
- 6 飛向藍(lán)天的恐龍說課稿-2023-2024學(xué)年四年級下冊語文統(tǒng)編版
- 2023九年級物理上冊 第四章 探究電流4.3 導(dǎo)體對電流阻礙作用說課稿 (新版)教科版
- 2 送元二使安西(說課稿)- 2024-2025學(xué)年部編版語文六年級上冊
- 2024-2025學(xué)年高中數(shù)學(xué) 第一章 集合與常用邏輯用語 1.4.2 充要條件說課稿 新人教A版必修第一冊001
- 2024年公安機(jī)關(guān)理論考試題庫附答案【考試直接用】
- 課題申報參考:共同富裕進(jìn)程中基本生活保障的內(nèi)涵及標(biāo)準(zhǔn)研究
- 2025年浙江嘉興桐鄉(xiāng)市水務(wù)集團(tuán)限公司招聘10人高頻重點提升(共500題)附帶答案詳解
- 食品企業(yè)如何做好蟲鼠害防控集
- 2025中國聯(lián)通北京市分公司春季校園招聘高頻重點提升(共500題)附帶答案詳解
- 康復(fù)醫(yī)學(xué)科患者隱私保護(hù)制度
- 環(huán)保工程信息化施工方案
- 狂犬病暴露后預(yù)防處置
- 紅色中國風(fēng)2025蛇年介紹
- 2024年安徽省高考地理試卷真題(含答案逐題解析)
- 高中學(xué)校開學(xué)典禮方案
評論
0/150
提交評論