




已閱讀5頁(yè),還剩50頁(yè)未讀, 繼續(xù)免費(fèi)閱讀
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第八章,指針,1/55,8.1 指針的概念 8.2 指針變量的定義和引用 8.3 指針與數(shù)組 8.4 指針與字符串 8.5 指針數(shù)組與指向指針的指針 8.6 返回指針值的函數(shù) 8.7 本章要點(diǎn)小結(jié) 8.8 本章程序舉例,2/55,8.1 指針的概念,一、數(shù)據(jù)的存取,1、內(nèi)存地址,內(nèi)存的每個(gè)字節(jié)都有一個(gè)編號(hào),這個(gè)編號(hào)稱為“內(nèi)存地址”。,程序中的每個(gè)數(shù)據(jù)都對(duì)應(yīng)著內(nèi)存中的一個(gè)地址,從該地址開始的一個(gè)或多個(gè)字節(jié)用來(lái)存放該數(shù)據(jù)。,int i, j, k;,i,j,k,2、內(nèi)存單元的地址和內(nèi)存單元的內(nèi)容的區(qū)別:,若i=3, j=5;,從圖中可以看出它們的區(qū)別。,3/55,程序編譯后已經(jīng)沒有i、j、k這些變量名了,而是將變量名轉(zhuǎn)換為變量的地址,計(jì)算機(jī)通過內(nèi)存地址對(duì)變量進(jìn)行存取。,二、直接訪問和間接訪問,1、直接訪問方式:,、i=3;,、j=i+2;,、printf(“%d“, i);,、scanf(“%d“, ,、k=i+j; 如何執(zhí)行?,按變量的地址存取變量的方式,2、間接訪問方式:,語(yǔ)言中可以定義整型變量、實(shí)型變量、字符型變量,各自存放相應(yīng)類型的數(shù)據(jù);另外還可以定義和使用一種特殊類型的變量,用來(lái)存放變量的地址。,4/55,假設(shè)已經(jīng)定義變量 ip 用來(lái)存放整型變量的地址,它被分配到內(nèi)存單元3000和3001。,ip,通過執(zhí)行語(yǔ)句:ip= 將整型變量i 的地址存放到變量ip中,即ip的值為變量i所對(duì)應(yīng)的內(nèi)存單元的起始地址2000。,2000,現(xiàn)在要存取i的值可以這樣做:先找到存放i的地址的內(nèi)存單元地址(3000和3001),從中取出變量i的地址(2000),然后再對(duì)2000和2001單元進(jìn)行存取這就稱為間接訪問。,3、關(guān)于“指向”的含義:,變量ip的值為2000,即變量i的地址,這樣就在ip和i之間建立了一種聯(lián)系:,5/55,通過變量ip知道變量i的地址,從而找到變量i的內(nèi)存單元,因此說變量ip指向變量i,用箭頭表示這種“指向”關(guān)系。,4、為了表示將數(shù)值10送到變量i中,可以有兩種表示方法:,、將10送到變量i所標(biāo)志的單元中;,10,、將10送到變量ip所指向的單元中;,10,6/55,三、指針與指針變量,通過地址能找到所需的變量單元,可以說:地址“指向”該變量單元。因此,把一個(gè)變量的地址稱為該變量的“指針”。,如果一個(gè)變量專門用來(lái)存放另一個(gè)變量的地址,則稱它為“指針變量”。指針變量的值(即指針變量中存放的值)是指針(地址)。,注意區(qū)分“指針”和“指針變量”這兩個(gè)概念。,四、說明,、程序中定義的每個(gè)變量在編譯后都占有各自的內(nèi)存單元,系統(tǒng)是通過內(nèi)存地址對(duì)變量進(jìn)行存取的;,7/55,、數(shù)據(jù)所占有的內(nèi)存單元個(gè)數(shù)是由其數(shù)據(jù)類型決定的;,、首地址:即第一個(gè)單元的地址;,、表示地址的數(shù)與整數(shù)的區(qū)別;,、變量i、j的地址可能相鄰,也可能不相鄰,是由系統(tǒng)分配的,我們不必關(guān)心。,8/55,8.2 指針變量的定義和引用,8.2.1 概述,1、指針運(yùn)算符:*,為了表示指針變量和它所指向的變量之間的聯(lián)系,用“*”表示指向的關(guān)系。,如:ip代表指針變量,*ip表示ip所指向的變量。即*ip也代表一個(gè)變量。,9/55,例:,、若:ip=&i;,i=5;,*ip=5;,結(jié)論:*ip與i等價(jià)。,、x=i+1;,x=*ip+1;,2、取地址運(yùn)算符:&,它與一個(gè)變量連用,以得到該變量的內(nèi)存地址。,3、說明:,、取地址運(yùn)算符只能作用于變量:,不能作用于常量、表達(dá)式或寄存器變量:,、不能把整數(shù)賦值給一個(gè)指針變量:ip=3000;,、不能把一個(gè)指針變量的值賦值給一個(gè)整型變量:x=ip;,10/55,8.2.2 指針變量的定義與賦值,一、指針變量的定義,1、格式:,類型名 *指針變量名;,其中:、“*”表示定義的是指針變量; 、“類型名”用來(lái)指定該指針變量可以指向的變量的類型;,2、例:,int i, *ip;,int *p1, *p2;,float x, *xp;,char *cp1, *cp2;,3、說明:,、“*”只表示定義的變量為指針變量,但指針變量名中并不包含“*”;“*“是指針變量的標(biāo)志,不可丟掉;,、指針變量定義時(shí),指定了它所指向的變量的數(shù)據(jù)類型;,ip=,p1=,xp=,cp1=,xp=,11/55,指針變量定義時(shí)必須指定其所指向的變量的數(shù)據(jù)類型,而且使用過程中只能指向同一種類型的變量。,、指針變量定義后,系統(tǒng)為變量分配一個(gè)存儲(chǔ)單元,用來(lái)存放地址;根據(jù)存儲(chǔ)單元的長(zhǎng)度分為大存儲(chǔ)模式(長(zhǎng)指針,4 Byte)和小存儲(chǔ)模式(短指針,2 Byte);,、指針變量定義后,若不賦值,其值是不確定的。,二、指針變量的賦值,1、賦值語(yǔ)句:,int i, j, *p1, *p2;,p1=,char ch, *cp1, *cp2;,cp1=,2、初始化:,int x=4;,int x; x=4;,int i, *p1=,int i, *p1; p1=,12/55,3、說明:,、指針變量定義后,若不賦值,其值是不確定的;,、可以給指針變量賦空值(NULL),使指針變量不指向任何變量;,ip=NULL;,#define NULL 0,、指針變量的值為空值(NULL)與未對(duì)指針變量賦值,意義不同;,、只能是同類型變量的地址進(jìn)行賦值;,int i, *ip; char ch, *cp;,ip=,ip=,、可以將數(shù)組名或函數(shù)名賦給某些類型的指針變量;,int a10, *ip;,ip=,ip=a;,、不能將一個(gè)整型量(或任何其它非地址類型的數(shù)據(jù))賦給一個(gè)指針變量;,int *ip;,ip=3000;,13/55,4、分析有關(guān)指針的程序時(shí),畫圖是很好的方法:,若有:int i, *p;,p=,i=5;,int i, *p;,p=,&i,i=5;,5,8.2.3 指針變量的引用,int a, *p1, *p2; p1=,int a, *p1, *p2;,p1=,&a,printf(“%x“, p1);,p2=p1;,&a,*p1=3;,3,printf(“%d“, *p1);,14/55,1、兩個(gè)運(yùn)算符:&和*,&:取地址運(yùn)算符;,*:指針運(yùn)算符(間接訪問符);,2、說明:,、&既可作用于一般變量,也可作用于指針變量;,、*只能作用于指針變量;,、表達(dá)式中的*p與變量定義中的*p含義不同;,int i, *p=,、int a, *p=,int a, *p; p=,int a, *p; *p=,3、指針變量可以進(jìn)行的操作:,int a, *p1, *p2;,、賦值:,p1=,p2=p1;,、輸出:,printf(“%x“, p1);,、取內(nèi)容:,*p1=5;,a=5;,printf(“%d“, *p1);,15/55,例8.1,#include void main( ) int a1=11, a2=22; int *p1, *p2; p1= ,&a1,&a2,*p1,*p2,&a1,*p2,*p2,多個(gè)指針可以指向同一個(gè)存儲(chǔ)單元。但在某一時(shí)刻,一個(gè)指針變量只能指向一個(gè)存儲(chǔ)單元,因?yàn)橹羔樧兞吭谀骋粫r(shí)刻只能存放一個(gè)變量的地址值。,Eg801.cpp,16/55,例8.2,#include void main( ) int a1=11, a2=22; int *p1, *p2, *p; p1= ,&a1,&a2,*p1,*p2,&a1,&a2,*p1,*p1,&a1,*p2,*p2,使兩個(gè)指針交換指向,Eg802.cpp,17/55,例8.3,#include void main( ) int a1=11, a2=22, t; int *p1, *p2; p1= ,&a1,*p1,&a2,*p2,11,22,11,交換兩個(gè)指針變量所指向變量的值,Eg803.cpp,18/55,反映了指針變量的引用方法:,、將變量的地址賦給指針變量(p1=&a1),、將一個(gè)指針變量賦給另一個(gè)指針變量(p2=p1),、通過指針變量間接訪問它所指向的變量(*p1),4、*和&運(yùn)算符的進(jìn)一步說明:,、若有:p1= 則*p1等價(jià)于a;,&*p1,&(*p1),&a,、 *&a,*(&a),*p,a,、(*p)+,等價(jià)于:a+,不同于:*p+,*p+,*(p+),19/55,8.2.4 指針作為函數(shù)參數(shù),題目:輸入兩個(gè)整數(shù)a、b,按大小順序輸出。,#include void swap(int x, int y) int temp; temp=x; x=y; y=temp; void main( ) int a, b; printf(“nInput a, b: “); scanf(“%d%d“, ,注意:語(yǔ)言中的函數(shù)調(diào)用采用“傳值”方式,即單向傳遞方式。,即:主調(diào)函數(shù)可以將實(shí)參的值傳遞給被調(diào)函數(shù)的形參,但不能通過改變形參的值而改變實(shí)參的值。,Eg804.cpp,20/55,#include void swap(int *px, int *py) int temp; temp=*px; *px=*py; *py=temp; void main( ) int a, b, *p1, *p2; printf(“nInput a, b: “); scanf(“%d%d“, ,&a,&b,8,5,Eg805.cpp,21/55,#include void swap(int *px, int *py) int *temp; *temp=*px; *px=*py; *py=*temp; void main( ) int a, b, *p1, *p2; printf(“nInput a, b: “); scanf(“%d%d“, ,*temp是指針變量temp所指向的變量,但temp中并無(wú)確定的地址值,其值不確定;*temp所指向的單元也不確定。因此,對(duì)*temp賦值可能會(huì)破壞系統(tǒng)的正常工作狀況。,應(yīng)該將*px的值賦給一個(gè)整型變量,用整型變量作為臨時(shí)存儲(chǔ)空間實(shí)現(xiàn)*px和*py的交換。,22/55,#include void swap(int *px, int *py) int *p; p=px; px=py; py=p; void main( ) int a, b, *p1, *p2; printf(“nInput a, b: “); scanf(“%d%d“, ,&a,&b,&b,&a,Eg806.cpp,23/55,如果想通過函數(shù)調(diào)用得到幾個(gè)要改變的值,可以:,、在主調(diào)函數(shù)中設(shè)n個(gè)變量;,、將n變量的地址作為實(shí)參傳給所調(diào)用的函數(shù)的形參;,、通過形參指針變量,改變?cè)搉個(gè)變量的值;,、主調(diào)函數(shù)就可以使用這些改變了的值;,例8.5 編寫函數(shù),求一維數(shù)組中的最大值和最小值。,void search(int x , int n ) , int *pmax, int *pmin,*pmax=*pmin=x0;,for (i=1; in; i+),if (*pmaxxi) *pmax=xi;,if (*pminxi) *pmin=xi;,int a20, max, min; for (i=0; i20; i+) scanf(“%d“,search(a, 20, ,Eg807.cpp,24/55,8.3 指針與數(shù)組,8.3.1 指向數(shù)組元素的指針變量,1、幾個(gè)概念,、一個(gè)變量有地址,稱變量的地址為該變量的指針;,、每個(gè)數(shù)組都有一個(gè)起始地址,數(shù)組的起始地址稱為數(shù)組的指針;,、一個(gè)數(shù)組包含若干元素,每個(gè)數(shù)組元素都在內(nèi)存中占用一定的存儲(chǔ)單元,即都有相應(yīng)的地址,數(shù)組元素的地址稱為數(shù)組元素的指針;,、指針變量可以指向變量,當(dāng)然也可以指向數(shù)組和數(shù)組元素;,、數(shù)組元素的指針變量就是專門用來(lái)存放數(shù)組元素地址的變量。,2、定義:,類型名 *指針變量名,int a10; int *p;,int a10, *p;,25/55,3、賦值:,p=,&a0,4、說明:,、語(yǔ)言中的數(shù)組名代表數(shù)組首地址,即第0號(hào)元素的地址;,p=,p=a;,、定義時(shí)可以進(jìn)行初始化:,int *p=,int *p; p=,int *p; *p=,int *p=a;,26/55,8.3.2 通過指針訪問一維數(shù)組,1、數(shù)組元素的引用:,int a10, *p;,p=a;,*p=5;,a0=5;,p=,*p=5;,a3=5;,2、語(yǔ)言規(guī)定:無(wú)論數(shù)組的數(shù)據(jù)類型如何,若指針變量p已指向數(shù)組中的某一元素,則p+1指向同一數(shù)組中的下一個(gè)元素(而不是將p簡(jiǎn)單的加1),例如:,、int x10, *p=x;,對(duì)于指向整型數(shù)組的指針變量p,p+1意味著使p在原值的基礎(chǔ)上加2個(gè)字節(jié),以使它指向下一元素;,、float x10, *p=x;,對(duì)于指向float型數(shù)組的指針變量p,p+1意味著使p在原值的基礎(chǔ)上加4個(gè)字節(jié),以使它指向下一元素;,27/55,總之:設(shè)d是一個(gè)數(shù)組元素所占的字節(jié)數(shù),則p+i表示指針移動(dòng)了i個(gè)元素,而它實(shí)際的地址變化為:p+i*d。,3、在使用指針變量引用數(shù)組時(shí),應(yīng)注意以下問題:,、給指針賦初值的方法:,p=a; 或 p=,、p+1或a+1實(shí)際上表示數(shù)組元素a1的地址(&a1);則p+i或a+i表示數(shù)組的第i個(gè)元素的地址(&ai);,、*(p+i)或*(a+i)表示p+i或a+i所指向的數(shù)組元素,即ai;,、指向數(shù)組的指針變量也可以帶下標(biāo);如:pi與*(p+i)等價(jià);,、若p已經(jīng)指向某個(gè)數(shù)組元素ai,則p+j表示指向數(shù)組元素ai+j;,綜上,可以用兩種方法來(lái)引用一個(gè)數(shù)組元素:,、下標(biāo)法:用ai或pi來(lái)引用數(shù)組a中的第i號(hào)元素;,、指針法:用*(p+i)或*(a+i)來(lái)引用數(shù)組中的第i號(hào)元素;,可見:任何由數(shù)組下標(biāo)完成的操作都能由指針來(lái)實(shí)現(xiàn);,ai,*(p+i),&ai,p+i,Eg808.cpp,28/55,4、在使用指針變量時(shí),要注意以下幾個(gè)問題:,、可以使用p+使指針變量p的值不斷改變:,for (p=a; p(a+10); p+) printf(“%4d“, *p);,for (p=a; a(p+10); a+) printf(“%4d“, *a);,、在程序運(yùn)行期間,要始終注意指針變量當(dāng)前所指向的是哪一個(gè)元素;,Eg809.cpp,29/55,可以執(zhí)行p+等操作使p指向不同的數(shù)組元素,通過*p訪問不同的數(shù)組元素。但要始終注意p當(dāng)前所指向的是哪一個(gè)數(shù)組元素!,通過指針在函數(shù)間傳遞一維數(shù)組:,編譯系統(tǒng)都是將形參數(shù)組名作為指針變量來(lái)處理的。,f(int x , int n);,f(int *x, int n);,可以通過xi、*(x+i)來(lái)訪問實(shí)參數(shù)組元素。,要求實(shí)參為指向數(shù)組首元素的指針:,a 或 p,f(a, 10);,f(p, 10);,(p=a;),30/55,小結(jié),int a10, *p; p=a; 或 p=,p為指向數(shù)組元素的指針,語(yǔ)言規(guī)定:數(shù)組名表示數(shù)組的首地址,即第0個(gè)元素的地址;即數(shù)組名是指向數(shù)組第0個(gè)元素的指針常量。,a+i,p+i,表示數(shù)組第 i 個(gè)元素的地址(&ai),即指向第 i 個(gè)元素的指針,*(a+i),*(p+i),表示數(shù)組的第 i 個(gè)元素(ai),ai,pi,表示數(shù)組的第 i 個(gè)元素(ai),數(shù)組第 i 個(gè)元素地址的表示方法:,&ai, a+i, p+i, &pi,數(shù)組第 i 個(gè)元素的表示方法:,ai, *(a+i), *(p+i), pi,31/55,8.3.3 通過指針在函數(shù)間傳遞一維數(shù)組,1、數(shù)組元素作為函數(shù)參數(shù):,void swap(int x, int y);,swap(a1, a2);,2、數(shù)組名作為函數(shù)參數(shù):,void f(int x , int n);,f(a, 10);,數(shù)組名代表數(shù)組首地址。用數(shù)組名作實(shí)參,調(diào)用函數(shù)時(shí)是把數(shù)組首地址傳遞給形參,而不是把數(shù)組的值傳給形參。,x,x0,x1,x2,x3,x4,x5,x6,x7,x8,x9,實(shí)際上能夠接受并存放地址值的只能是指針變量,編譯系統(tǒng)都是將形參數(shù)組名作為指針變量來(lái)處理的。,void f(int *x, int n);,若在函數(shù)調(diào)用期間改變了數(shù)組某一存儲(chǔ)單元的內(nèi)容,則在函數(shù)調(diào)用完畢后,已改變的值被保留下來(lái)。,Eg810.cpp,32/55,變量名與數(shù)組名作函數(shù)參數(shù)時(shí)的比較:,變量名,變量的值,不能,數(shù)組名或指針變量,數(shù)組的起始地址,能,需要說明的是: 語(yǔ)言的函數(shù)調(diào)用都是采用“值傳遞”方式;當(dāng)用變量名作函數(shù)參數(shù)時(shí)傳遞的是變量的值;用數(shù)組名作函數(shù)參數(shù)時(shí),由于數(shù)組名代表的是數(shù)組首地址,因此傳遞的是數(shù)組首地址,所以要求形參為指針變量。,例題:有一個(gè)一維數(shù)組score,內(nèi)放10個(gè)學(xué)生成績(jī),求平均成績(jī)。,3、指針變量可替代數(shù)組名作為函數(shù)的參數(shù):,、指針變量可以作為函數(shù)的形參;,、指針變量可以作為函數(shù)的實(shí)參;,Eg811.cpp、Eg812.cpp,33/55,歸納起來(lái),實(shí)參與形參的對(duì)應(yīng)關(guān)系有:,、形參和實(shí)參都用數(shù)組名:,f(int x , int n);,f(a, 10);,把實(shí)參數(shù)組首地址傳給形參作為形參數(shù)組首地址;,、實(shí)參用數(shù)組名,形參用指針變量:,f(int *x, int n);,f(a, 10);,把實(shí)參數(shù)組首地址傳給形參(指針變量),函數(shù)中用指針訪問實(shí)參數(shù)組,、形參和實(shí)參都用指針變量:,f(int *x, int n);,f(p, 10);,函數(shù)調(diào)用前應(yīng)先給實(shí)參指針變量賦值(如:p=a),、實(shí)參為指針變量,形參為數(shù)組名:,f(int x , int n);,f(p, 10);,實(shí)參通過指針變量為形參提供數(shù)組首地址;,34/55,8.4 指針與字符串,存放字符串的字符數(shù)組是一種特殊的數(shù)組,即以0作為結(jié)束標(biāo)志。在訪問字符串時(shí)候,以0作為結(jié)束條件。,8.4.1 通過指針訪問字符串,一、有關(guān)概念:,1、字符串的指針:,對(duì)應(yīng)的字符數(shù)組在內(nèi)存中存放的首地址;,2、指向字符串的指針變量:,專門用來(lái)存放字符數(shù)組首地址的變量;,3、字符數(shù)組指針變量的定義與賦值:,char *p, str30;,p=str;,p=,二、字符串的表示形式:,1、用字符數(shù)組實(shí)現(xiàn):,void main( ) static char s =“I love China!“; printf(“%sn“, s); ,35/55,2、用字符指針指向一個(gè)字符串:,static char s =“I love China!“; char *p; p=s; printf(“%sn“, p);,對(duì)于指向字符的指針變量,除了可以把字符數(shù)組名(指向字符的指針常量)賦給它外,還可以將一個(gè)字符串常量賦給它。,char *cp; cp=“Hello, world!“;,也可以在定義時(shí)賦初值:,char *cp= “Hello, world!“;,語(yǔ)言在處理字符串常量時(shí),在內(nèi)存中開辟連續(xù)的存儲(chǔ)單元,存放字符串中的各字符和字符串結(jié)束標(biāo)志0。,對(duì)指針變量賦值的作用是:將字符串在內(nèi)存中的首地址賦給指針變量。,Eg813.cpp,36/55,不同于用字符串常量對(duì)字符數(shù)組賦初值:,char ca =“Hello, world!“;,其作用是:將字符串中的各字符和結(jié)束標(biāo)志0存放到數(shù)組ca的各元素中,數(shù)組的首地址用數(shù)組名ca表示。,例8.8:將字符數(shù)組a中的字符串復(fù)制到字符數(shù)組b中。,、下標(biāo)法:,#include void main( ) char a =“Hello, World!“, b20; int i; for (i=0; ai!=0; i+) bi=ai; bi=0; printf(“%sn“, b); ,、指針法:,#include void main( ) char a =“Hello, World!“, b20; char *pa=a, *pb=b; for ( ; *pa!=0; pa+, pb+) *pb=*pa; *pb=0; printf(“%sn“, b); ,Eg814.cpp,37/55,三、字符數(shù)組與字符指針變量的比較:,、字符數(shù)組由若干個(gè)元素組成,每個(gè)元素中存放著一個(gè)字符;而字符指針變量中存放的是地址,不是將字符串放到字符指針變量中;,、賦值方式:,char str20; str20=“I love China!“;,char *ps; ps=“I love China!“;,、對(duì)字符指針變量賦初值:,char *s=“I love China!“;,char *s; s=“I love China!“;,char str =“I love China!“;,char str14; strcpy(str, “I love China!“);,、字符指針變量是可以改變的。,char s20, *ps;,38/55,8.4.2 通過指針在函數(shù)間傳遞字符串,將一個(gè)字符串從一個(gè)函數(shù)傳遞到另一個(gè)函數(shù),可以用地址傳遞的方法,即用字符數(shù)組名、指向字符串的指針變量或其它字符地址表達(dá)式作參數(shù)。,1、用字符數(shù)組作實(shí)參,main( ) char a=“abcdefg“; char b=“12345“; copy_string(a, b); ,void copy_string(char to, char from) int i=0; while (fromi!=0) toi=fromi; i+; toi=0; ,2、用字符指針變量作實(shí)參,char *a=“abcdefg“; char *b=“12345“; copy_string(a, b);,void copy_string(char *to, char *from) for ( ; *from!=0; from+, to+) *to=*from; *to=0; ,Eg815.cpp,39/55,3、可以對(duì)copy_string函數(shù)作下列簡(jiǎn)化:,、,void copy_string(char *to, char *from) while ( (*to=*from)!=0 ) to+; from+; ,while (*to=*from),、,void copy_string(char *to, char *from) while ( (*to+=*from+)!=0 ) ,;,while (*to+=*from+),、,void copy_string(char *to, char *from) while (*from!=0 ) *to+=*from+; ,*to=0;,while (*from),40/55,、,void copy_string(char *to, char *from) for ( ; (*to+=*from+)!=0; ) ; ,、,void copy_string(char *to, char *from) for ( ; (*to+=*from+) ; ) ; ,4、對(duì)copy_string函數(shù)的調(diào)用形式:,char s120=“12345“, s2 =“How are you!“;,copy_string(s1, s2);,s1: “How are you!“,copy_string(s1, s2+2);,s1: “w are you!“,copy_string(s1+2, s2);,s1: “12How are you!“,Eg816.cpp,41/55,8.5 指針與多維數(shù)組,、數(shù)組是具有相同數(shù)據(jù)類型數(shù)據(jù)的集合。數(shù)組的每個(gè)元素又可以是一個(gè)數(shù)組。,、根據(jù)語(yǔ)法規(guī)定:如果 x 指向某一維數(shù)組,則xi與*(x+i)等價(jià),&xi與x+i等價(jià)。,8.5.1 通過指針訪問多維數(shù)組,一、多維數(shù)組的地址:,1、多維數(shù)組的性質(zhì),static int a34=1,3,5,7, 9,11,13,15, 17,19,21,23;,可以認(rèn)為a是具有3個(gè)元素的一維數(shù)組:a0、a1、a2;,a0,a1,a2,每個(gè)元素又是具有4個(gè)整型元素的一維數(shù)組。,42/55,2、數(shù)組名a表示地址,a0,a1,a2,從二維數(shù)組的角度來(lái)看,a為二維數(shù)組名,表示整個(gè)二維數(shù)組的首地址。,若把a(bǔ)看成一維數(shù)組,每個(gè)數(shù)組元素a0、a1、a2占_個(gè)字節(jié)。,8,a表示a0的地址(&a0: 2000);,a+1表示 的地址( );,a+1,&a1,a1,&a1:,2008,a+2表示 的地址( );,a+2,&a2,a2,&a2:,2016,a+1表示:a+81=2008,a+2表示:a+82=2016,a+i表示:a+8i,a+i表示ai的地址&ai,即第i行的地址,它是指向一維數(shù)組的指針。,43/55,3、ai表示地址,a0,a1,a2,a0、a1、a2是一維數(shù)組名。,a0是一維數(shù)組a0的首地址,即第0行一維數(shù)組中第0列元素的地址(&a00);即a0的值為&a00;,a1是一維數(shù)組a1的首地址,即第1行一維數(shù)組中第0列元素的地址(&a10);即a1的值為&a10;,a2是一維數(shù)組a2的首地址,即第2行一維數(shù)組中第0列元素的地址(&a20);即a2的值為&a20;,因此,ai是第i行首元素的地址(指針),它是指向數(shù)組元素的指針。,44/55,4、ai+j表示地址:,ai是第i行首元素的地址。,a0+1表示第0行第1列元素的地址;,&a01,a0+2表示第0行第2列元素的地址;,&a02,a2+3表示第2行第3列元素的地址;,&a23,第i行第j列元素的地址(&aij);,5、*(a+i)表示地址:,*(a+i)等價(jià)于ai,第i行首元素的地址,6、*(a+i)+j表示地址:,*(a+i)+j等價(jià)于ai+j,第i行第j列元素的地址,7、數(shù)組元素aij的表示:,ai+j,*( ),*(a+i),+j,*( ),*(a+i),( ),j,若i=0,a0j可表示為:,*(a0+j)、*(*a+j)、(*a)j,若j=0,ai0可表示為:,*(ai)、*(*(a+i)、(*(a+i)0,45/55,8、(a+i)與*(a+i)的比較:,(a+i)等價(jià)于&ai,*(a+i)等價(jià)于ai,、都表示地址: a+i表示第i行的地址(指針),*(a+i)表示第i行首元素的地址,、它們指向的數(shù)據(jù)類型不同: a+i指向一個(gè)一維數(shù)組(二維數(shù)組的一行、行指針); *(a+i)指向數(shù)組元素;,若進(jìn)行操作:,(a+i)+1:使指針移動(dòng)一維數(shù)組所占字節(jié)總數(shù)(一行、8字節(jié)),*(a+i)+1:使指針移動(dòng)一個(gè)數(shù)組元素所占內(nèi)存字節(jié)總數(shù)(2字節(jié)),9、對(duì)ai性質(zhì)的進(jìn)一步說明:,ai從形式上看是a數(shù)組中第i個(gè)元素。,如果a是一維數(shù)組名,則ai代表a數(shù)組第i個(gè)元素所占的內(nèi)存單元。ai是有物理地址的,占內(nèi)存單元。,如果a是二維數(shù)組,則ai代表一維數(shù)組名。ai本身并不占實(shí)際的內(nèi)存單元,它也不存放a數(shù)組中各個(gè)元素的值;它只是一個(gè)地址。,a、a+i、ai、*(a+i)、*(a+i)+j、ai+j都是地址,*(ai+j)、*(*(a+i)+j)是二維數(shù)組元素aij的值。,46/55,10、關(guān)于&ai的說明:,、不要把&ai簡(jiǎn)單的理解為ai單元的物理地址,因?yàn)椴⒉淮嬖赼i這個(gè)變量。它只是一種地址的計(jì)算方法,能得到第i行的首地址;,、&ai和ai的值是一樣的,但它們的含義不同:,&ai或a+i指向行,而ai或*(a+i)指向列。,當(dāng)列下標(biāo)j為0時(shí),&ai和ai(即ai+j)值相等,即指向同一位置。,、*(a+i)只是ai的另一種表示形式,不要簡(jiǎn)單的認(rèn)為是“a+i所指單元的內(nèi)容”。,對(duì)于二維數(shù)組:a+i=ai=*(a+i)=&ai=&ai0,它們的地址相等。,例:輸出二維數(shù)組有關(guān)的值。,二、指向多維數(shù)組的指針變量,1、指向數(shù)組元素的指針變量,與指向一維數(shù)組元素的指針變量一樣,它用來(lái)專門存放某個(gè)數(shù)組元素的內(nèi)存地址。或者說,用于指向某個(gè)數(shù)組元素,定義方法與指向某種類型變量的指針變量一樣。,Eg817.cpp、Eg818.cpp,47/55,2、指向一維數(shù)組的指針變量,定義: 類型名 (*指針變量名)n,如: int (*p)4,int a4;,、*p有4個(gè)元素,每個(gè)元素為整型;即p所指的對(duì)象是有4個(gè)整型元素的數(shù)組。p為行指針。,、p只能指向一個(gè)包含4個(gè)元素的一維數(shù)組,p的值就是該一維數(shù)組的首地址。p不能指向一維數(shù)組中的元素;,、p+i表示二維數(shù)組中第i行的地址; *(p+i)+j表示第i行第j列元素的地址; *(*(p+i)+j)即數(shù)組元素aij。,例:輸出二維數(shù)組中任一行任一列元素的值。,scanf(“%d%d“, ,Eg819.cpp,48/55,8.5.2 通過指針在函數(shù)間傳遞多維數(shù)組,用數(shù)組名作實(shí)參,則是將二維數(shù)組首行的指針常量(二維數(shù)組名)傳遞給了作為函數(shù)形參的指針變量,該指針變量就指向了二維數(shù)組的第0行。,例:求3行4列二維數(shù)組中的最大元素。,方法一、,int max_value(int (*pa)4, int n) int m=pa00; for (i=0; in; i+) for (j=0; j4; j+) if (mpaij) m=paij; return(m); ,(*(pa+i)+j),(*(pa+i)j,int max_value(int pa 4, int n),int max_value(int 4, int ),int max_value(int (*)4, int ),方法二、,int max_value(int *p, int n) int m=*p; for (i=0; im) m=*p; return(m); ,Eg820.cpp、Eg821.cpp,49/55,8.11 本章小結(jié),
溫馨提示
- 1. 本站所有資源如無(wú)特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 免疫治療在自身免疫性神經(jīng)疾病治療突破與藥物研發(fā)進(jìn)展報(bào)告
- 智能制造項(xiàng)目投資合作協(xié)議
- 從落葉歸根到自然規(guī)律的思考議論文9篇
- 與動(dòng)物伙伴的一天童趣體驗(yàn)童話作文13篇范文
- 醫(yī)療器械行業(yè)經(jīng)銷授權(quán)證明書(8篇)
- 2025年智慧景區(qū)建設(shè)實(shí)施方案:景區(qū)智慧照明系統(tǒng)優(yōu)化方案報(bào)告
- 基于5G網(wǎng)絡(luò)的在線醫(yī)療服務(wù)平臺(tái)穩(wěn)定性與效率評(píng)估報(bào)告
- 2025年動(dòng)物原藥項(xiàng)目規(guī)劃申請(qǐng)報(bào)告
- 企業(yè)員工勞動(dòng)法律法規(guī)風(fēng)險(xiǎn)報(bào)告協(xié)議
- 法律合同法條解析練習(xí)題集
- 老年人權(quán)益保障法知識(shí)講座
- 西部科學(xué)城重慶高新區(qū)引進(jìn)急需緊缺人才38人模擬檢測(cè)試卷【共1000題含答案解析】
- 淺談高血壓的聯(lián)合用藥
- 新護(hù)士五年規(guī)范化培訓(xùn)手冊(cè)
- 醫(yī)學(xué)免疫學(xué)和病原生物學(xué)理論知識(shí)考核試題及答案
- 勝保養(yǎng)操作手冊(cè)江鈴馭
- 疫苗及其制備技術(shù)課件
- 阿里巴巴公司價(jià)值觀實(shí)施細(xì)則
- 安全防范系統(tǒng)設(shè)計(jì)方案
- 《人衛(wèi)版第九版內(nèi)科學(xué)心力衰竭》課件PPT
- 中國(guó)監(jiān)察制度史
評(píng)論
0/150
提交評(píng)論