C語言程序設(shè)計(jì)-PPT-單元八使用指針訪問數(shù)據(jù)_第1頁
C語言程序設(shè)計(jì)-PPT-單元八使用指針訪問數(shù)據(jù)_第2頁
C語言程序設(shè)計(jì)-PPT-單元八使用指針訪問數(shù)據(jù)_第3頁
C語言程序設(shè)計(jì)-PPT-單元八使用指針訪問數(shù)據(jù)_第4頁
C語言程序設(shè)計(jì)-PPT-單元八使用指針訪問數(shù)據(jù)_第5頁
已閱讀5頁,還剩49頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、使用指針訪問數(shù)據(jù)C語言程序設(shè)計(jì) 單元八導(dǎo)學(xué)【問題1】【問題2】一維數(shù)組是占用連續(xù)存儲(chǔ)空間的數(shù)據(jù),如何通過指針變量對(duì)這段內(nèi)存空間進(jìn)行操作?有一個(gè)整型變量a,如何知道該變量的存儲(chǔ)地址?如何通過指針變量對(duì)a進(jìn)行操作?目錄2用指針操作一維數(shù)組3用指針操作二維數(shù)組4用字符指針操作字符串1地址與指針 地址與指針5返回地址的函數(shù)1地址與指針內(nèi)存地址編號(hào)就是內(nèi)存地址變量m變量a占1字節(jié)占4字節(jié)2000 2001 2002 2003 2004 2011 #include stdio.hvoid main() char m; int a; scanf(“%c”,&m); scanf(“%d”,&a); 內(nèi)存是以字

2、節(jié)為單位的連續(xù)的存儲(chǔ)空間。b1輸入:b輸入:11地址與指針變量的存儲(chǔ)地址2000 2001 2002 2003 2004 2011 b1 變量存儲(chǔ)空間的第一個(gè)字節(jié)對(duì)應(yīng)的內(nèi)存地址可看作是存儲(chǔ)地址。變量m變量a存儲(chǔ)地址 根據(jù)存儲(chǔ)地址就可找到相應(yīng)的存儲(chǔ)單元,所以通常也把地址稱為指針?!奥窐?biāo)上的地址”可用指針表示。1地址與指針指針變量 C 語言允許用一種類型的變量來存放指針。指針變量 指針變量的值就是某個(gè)內(nèi)存單元的存儲(chǔ)地址。 設(shè)指針變量pm、pa分別存放變量m、a的存儲(chǔ)地址。pa=&a pa的存儲(chǔ)地址為2001 2000 2001 2002 2003 2004 2011 b1變量m變量a存儲(chǔ)地址pm=

3、&m pm的存儲(chǔ)地址為2000 1地址與指針指針變量的定義a*a普通變量指針變量int a;普通變量 a的定義int a;指針變量 a的定義*類型標(biāo)識(shí)符 * 指針變量名;【形式】“指針變量名”前的“*”表示該變量是指針變量,不能省略?!邦愋蜆?biāo)識(shí)符”表示該指針變量所指向的變量的數(shù)據(jù)類型。 一個(gè)指針變量只能指向同一類型的變量。【說明】1地址與指針指針變量的定義示例int * p; /定義int型指針變量,變量名為pfloat * pf; /定義float型指針變量,變量名為pfchar * pc; /定義char型指針變量,變量名為pcint *p;int n; p=&n; 等價(jià)于int *p=&

4、n; &npnnp指針表示簡(jiǎn)化的指針表示1地址與指針指針變量的定義示例char str20; /定義char型變量名為str的一維字符數(shù)組gets(ps); /為ps所指向的內(nèi)存空間輸入字符串char *ps;ps=str; 等價(jià)于char *ps=str; 等價(jià)于gets(str);【注意】指針變量也可以被初始化為NULL,它的值為0。當(dāng)指針值為零時(shí),指針不指向任何有效數(shù)據(jù),也稱為空指針。1地址與指針指針變量的基本使用int n=10;int *p=&n; 如何引用指針變量p輸出n的值?printf(%d,*p); 等價(jià)于printf(%d,n);*指針變量名“*”為指針運(yùn)算符,表示指針變量

