




已閱讀5頁,還剩50頁未讀, 繼續(xù)免費閱讀
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)
文檔簡介
第八章,指針,1/55,8.1 指針的概念 8.2 指針變量的定義和引用 8.3 指針與數(shù)組 8.4 指針與字符串 8.5 指針數(shù)組與指向指針的指針 8.6 返回指針值的函數(shù) 8.7 本章要點小結(jié) 8.8 本章程序舉例,2/55,8.1 指針的概念,一、數(shù)據(jù)的存取,1、內(nèi)存地址,內(nèi)存的每個字節(jié)都有一個編號,這個編號稱為“內(nèi)存地址”。,程序中的每個數(shù)據(jù)都對應(yīng)著內(nèi)存中的一個地址,從該地址開始的一個或多個字節(jié)用來存放該數(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)換為變量的地址,計算機通過內(nèi)存地址對變量進行存取。,二、直接訪問和間接訪問,1、直接訪問方式:,、i=3;,、j=i+2;,、printf(“%d“, i);,、scanf(“%d“, ,、k=i+j; 如何執(zhí)行?,按變量的地址存取變量的方式,2、間接訪問方式:,語言中可以定義整型變量、實型變量、字符型變量,各自存放相應(yīng)類型的數(shù)據(jù);另外還可以定義和使用一種特殊類型的變量,用來存放變量的地址。,4/55,假設(shè)已經(jīng)定義變量 ip 用來存放整型變量的地址,它被分配到內(nèi)存單元3000和3001。,ip,通過執(zhí)行語句:ip= 將整型變量i 的地址存放到變量ip中,即ip的值為變量i所對應(yīng)的內(nèi)存單元的起始地址2000。,2000,現(xiàn)在要存取i的值可以這樣做:先找到存放i的地址的內(nèi)存單元地址(3000和3001),從中取出變量i的地址(2000),然后再對2000和2001單元進行存取這就稱為間接訪問。,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,三、指針與指針變量,通過地址能找到所需的變量單元,可以說:地址“指向”該變量單元。因此,把一個變量的地址稱為該變量的“指針”。,如果一個變量專門用來存放另一個變量的地址,則稱它為“指針變量”。指針變量的值(即指針變量中存放的值)是指針(地址)。,注意區(qū)分“指針”和“指針變量”這兩個概念。,四、說明,、程序中定義的每個變量在編譯后都占有各自的內(nèi)存單元,系統(tǒng)是通過內(nèi)存地址對變量進行存取的;,7/55,、數(shù)據(jù)所占有的內(nèi)存單元個數(shù)是由其數(shù)據(jù)類型決定的;,、首地址:即第一個單元的地址;,、表示地址的數(shù)與整數(shù)的區(qū)別;,、變量i、j的地址可能相鄰,也可能不相鄰,是由系統(tǒng)分配的,我們不必關(guān)心。,8/55,8.2 指針變量的定義和引用,8.2.1 概述,1、指針運算符:*,為了表示指針變量和它所指向的變量之間的聯(lián)系,用“*”表示指向的關(guān)系。,如:ip代表指針變量,*ip表示ip所指向的變量。即*ip也代表一個變量。,9/55,例:,、若:ip=&i;,i=5;,*ip=5;,結(jié)論:*ip與i等價。,、x=i+1;,x=*ip+1;,2、取地址運算符:&,它與一個變量連用,以得到該變量的內(nèi)存地址。,3、說明:,、取地址運算符只能作用于變量:,不能作用于常量、表達式或寄存器變量:,、不能把整數(shù)賦值給一個指針變量:ip=3000;,、不能把一個指針變量的值賦值給一個整型變量:x=ip;,10/55,8.2.2 指針變量的定義與賦值,一、指針變量的定義,1、格式:,類型名 *指針變量名;,其中:、“*”表示定義的是指針變量; 、“類型名”用來指定該指針變量可以指向的變量的類型;,2、例:,int i, *ip;,int *p1, *p2;,float x, *xp;,char *cp1, *cp2;,3、說明:,、“*”只表示定義的變量為指針變量,但指針變量名中并不包含“*”;“*“是指針變量的標(biāo)志,不可丟掉;,、指針變量定義時,指定了它所指向的變量的數(shù)據(jù)類型;,ip=,p1=,xp=,cp1=,xp=,11/55,指針變量定義時必須指定其所指向的變量的數(shù)據(jù)類型,而且使用過程中只能指向同一種類型的變量。,、指針變量定義后,系統(tǒng)為變量分配一個存儲單元,用來存放地址;根據(jù)存儲單元的長度分為大存儲模式(長指針,4 Byte)和小存儲模式(短指針,2 Byte);,、指針變量定義后,若不賦值,其值是不確定的。,二、指針變量的賦值,1、賦值語句:,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)與未對指針變量賦值,意義不同;,、只能是同類型變量的地址進行賦值;,int i, *ip; char ch, *cp;,ip=,ip=,、可以將數(shù)組名或函數(shù)名賦給某些類型的指針變量;,int a10, *ip;,ip=,ip=a;,、不能將一個整型量(或任何其它非地址類型的數(shù)據(jù))賦給一個指針變量;,int *ip;,ip=3000;,13/55,4、分析有關(guān)指針的程序時,畫圖是很好的方法:,若有: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、兩個運算符:&和*,&:取地址運算符;,*:指針運算符(間接訪問符);,2、說明:,、&既可作用于一般變量,也可作用于指針變量;,、*只能作用于指針變量;,、表達式中的*p與變量定義中的*p含義不同;,int i, *p=,、int a, *p=,int a, *p; p=,int a, *p; *p=,3、指針變量可以進行的操作:,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,多個指針可以指向同一個存儲單元。但在某一時刻,一個指針變量只能指向一個存儲單元,因為指針變量在某一時刻只能存放一個變量的地址值。,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,使兩個指針交換指向,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,交換兩個指針變量所指向變量的值,Eg803.cpp,18/55,反映了指針變量的引用方法:,、將變量的地址賦給指針變量(p1=&a1),、將一個指針變量賦給另一個指針變量(p2=p1),、通過指針變量間接訪問它所指向的變量(*p1),4、*和&運算符的進一步說明:,、若有:p1= 則*p1等價于a;,&*p1,&(*p1),&a,、 *&a,*(&a),*p,a,、(*p)+,等價于:a+,不同于:*p+,*p+,*(p+),19/55,8.2.4 指針作為函數(shù)參數(shù),題目:輸入兩個整數(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“, ,注意:語言中的函數(shù)調(diào)用采用“傳值”方式,即單向傳遞方式。,即:主調(diào)函數(shù)可以將實參的值傳遞給被調(diào)函數(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中并無確定的地址值,其值不確定;*temp所指向的單元也不確定。因此,對*temp賦值可能會破壞系統(tǒng)的正常工作狀況。,應(yīng)該將*px的值賦給一個整型變量,用整型變量作為臨時存儲空間實現(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)用得到幾個要改變的值,可以:,、在主調(diào)函數(shù)中設(shè)n個變量;,、將n變量的地址作為實參傳給所調(diào)用的函數(shù)的形參;,、通過形參指針變量,改變該n個變量的值;,、主調(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、幾個概念,、一個變量有地址,稱變量的地址為該變量的指針;,、每個數(shù)組都有一個起始地址,數(shù)組的起始地址稱為數(shù)組的指針;,、一個數(shù)組包含若干元素,每個數(shù)組元素都在內(nèi)存中占用一定的存儲單元,即都有相應(yīng)的地址,數(shù)組元素的地址稱為數(shù)組元素的指針;,、指針變量可以指向變量,當(dāng)然也可以指向數(shù)組和數(shù)組元素;,、數(shù)組元素的指針變量就是專門用來存放數(shù)組元素地址的變量。,2、定義:,類型名 *指針變量名,int a10; int *p;,int a10, *p;,25/55,3、賦值:,p=,&a0,4、說明:,、語言中的數(shù)組名代表數(shù)組首地址,即第0號元素的地址;,p=,p=a;,、定義時可以進行初始化:,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、語言規(guī)定:無論數(shù)組的數(shù)據(jù)類型如何,若指針變量p已指向數(shù)組中的某一元素,則p+1指向同一數(shù)組中的下一個元素(而不是將p簡單的加1),例如:,、int x10, *p=x;,對于指向整型數(shù)組的指針變量p,p+1意味著使p在原值的基礎(chǔ)上加2個字節(jié),以使它指向下一元素;,、float x10, *p=x;,對于指向float型數(shù)組的指針變量p,p+1意味著使p在原值的基礎(chǔ)上加4個字節(jié),以使它指向下一元素;,27/55,總之:設(shè)d是一個數(shù)組元素所占的字節(jié)數(shù),則p+i表示指針移動了i個元素,而它實際的地址變化為:p+i*d。,3、在使用指針變量引用數(shù)組時,應(yīng)注意以下問題:,、給指針賦初值的方法:,p=a; 或 p=,、p+1或a+1實際上表示數(shù)組元素a1的地址(&a1);則p+i或a+i表示數(shù)組的第i個元素的地址(&ai);,、*(p+i)或*(a+i)表示p+i或a+i所指向的數(shù)組元素,即ai;,、指向數(shù)組的指針變量也可以帶下標(biāo);如:pi與*(p+i)等價;,、若p已經(jīng)指向某個數(shù)組元素ai,則p+j表示指向數(shù)組元素ai+j;,綜上,可以用兩種方法來引用一個數(shù)組元素:,、下標(biāo)法:用ai或pi來引用數(shù)組a中的第i號元素;,、指針法:用*(p+i)或*(a+i)來引用數(shù)組中的第i號元素;,可見:任何由數(shù)組下標(biāo)完成的操作都能由指針來實現(xiàn);,ai,*(p+i),&ai,p+i,Eg808.cpp,28/55,4、在使用指針變量時,要注意以下幾個問題:,、可以使用p+使指針變量p的值不斷改變:,for (p=a; p(a+10); p+) printf(“%4d“, *p);,for (p=a; a(p+10); a+) printf(“%4d“, *a);,、在程序運行期間,要始終注意指針變量當(dāng)前所指向的是哪一個元素;,Eg809.cpp,29/55,可以執(zhí)行p+等操作使p指向不同的數(shù)組元素,通過*p訪問不同的數(shù)組元素。但要始終注意p當(dāng)前所指向的是哪一個數(shù)組元素!,通過指針在函數(shù)間傳遞一維數(shù)組:,編譯系統(tǒng)都是將形參數(shù)組名作為指針變量來處理的。,f(int x , int n);,f(int *x, int n);,可以通過xi、*(x+i)來訪問實參數(shù)組元素。,要求實參為指向數(shù)組首元素的指針:,a 或 p,f(a, 10);,f(p, 10);,(p=a;),30/55,小結(jié),int a10, *p; p=a; 或 p=,p為指向數(shù)組元素的指針,語言規(guī)定:數(shù)組名表示數(shù)組的首地址,即第0個元素的地址;即數(shù)組名是指向數(shù)組第0個元素的指針常量。,a+i,p+i,表示數(shù)組第 i 個元素的地址(&ai),即指向第 i 個元素的指針,*(a+i),*(p+i),表示數(shù)組的第 i 個元素(ai),ai,pi,表示數(shù)組的第 i 個元素(ai),數(shù)組第 i 個元素地址的表示方法:,&ai, a+i, p+i, &pi,數(shù)組第 i 個元素的表示方法:,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ù)組名作實參,調(diào)用函數(shù)時是把數(shù)組首地址傳遞給形參,而不是把數(shù)組的值傳給形參。,x,x0,x1,x2,x3,x4,x5,x6,x7,x8,x9,實際上能夠接受并存放地址值的只能是指針變量,編譯系統(tǒng)都是將形參數(shù)組名作為指針變量來處理的。,void f(int *x, int n);,若在函數(shù)調(diào)用期間改變了數(shù)組某一存儲單元的內(nèi)容,則在函數(shù)調(diào)用完畢后,已改變的值被保留下來。,Eg810.cpp,32/55,變量名與數(shù)組名作函數(shù)參數(shù)時的比較:,變量名,變量的值,不能,數(shù)組名或指針變量,數(shù)組的起始地址,能,需要說明的是: 語言的函數(shù)調(diào)用都是采用“值傳遞”方式;當(dāng)用變量名作函數(shù)參數(shù)時傳遞的是變量的值;用數(shù)組名作函數(shù)參數(shù)時,由于數(shù)組名代表的是數(shù)組首地址,因此傳遞的是數(shù)組首地址,所以要求形參為指針變量。,例題:有一個一維數(shù)組score,內(nèi)放10個學(xué)生成績,求平均成績。,3、指針變量可替代數(shù)組名作為函數(shù)的參數(shù):,、指針變量可以作為函數(shù)的形參;,、指針變量可以作為函數(shù)的實參;,Eg811.cpp、Eg812.cpp,33/55,歸納起來,實參與形參的對應(yīng)關(guān)系有:,、形參和實參都用數(shù)組名:,f(int x , int n);,f(a, 10);,把實參數(shù)組首地址傳給形參作為形參數(shù)組首地址;,、實參用數(shù)組名,形參用指針變量:,f(int *x, int n);,f(a, 10);,把實參數(shù)組首地址傳給形參(指針變量),函數(shù)中用指針訪問實參數(shù)組,、形參和實參都用指針變量:,f(int *x, int n);,f(p, 10);,函數(shù)調(diào)用前應(yīng)先給實參指針變量賦值(如:p=a),、實參為指針變量,形參為數(shù)組名:,f(int x , int n);,f(p, 10);,實參通過指針變量為形參提供數(shù)組首地址;,34/55,8.4 指針與字符串,存放字符串的字符數(shù)組是一種特殊的數(shù)組,即以0作為結(jié)束標(biāo)志。在訪問字符串時候,以0作為結(jié)束條件。,8.4.1 通過指針訪問字符串,一、有關(guān)概念:,1、字符串的指針:,對應(yīng)的字符數(shù)組在內(nèi)存中存放的首地址;,2、指向字符串的指針變量:,專門用來存放字符數(shù)組首地址的變量;,3、字符數(shù)組指針變量的定義與賦值:,char *p, str30;,p=str;,p=,二、字符串的表示形式:,1、用字符數(shù)組實現(xiàn):,void main( ) static char s =“I love China!“; printf(“%sn“, s); ,35/55,2、用字符指針指向一個字符串:,static char s =“I love China!“; char *p; p=s; printf(“%sn“, p);,對于指向字符的指針變量,除了可以把字符數(shù)組名(指向字符的指針常量)賦給它外,還可以將一個字符串常量賦給它。,char *cp; cp=“Hello, world!“;,也可以在定義時賦初值:,char *cp= “Hello, world!“;,語言在處理字符串常量時,在內(nèi)存中開辟連續(xù)的存儲單元,存放字符串中的各字符和字符串結(jié)束標(biāo)志0。,對指針變量賦值的作用是:將字符串在內(nèi)存中的首地址賦給指針變量。,Eg813.cpp,36/55,不同于用字符串常量對字符數(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ù)組由若干個元素組成,每個元素中存放著一個字符;而字符指針變量中存放的是地址,不是將字符串放到字符指針變量中;,、賦值方式:,char str20; str20=“I love China!“;,char *ps; ps=“I love China!“;,、對字符指針變量賦初值:,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ù)間傳遞字符串,將一個字符串從一個函數(shù)傳遞到另一個函數(shù),可以用地址傳遞的方法,即用字符數(shù)組名、指向字符串的指針變量或其它字符地址表達式作參數(shù)。,1、用字符數(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、用字符指針變量作實參,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、可以對copy_string函數(shù)作下列簡化:,、,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、對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ù)組的每個元素又可以是一個數(shù)組。,、根據(jù)語法規(guī)定:如果 x 指向某一維數(shù)組,則xi與*(x+i)等價,&xi與x+i等價。,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個元素的一維數(shù)組:a0、a1、a2;,a0,a1,a2,每個元素又是具有4個整型元素的一維數(shù)組。,42/55,2、數(shù)組名a表示地址,a0,a1,a2,從二維數(shù)組的角度來看,a為二維數(shù)組名,表示整個二維數(shù)組的首地址。,若把a看成一維數(shù)組,每個數(shù)組元素a0、a1、a2占_個字節(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)等價于ai,第i行首元素的地址,6、*(a+i)+j表示地址:,*(a+i)+j等價于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)等價于&ai,*(a+i)等價于ai,、都表示地址: a+i表示第i行的地址(指針),*(a+i)表示第i行首元素的地址,、它們指向的數(shù)據(jù)類型不同: a+i指向一個一維數(shù)組(二維數(shù)組的一行、行指針); *(a+i)指向數(shù)組元素;,若進行操作:,(a+i)+1:使指針移動一維數(shù)組所占字節(jié)總數(shù)(一行、8字節(jié)),*(a+i)+1:使指針移動一個數(shù)組元素所占內(nèi)存字節(jié)總數(shù)(2字節(jié)),9、對ai性質(zhì)的進一步說明:,ai從形式上看是a數(shù)組中第i個元素。,如果a是一維數(shù)組名,則ai代表a數(shù)組第i個元素所占的內(nèi)存單元。ai是有物理地址的,占內(nèi)存單元。,如果a是二維數(shù)組,則ai代表一維數(shù)組名。ai本身并不占實際的內(nèi)存單元,它也不存放a數(shù)組中各個元素的值;它只是一個地址。,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簡單的理解為ai單元的物理地址,因為并不存在ai這個變量。它只是一種地址的計算方法,能得到第i行的首地址;,、&ai和ai的值是一樣的,但它們的含義不同:,&ai或a+i指向行,而ai或*(a+i)指向列。,當(dāng)列下標(biāo)j為0時,&ai和ai(即ai+j)值相等,即指向同一位置。,、*(a+i)只是ai的另一種表示形式,不要簡單的認(rèn)為是“a+i所指單元的內(nèi)容”。,對于二維數(shù)組:a+i=ai=*(a+i)=&ai=&ai0,它們的地址相等。,例:輸出二維數(shù)組有關(guān)的值。,二、指向多維數(shù)組的指針變量,1、指向數(shù)組元素的指針變量,與指向一維數(shù)組元素的指針變量一樣,它用來專門存放某個數(shù)組元素的內(nèi)存地址。或者說,用于指向某個數(shù)組元素,定義方法與指向某種類型變量的指針變量一樣。,Eg817.cpp、Eg818.cpp,47/55,2、指向一維數(shù)組的指針變量,定義: 類型名 (*指針變量名)n,如: int (*p)4,int a4;,、*p有4個元素,每個元素為整型;即p所指的對象是有4個整型元素的數(shù)組。p為行指針。,、p只能指向一個包含4個元素的一維數(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ù)組的第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. 本站所有資源如無特殊說明,都需要本地電腦安裝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)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 焦作大學(xué)《數(shù)據(jù)挖掘概論》2023-2024學(xué)年第二學(xué)期期末試卷
- 濟南職業(yè)學(xué)院《醫(yī)療器械生物相容性評價》2023-2024學(xué)年第二學(xué)期期末試卷
- 張家口學(xué)院《汽車故障診斷與維修》2023-2024學(xué)年第二學(xué)期期末試卷
- 山東經(jīng)貿(mào)職業(yè)學(xué)院《儀器分析實驗》2023-2024學(xué)年第二學(xué)期期末試卷
- 對外經(jīng)濟貿(mào)易大學(xué)《能源化學(xué)與化工》2023-2024學(xué)年第二學(xué)期期末試卷
- 大學(xué)生就業(yè)安全教育
- 濟寧職業(yè)技術(shù)學(xué)院《行政法(上)》2023-2024學(xué)年第二學(xué)期期末試卷
- 山東旅游職業(yè)學(xué)院《中國古代文學(xué)四》2023-2024學(xué)年第二學(xué)期期末試卷
- 浙江師范大學(xué)《會計信息系統(tǒng)》2023-2024學(xué)年第二學(xué)期期末試卷
- 廈門大學(xué)《GMDSS綜合業(yè)務(wù)》2023-2024學(xué)年第二學(xué)期期末試卷
- 梁柱加固施工方案
- 排水管道閉水試驗施工方案
- 《C語言程序設(shè)計》教學(xué)設(shè)計 項目四量化生活數(shù)字為先
- T-CSOE 0003-2024 井下套管外永置式光纜安裝要求
- 軍人生死觀教育
- 江西省萍鄉(xiāng)市上栗縣2024-2025學(xué)年小升初語文模擬試卷(有答案)
- GB 45247-2025燃氣-蒸汽聯(lián)合循環(huán)發(fā)電機組單位產(chǎn)品能源消耗限額
- 2025屆湖北省建設(shè)投資集團有限公司校園招聘124人筆試參考題庫附帶答案詳解
- 科技成果轉(zhuǎn)化及科技企業(yè)成長
- QC/T 1211-2024乘用車車門內(nèi)開拉手總成
- 音響設(shè)備維修合同
評論
0/150
提交評論