5、所指向內(nèi)存單元的內(nèi)容。 引用時(shí)的“*”不同于指針變量定義語句中的“*”。int *p; “*”是指針標(biāo)志符printf(%d,*p); “*”是指針運(yùn)算符【格式】【說明】1地址與指針指針變量的基本使用示例通過指針變量訪問的方式計(jì)算兩個(gè)整數(shù)之和。#include stdio.hvoid main() int a,b,s; int *pa,*pb; pa=&a; pb=&b; scanf(%d %d,pa,pb); s=*pa+*pb; printf(s=%dn,s);/定義兩個(gè)整型指針變量pa、pb/使pa指向a/使pb指向b/為pa,pb所指向的內(nèi)存單元輸入值(10、20)/通過指針變量訪問的

6、方式求和(30)/輸出求和結(jié)果/定義整型變量a、b代表兩個(gè)加數(shù),整型變量s存求和結(jié)果&apaa&bpbbs102030輸入:10 20301地址與指針指針變量的基本使用示例利用自定義函數(shù)add( )計(jì)算兩個(gè)整數(shù)之和。#include stdio.hint add(int *pa,int *pb) int sum; sum=*pa+*pb; return sum;void main() int a,b,s; scanf(%d %d,&a,&b); s=add(&a,&b); printf(s=%dn,s);/輸入a、b的值(10、20)/求和結(jié)果通過return語句返回主函數(shù)/add( )是自定

7、義函數(shù),形參pa、pb是指針變量/調(diào)用add函數(shù),將&apa、&bpb/形參pa a,形參pb b,實(shí)現(xiàn)兩個(gè)整數(shù)求和/輸出求和結(jié)果&apaa&bpbbs102030&a&bsum30輸入:10 20301地址與指針指針變量的基本使用隨堂練習(xí)#include void add(int *pa,int *pb,int *psum) *psum=*pa+*pb;void main() int a,b,s; scanf(%d%d,&a,&b); add(&a,&b,&s); printf(s=%dn,s);試分析如下程序,看看是否能實(shí)現(xiàn)“利用自定義函數(shù)計(jì)算兩個(gè)整數(shù)的和”?目錄1地址與指針3用指針操作二

8、維數(shù)組4用字符指針操作字符串5返回地址的函數(shù)2用指針操作一維數(shù)組 用指針操作一維數(shù)組2用指針操作一維數(shù)組p=a;int a5;int *p;/建立數(shù)組a與指針p之間的關(guān)系等價(jià)于 p=&a0;如何建立數(shù)組a與指針p之間的關(guān)系?p p+1 a+1p+2 a+2p+3 a+3p+4 a+4a1a0a2a3a4 a數(shù)組 a內(nèi)存單元2用指針操作一維數(shù)組p a+1a1a0a2a3a4 a數(shù)組 a內(nèi)存單元若有如下定義:int a5,*p;p=a;a+1是a1的地址,a+i就是ai的地址。a+i關(guān)于地址: a+i&(ai) p+i*(p+i)關(guān)于元素: ai*(a+i) 等價(jià)關(guān)系如下:2用指針操作一維數(shù)組示例

9、利用兩種方法,輸出一維數(shù)組各元素地址。#include stdio.hvoid main() int a5,*p,i; p=a; printf(獲取數(shù)組元素地址:n); for(i=0;i5;i+) printf(&a%d=%pn,i, &ai ); printf(利用指針表示數(shù)組元素地址:n); for(i=0;i5;i+) printf(p+%d=%pn,i, p+i );獲取數(shù)組元素地址:利用指針表示數(shù)組元素地址:&a0=0018FF34&a3=0018FF40&a4=0018FF44&a1=0018FF38&a2=0018FF3Cp+0=0018FF34p+1=0018FF38p+2=

10、0018FF3Cp+3=0018FF40p+4=0018FF442用指針操作一維數(shù)組示例輸出一維數(shù)組各元素的值。#include stdio.hvoid main() int a5=10,31,52,3,68,*p,i; p=a; printf(輸出數(shù)組元素的值(下標(biāo)法):n); for(i=0;i5;i+)printf(a%d=%dn,i, ai ); printf(輸出數(shù)組元素的值(下標(biāo)法):n); for(i=0;i5;i+)printf(p%d=%dn,i, pi ); printf(輸出數(shù)組元素的值(指針法):n); for(i=0;i5;i+)printf(*(p+%d)=%dn,

11、i, *(p+i) );輸出數(shù)組元素的值(下標(biāo)法):輸出數(shù)組元素的值(下標(biāo)法):a0=10a3=3a4=68a1=31a2=52*(p+4)=68p0=10p3=3p4=68p1=31p2=52輸出數(shù)組元素的值(下標(biāo)法):*(p+1)=31*(p+0)=10*(p+2)=52*(p+3)=32用指針操作一維數(shù)組數(shù)組名作函數(shù)參數(shù) 利用函數(shù)處理批量數(shù)據(jù)時(shí),若實(shí)參是數(shù)組,形參可是數(shù)組也可是指針,實(shí)參、形參之間傳遞的是地址。#include stdio.hint sum(int p ,int n) int i,t=0; for(i=0;in;i+) t+=pi; return t;void main(

12、 ) int a5=0,1,2,3,4,s; s=sum(a,5); printf(數(shù)組元素之和為:%d.n,s);形參 ( p n )實(shí)參 ( a 5 )數(shù)組元素之和為:10.用函數(shù)計(jì)算整型數(shù)組各元素之和。2用指針操作一維數(shù)組數(shù)組名作函數(shù)參數(shù)#include stdio.hint sum(int *p,int n) int i,t=0; for(i=0;in;i+) t+=*(p+i); return t;void main( ) int a5=0,1,2,3,4,s; s=sum(a,5); printf(數(shù)組元素之和為:%d.n,s);數(shù)組元素之和為:10.指針表示地址,它可作函數(shù)的參數(shù)

13、。參數(shù)傳遞后指針指向數(shù)組的首地址。01234p aa1a0a2a3a4參數(shù)傳遞過程:用指針作形參,計(jì)算整型數(shù)組各元素之和。2用指針操作一維數(shù)組數(shù)組名作函數(shù)參數(shù) 數(shù)組名作實(shí)參,對(duì)應(yīng)的形參可是數(shù)組也可是指針,形參、實(shí)參的數(shù)據(jù)類型應(yīng)一致。#include stdio.hint sum(int p ,int n) void main( ) int a5=0,1,2,3,4,s; s=sum(a,5); #include stdio.hint sum(int *p,int n) void main( ) int a5=0,1,2,3,4,s; s=sum(a,5); 形參是數(shù)組形參是指針數(shù)組名作實(shí)參數(shù)組

14、名作實(shí)參【說明】2用指針操作一維數(shù)組數(shù)組名作函數(shù)參數(shù) 進(jìn)行函數(shù)調(diào)用時(shí),將數(shù)組的首地址傳給形參,形參的改變對(duì)實(shí)參產(chǎn)生影響。 實(shí)參與形參共同占用一段內(nèi)存,在函數(shù)執(zhí)行過程中形參元素值發(fā)生變化,實(shí)參元素值也會(huì)隨之改變。#include stdio.hint sum(int *p,int n) *(p+2)=10; void main( ) int a5=0,1,2,3,4,s; s=sum(a,5); printf(數(shù)組元素之和為:%d.n,s); printf(“a2=%dn”,a2);a0a1a2a3a4p a相當(dāng)于:p=a; 24310for(i=0;in;i+) t+=*(p+i); retu

15、rn t;10數(shù)組元素之和為:18.a2=10數(shù)組元素求和并返回【說明】目錄1地址與指針2用指針操作一維數(shù)組4用字符指針操作字符串5返回地址的函數(shù)3用指針操作二維數(shù)組 用指針操作二維數(shù)組3用指針操作二維數(shù)組二維數(shù)組中所蘊(yùn)含的地址關(guān)系int a43=0,1,2, 3,4,5, 6,7,8, 9,10,11;a0a1a2a3 a數(shù)組a由4個(gè)元素組成: a0、a1、a2 、a3a0包含有 3 個(gè)元素:a00、a01、a02,a0a00a01a02a10a11a12a20a21a22a1a2210543876a30a31a32a3910113用指針操作二維數(shù)組二維數(shù)組中所蘊(yùn)含的地址關(guān)系 a a+1 a

16、+2a代表二維數(shù)組的首地址,也是二維數(shù)組第0行的首地址。a+1代表第1行的首地址, 。由于第0行有3個(gè)整型元素, 所以第1行的首地址為1012, 。 1000 1012 1024設(shè)此二維數(shù)組的首地址為1000。int a43=0,1,2, 3,4,5, 6,7,8, 9,10,11;a00a01a02a10a11a12a20a21a22210543876a30a31a3291011 a+3 10361個(gè)整型變量占4個(gè)字節(jié)3用指針操作二維數(shù)組二維數(shù)組中所蘊(yùn)含的地址關(guān)系得出 a0 a1 a2 a0、a1、a2 、a3分別代表二維數(shù)組各行的首地址 a0代表第0行中第0列元素的地址 &a00; a0+

17、1即代表第0行第1列元素的地址 &a01;ai+j即代表第i行第j列元素的地址,即&aijint a43=0,1,2, 3,4,5, 6,7,8, 9,10,11;a00a01a02a10a11a12a20a21a22210543876a30a31a3291011 a3【說明】3用指針操作二維數(shù)組二維數(shù)組中所蘊(yùn)含的地址關(guān)系二維數(shù)組元素aij可表示成 可用指針形式表示各元素的地址。a0等價(jià)于*(a+0) ,a1等價(jià)于*(a+1)。得出ai+j等價(jià)于*(a+i)+j,即代表第i行第j列元素的地址a00a01a02a10a11a12a20a21a22210543876a30a31a3291011in

18、t a43=0,1,2, 3,4,5, 6,7,8, 9,10,11; a0 a1 a2 a3*(ai+j)、*(*(a+i)+j)、(*(a+i)j 【說明】3用指針操作二維數(shù)組二維數(shù)組中所蘊(yùn)含的地址關(guān)系 &aij ai+j *(a+i)+j二維數(shù)組元素aij的地址表示方式有:a0a1a2a3a00a01a02a10a11a12a20a21a22a30a31a32 aint a43; aij *(ai+j) *(*(a+i)+j) (*(a+i)j二維數(shù)組元素aij的表示方式有:3用指針操作二維數(shù)組建立指針與二維數(shù)組的關(guān)系 數(shù)組中的每個(gè)元素都是指針變量,根據(jù)數(shù)組的定義,指針數(shù)組中每個(gè)元素都為

19、指向同一數(shù)據(jù)類型的指針。指針數(shù)組,就是用指向同一數(shù)據(jù)類型的指針來構(gòu)成一個(gè)數(shù)組。int *p3,i; /定義指針數(shù)組p,包含3個(gè)指針變量p0,p1,p2int a34=12,3,5,61,60,54,13,8,71,9,19,24;for( i=0; i3;i+) pi=ai;建立指針數(shù)組與二維數(shù)組之間的關(guān)系【示例】3用指針操作二維數(shù)組建立指針與二維數(shù)組的關(guān)系12356160541387191924a0a1a2 a00 a01 a02 a03a10 a11 a12 a13 a20 a21 a22 a23p0 p1 p2pint *p3,i; int a34=12,3,5,61,60,54,13,

20、8,71,9,19,24;for( i=0; i3;i+) pi=ai;3用指針操作二維數(shù)組建立指針與二維數(shù)組的關(guān)系int *p3,i; int a34=12,3,5,61,60,54,13,8,71,9,19,24;for( i=0; i*y) return x; else return y; void main() int *p,i,j; printf(請(qǐng)輸入兩個(gè)整數(shù):); scanf(%d %d,&i,&j); p=f(&i,&j); printf(第一個(gè)數(shù)為%d,存儲(chǔ)地址為:%p.n,i,&i); printf(第二個(gè)數(shù)為%d,存儲(chǔ)地址為:%p.n,j,&j); printf(較大的數(shù)為%d,存儲(chǔ)地址為:%p.n,*p,p);/函數(shù)返回值是指針類型/返回變量x的地址/接收返回值的變量p是指針類型請(qǐng)輸入兩個(gè)整 數(shù):50 10第一個(gè)數(shù)為50,存儲(chǔ)地址為:0018FF40第一個(gè)數(shù)為10,存儲(chǔ)地址為:0018FF3C較

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論