版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、1 29.1 9.1 指針與指針變量的概念指針與指針變量的概念 10110220120230130240140250150260160232 2、變量地址、變量地址系統(tǒng)分配給變量的內(nèi)存單元的起始地址系統(tǒng)分配給變量的內(nèi)存單元的起始地址 420002004200620052001200220033 3、指針與指針變量、指針與指針變量l指針:指針:一個變量的地址一個變量的地址l指針變量:指針變量:專門存放變量地址的變量專門存放變量地址的變量5l 直接訪問:按變量名來存取變量值直接訪問:按變量名來存取變量值l 間接訪問:通過存放變量地址的變量去訪問變量間接訪問:通過存放變量地址的變量去訪問變量.200
2、02004200620052001200220038.1 8.1 指針變量的定義指針變量的定義將20送到i-pointer所指向的的單元中6.200020042006200520012002200378.2 指針變量指針變量1.指針變量的定義指針變量的定義l一般形式:一般形式: 存儲類型存儲類型 數(shù)據(jù)類型數(shù)據(jù)類型 *指針名;指針名;合法標(biāo)識符指針變量本身的存儲類型表示定義指針變量不是*運算符例 int *p1,*p2; float *q ; static char *name;注意:1、int *p1, *p2; 與 int *p1, p2;2、指針變量名是p1,p2 ,不是*p1,*p23、
3、指針變量只能指向定義時所規(guī)定類型的變量,這個規(guī)定 的類型稱為該指針變量的“基類型”。 4、指針變量定義后,變量值不確定,應(yīng)用前必須先賦值指針的目標(biāo)變量的數(shù)據(jù)類型圖圖 未初始化的指針未初始化的指針85、在指針變量說明中,“*”是類型說明符,表示其后的變量是指針類型。而表達(dá)式中出現(xiàn)的“*”則是一個運算符用以表示指針變量所指的變量。92.為什么要為指針變量定義類型:為什么要為指針變量定義類型:對指針進(jìn)行進(jìn)行移動對指針進(jìn)行進(jìn)行移動1個位置的操作,如果是個位置的操作,如果是整數(shù)整數(shù)型,就意味著移動型,就意味著移動2個字節(jié),如果是個字節(jié),如果是字符字符型,就意味著移動型,就意味著移動1個字節(jié)。這就造成指針
4、移個字節(jié)。這就造成指針移動的不確定性,所以需要規(guī)定一個動的不確定性,所以需要規(guī)定一個基類型基類型。 3.14 2.12pP+14bytepP+1P+2P+312342byte103、指針變量的運算、指針變量的運算 指針運算符指針運算符(“&”和和“*” ) “&”(地址運算符地址運算符) :取變量的存儲地址。:取變量的存儲地址。 “*” (引用運算符引用運算符) :是取指針?biāo)赶蜃兞康膬?nèi)容:是取指針?biāo)赶蜃兞康膬?nèi)容 。ptr指向了變量i ,*ptr表示i的值,即3 如:如: int *p , i=3, j=5; p=&i; /*把把i的地址賦給的地址賦給p,讓,讓p其指向變量其指向變量i */
5、這里,這里,*p與變量與變量i是等價的。是等價的。11定義后定義后:100010021004ijp(1)優(yōu)先級:高于算術(shù)運算符,低于正負(fù)號運算符。)優(yōu)先級:高于算術(shù)運算符,低于正負(fù)號運算符。 int i , j , *p; /*此行的“*”與下面的不同*/ p=&i; *p=3; j=*p+2;p=&i后后:100010021004ijp1000*p=3后后:100010021004ijp10003j=*p+2后后:100010021004ijp10003512main()int a,*p;a=3;p=&a;printf(%d %d %d,p,*p,&p); 輸出結(jié)果:-44 3 -42a的地
6、址p的地址p所指向a的內(nèi)容i_pointer-指針變量,它的內(nèi)容是地址量*i_pointer-指針的目標(biāo)變量,它的內(nèi)容是數(shù)據(jù)&i_pointer-指針變量占用內(nèi)存的地址13例例8.1 通通過指針變量訪問整型變量。過指針變量訪問整型變量。解題思路:先定義解題思路:先定義2個整型變量,再定個整型變量,再定義義2個指針變量,分別指向這兩個整型個指針變量,分別指向這兩個整型變量,通過訪問指針變量,可以找到它變量,通過訪問指針變量,可以找到它們所指向的變量,從而得到這些變量的們所指向的變量,從而得到這些變量的值。值。14#include int main() int a=100,b=10; int *p
7、ointer_1, *pointer_2; pointer_1=&a; pointer_2=&b; printf(“a=%d,b=%dn”,a,b); printf(“*pointer_1=%d,*pointer_2= %dn”,*pointer_1,*pointer_2); return 0;定義兩個指針變量定義兩個指針變量使使pointer_1指向指向a使使pointer_2指向指向b直接直接輸出變量輸出變量a和和b的值的值間接間接輸出變量輸出變量a和和b的值的值15#include int main() int a=100,b=10; int *pointer_1, *pointer_2
8、; pointer_1=&a; pointer_2=&b; printf(“a=%d,b=%dn”,a,b); printf(“*pointer_1=%d,*pointer_2= %dn”,*pointer_1,*pointer_2); return 0;此處此處*與與類型名類型名在一起。在一起。此時共同定義指針變量此時共同定義指針變量此處此處*與指針變量一起使用。此與指針變量一起使用。此時時代表指針變量所指向的變量代表指針變量所指向的變量& 關(guān)于運算符關(guān)于運算符&和和 * 的幾點說明:的幾點說明:(2)結(jié)合性)結(jié)合性:自右向左自右向左 main() int a,b; int *pointer
9、_1, *pointer_2; a=100;b=10; pointer_1=&a; pointer_2=&b; printf(%d,%dn,a,b); printf(%d,%dn,*pointer_1, *pointer_2); 兩個printf函數(shù)作用是相 同嗎? 程序中有兩處出現(xiàn)*pointer_1和*pointer_2作用一樣嗎? “pointer_1=&a”和 “pointer_2=&b”能不能寫成“*pointer_1=&a”和 “*pointer_2=&b” *&a =? &*pointer_1=?相同相同不一樣不一樣不能不能相當(dāng)于相當(dāng)于 *(&a)=a=100&(* pointe
10、r_1)= &(a)=&a= pointer_1174、&與與*運算符運算符l 含義含義l 兩者關(guān)系:互為兩者關(guān)系:互為逆運算逆運算l 理解理解200020042006200520012002200318198.2.3 指針的賦值運算(=) 指針的賦值運算:就是把地址賦值給指針變量。 指針的賦值運算可以是以下2種方式: 使用取地址運算符,把地址值賦值給指針變量。使用取地址運算符,把地址值賦值給指針變量。 如:int i, *pi ; pi=&i ; 把指針變量的值賦給另一個指針變量。把指針變量的值賦給另一個指針變量。 如:int i,*pa,*pb; pa=&i ; pb=pa;20注意:注意
11、:1.不允許把一個數(shù)賦予指針變量,故下面的賦值是錯誤的:2. 被賦值的指針變量前不能再加“*”說明符,如寫為*p=&a 也是錯誤的。 int *p; p=1000;3.指針變量間的賦值和引用應(yīng)保證基類型相同。若有定義: int *p , i ; float *q , x ;則:q=&i ; p=&x ; 21例 main( ) int i=10; int *p; *p=i; printf(“%d”,*p); 危險!例 main( ) int i=10,k; int *p; p=&k; *p=i; printf(“%d”,*p); 指針變量必須指針變量必須先賦值先賦值, ,再使用再使用.2000
12、200420062005整型變量i10指針變量p200120022003隨機222324例:int i,j,*p1,*p2; i=a; j=b; p1=&i; p2=&j;p2=p1*p2=*p1; 255 5、零指針與空類型指針、零指針與空類型指針零指針:零指針:( (空指針空指針) )l 定義定義: : 指針變量值為零指針變量值為零l 表示:表示: int * p = 0; l p = NULL p = NULL與未對與未對p p賦值不同賦值不同l 用途用途: : 避免指針變量的非法引用避免指針變量的非法引用在程序中常作為在程序中常作為狀態(tài)狀態(tài)比較比較 說明:說明:NULLNULL是包含是
13、包含stdio.hstdio.h中的一個系統(tǒng)常量,代表中的一個系統(tǒng)常量,代表0 0值值26void *類型指針類型指針l 表示表示: void *p; l 使用時要進(jìn)行使用時要進(jìn)行強制類型轉(zhuǎn)換強制類型轉(zhuǎn)換276 6、引用指針變量、引用指針變量格式:格式: * *指針變量指針變量28【例【例】不同類型的指針操作同一內(nèi)存變量】不同類型的指針操作同一內(nèi)存變量 29.2008。30交換前35a1a2P1 &a1P2 &a235a1*p2a2*p1交換后P1 &a2P2 &a1p=p1;p1=p2;p2=p318.2.4.指針變量作為函數(shù)參數(shù)指針變量作為函數(shù)參數(shù)地址傳遞地址傳遞函數(shù)的參數(shù)不僅可以是整型、
14、實型、字符型等數(shù)據(jù),還可以函數(shù)的參數(shù)不僅可以是整型、實型、字符型等數(shù)據(jù),還可以是指針類型。它的作用是將一個變量的地址傳送到另一個函是指針類型。它的作用是將一個變量的地址傳送到另一個函數(shù)中。特點:數(shù)中。特點:共享內(nèi)存共享內(nèi)存,“雙向雙向”傳遞傳遞swap(int x,int y) int temp; temp=x; x=y; y=temp;main() int a,b; scanf(%d,%d,&a,&b); if(ab) swap(a,b); printf(n%d,%dn,a,b);例 將數(shù)從大到小輸出.20002008200A2002200420065變量a 變量b(main)9 變量tem
15、p 變量y 變量x(swap)559 59COPY328.2.4.指針變量作為函數(shù)參數(shù)指針變量作為函數(shù)參數(shù)地址傳遞地址傳遞特點:特點:共享內(nèi)存共享內(nèi)存,“雙向雙向”傳遞傳遞swap(int x,int y) int temp; temp=x; x=y; y=temp;main() int a,b; scanf(%d,%d,&a,&b); if(ab) swap(a,b); printf(n%d,%dn,a,b);例 將數(shù)從大到小輸出值傳遞.20002008200A2002200420065變量a 變量b(main)9運行結(jié)果:5, 9x=9,y=5不能企圖通過改變形參的值而使實參的值改變。 3
16、3swap(int *p1, int *p2) int p; p=*p1; *p1=*p2; *p2=p;main() int a,b; int *pointer_1,*pointer_2; scanf(%d,%d,&a,&b); pointer_1=&a; pointer_2=&b; if(ab)swap(pointer_1,pointer_2); printf(n%d,%dn,a,b);.20002008200A200220042006200C200E2010.59整型變量a 整型變量b(main)指針pointer_1指針pointer_220002002(swap)指針p1指針p2整型
17、p5920002002COPY5例 將數(shù)從大到小輸出34swap(int *p1, int *p2) int p; p=*p1; *p1=*p2; *p2=p;main() int a,b; int *pointer_1,*pointer_2; scanf(%d,%d,&a,&b); pointer_1=&a; pointer_2=&b; if(ab)swap(pointer_1,pointer_2); printf(n%d,%dn,a,b);.20002008200A200220042006200C200E2010.59整型變量a 整型變量b(main)指針pointer_1指針pointe
18、r_22000200259例 將數(shù)從大到小輸出運行結(jié)果:9,5地址傳遞a,b值被改變,指針變量實現(xiàn)“雙向”傳遞35pointer_1=&a; pointer_2=&b;swap(pointer_1,pointer_2)在函數(shù)調(diào)用時,將實參變量的值傳遞給形參變量。采取的依然是“值傳遞”方式。 swap(int *p1, int *p2)執(zhí)行swap函數(shù)的函數(shù)體使*p1和*p2的值互換,也就是使a和b的值互換。 p=*p1;*p1=*p2;*p2=p;函數(shù)調(diào)用結(jié)束后,p1和p2不復(fù)存在(已釋放) 36swap(int *p1, int *p2) int *p; *p=*p1; *p1=*p2; *
19、p2=*p;main() int a,b; int *pointer_1,*pointer_2; scanf(%d,%d,&a,&b); pointer_1=&a; pointer_2=&b; if(ab) swap(pointer_1,pointer_2); printf(n%d,%dn,a,b);運行結(jié)果:9,9編譯警告!編譯警告!結(jié)果不對!結(jié)果不對!int x;int *p=&x;例 將數(shù)從大到小輸出.20002008200A200220042006200C200E2010.59整型變量a 整型變量b(main)指針pointer_1指針pointer_22000200299200020
20、02COPY(swap)指針p1指針p2指針p*假設(shè)2000指針變量在使用前必須賦值!p是指針變量,*p1是整型變量a。37swap(int x,int y) int t; t=x; x=y; y=t;main() int a,b; int *pointer_1,*pointer_2; scanf(%d,%d,&a,&b); pointer_1=&a; pointer_2=&b; if(ab) swap(*pointer_1,*pointer_2); printf(n%d,%dn,a,b);運行結(jié)果:5,9例 將數(shù)從大到小輸出值傳遞.20002008200A200220042006200C20
21、0E2010.59整型a 整型b(main)pointer_1pointer_2200020029COPY(swap)整型x整型b整型t555 938例 將數(shù)從大到小輸出swap(int *p1, int *p2) int *p; p=p1; p1=p2; p2=p;main() int a,b; int *pointer_1,*pointer_2; scanf(%d,%d,&a,&b); pointer_1=&a; pointer_2=&b; if(ab) swap(pointer_1,pointer_2); printf(%d,%d,*pointer_1,*pointer_2);.2000
22、2008200A200220042006200C200E2010.59整型a 整型b(main)pointer_1pointer_22000200220002002COPY(swap)指針p1指針p2指針p*2000地址傳遞20002002運行結(jié)果:5,93955p1,p2的值被改變,但不能企圖通過改變指針形參的值而使指針實參的值改變。 所以pointer_1,pointer_2的值不變7.指針變量作為函數(shù)參數(shù)地址傳遞40注意:函數(shù)的調(diào)用可以(而且只可以)得注意:函數(shù)的調(diào)用可以(而且只可以)得到一個返回值(即函數(shù)值),而使用指針到一個返回值(即函數(shù)值),而使用指針變量作參數(shù),可以得到多個變化了
23、的值。變量作參數(shù),可以得到多個變化了的值。如果不用指針變量是難以做到這一點的。如果不用指針變量是難以做到這一點的。要善于利用指針法。要善于利用指針法。41 例例8.5 輸入輸入3個整數(shù)個整數(shù)a,b,c,要求按由大,要求按由大到小的順序?qū)⑺鼈冚敵?。用函?shù)實現(xiàn)。到小的順序?qū)⑺鼈冚敵?。用函?shù)實現(xiàn)。解題思路:采用例解題思路:采用例8.3的方法在函數(shù)中改的方法在函數(shù)中改變這變這3個變量的值。用個變量的值。用swap函數(shù)交換兩函數(shù)交換兩個變量的值,用個變量的值,用exchange函數(shù)改變這函數(shù)改變這3個變量的值。個變量的值。42#include int main() void exchange(int *
24、q1, int *q2, int *q3); int a,b,c,*p1,*p2,*p3; scanf(%d,%d,%d,&a,&b,&c); p1=&a;p2=&b;p3=&c; exchange(p1,p2,p3); printf(“%d,%d,%dn,a,b,c); return 0;調(diào)用結(jié)束后不會調(diào)用結(jié)束后不會改變指針的指向改變指針的指向43void exchange(int *q1, int *q2, int *q3) void swap(int *pt1, int *pt2); if(*q1*q2) swap(q1,q2); if(*q1*q3) swap(q1,q3); if(*
25、q2*q3) swap(q2,q3); void swap(int *pt1, int *pt2) int temp; temp=*pt1; *pt1=*pt2; *pt2=temp; 交換指針指交換指針指向的變量值向的變量值44(2)(2)注意事項注意事項同一符號在不同的場合作用不同同一符號在不同的場合作用不同舉舉例例intint a; a; intint * *pa = &a; pa = &a; / /* * 星號是標(biāo)識指針類型的語法符號星號是標(biāo)識指針類型的語法符號 * */ / * *pa = 8; pa = 8; / /* * 星號是間接運算符號星號是間接運算符號 * */ / a =
26、 a a = a * * 10; 10; / /* * 星號是算術(shù)乘運算符號星號是算術(shù)乘運算符號 * */ /間接運算間接運算( (* *) )的對象只能是地址量的對象只能是地址量舉舉例例intint a; a; intint * *pa = &a; pa = &a; * *papa = 8; = 8; / /* * 通過指針通過指針p p給給a a存了存了8 8 * */ / * *&a&a = 100; = 100; / /* * 通過指針常量通過指針常量&a&a給給a a存了存了100 100 * */ /45例1 指針的概念main() int a; int *pa=&a; a=10;
27、 printf(a:%dn,a); printf(*pa:%dn,*pa); printf(&a:%x(hex)n,&a); printf(pa:%x(hex)n,pa); printf(&pa:%x(hex)n,&pa);運行結(jié)果:a:10*pa:10&a:f86(hex)pa:f86(hex)&pa:f88(hex).f86f8af8cf8b整型變量a10指針變量paf87f88f89f866. 指針的例子指針的例子46471 1、指針變量的加、減運算、指針變量的加、減運算8.3 8.3 指針和地址運算指針和地址運算 482 2、指針變量的關(guān)系運算、指針變量的關(guān)系運算l 若若p1p1和和p
28、2p2指向同一數(shù)組,則指向同一數(shù)組,則 p1p2 p1p2 p1p2 表示表示p1p1指的元素在后指的元素在后 p1=p2 p1=p2 表示表示p1p1與與p2p2指向同一元素指向同一元素l 若若p1p1與與p2p2不指向同一數(shù)組,比較無意義不指向同一數(shù)組,比較無意義l p=NULLp=NULL或或p!=NULLp!=NULL491 1、數(shù)組的指針、數(shù)組的指針8.4 8.4 指針與數(shù)組指針與數(shù)組 50512 2、指向數(shù)組的指針變量、指向數(shù)組的指針變量8.4 8.4 指針與數(shù)組指針與數(shù)組 52 535455 例8.6:輸出數(shù)組中的全部元素。main() int a10,i; for(i=0;i1
29、0;i+) ai=i; for(i=0;i5;i+) printf(a%d=%dn,i,ai);(下標(biāo)法)main() int a10,i; for(i=0;i10;i+) *(a+i)=i; for(i=0;i10;i+) printf(a%d=%dn,i,*(a+i);(通過數(shù)組名計算元素的地址,找出元素的值) main() int a10,i,*p; p=a; for(i=0;i10;i+) *(p+i)=i; for(i=0;i10;i+) printf(a%d=%dn,i,*(p+i);(用指針變量指向元素) 第1,2種方法執(zhí)行效率相同。第3種方法最快。使用下標(biāo)法引用數(shù)組元素: 先計
30、算出數(shù)組元素的地址(a+i),然后再找到它指向的存儲單元,讀入或?qū)懭胨闹怠S弥羔樧兞縫指向數(shù)組元素:它不需要每次重新計算元素地址。56a57想一想:想一想:*ptr+和(和(*ptr)+有沒有有沒有 區(qū)別區(qū)別 ?輸出結(jié)果:232458例如: f(int arr,int n) main() int array10; f(array,10); 實際上,能夠接受并存放地址值的只能是指針變量。因此,C編譯系統(tǒng)都是將形參數(shù)組名作為指針變量來處理的。上例中f(int arr ,int n) 等價于等價于 f(int *arr, int n) 。8.3.4 指針與數(shù)組指針與數(shù)組59u數(shù)組名作函數(shù)參數(shù)數(shù)組名
31、作函數(shù)參數(shù)l數(shù)組名作函數(shù)參數(shù),是數(shù)組名作函數(shù)參數(shù),是地址傳遞地址傳遞l如果有一個實參數(shù)組,想在函數(shù)中改變此數(shù)組如果有一個實參數(shù)組,想在函數(shù)中改變此數(shù)組的元素的值,實參與形參都可用數(shù)組名或指針的元素的值,實參與形參都可用數(shù)組名或指針變量。其對應(yīng)關(guān)系有以下變量。其對應(yīng)關(guān)系有以下4種情況:種情況:實參形參數(shù)組名指針變量數(shù)組名指針變量數(shù)組名數(shù)組名指針變量指針變量60例 將數(shù)組a中的n個整數(shù)按相反順序存放 ij 3 7 9 11 0 6 7 5 4 20 1 2 3 4 5 6 7 8 9ijijijji11760594723實參與形參均用數(shù)組實參與形參均用數(shù)組名名m=461例 將數(shù)組a中的n個整數(shù)按相
32、反順序存放 實參用數(shù)組,形參用指針變量37911067542a0a1a2a3a4a5a6a7a8a9xp=x+ma數(shù)組60711594723ijijijjiji62例 將數(shù)組a中的n個整數(shù)按相反順序存放 void inv(int *x, int n) int t,*i,*j,*p,m=(n-1)/2; i=x; j=x+n-1; p=x+m; for(;i=p;i+,j-) t=*i; *i=*j; *j=t; main() int i,a10,*p=a; for(i=0;i10;i+,p+) scanf(%d,p); p=a; inv(p,10); printf(The array has
33、been reverted:n); for(p=a;pa+10;p+) printf(%d,*p);實參與形參均用指針變量63例 將數(shù)組a中的n個整數(shù)按相反順序存放 void inv(int x, int n) int t,i,j,m=(n-1)/2; for(i=0;i=m;i+) j=n-1-i; t=xi; xi=xj; xj=t; main() int i,a10,*p=a; for(i=0;i10;i+,p+) scanf(%d,p); p=a; inv(p,10); printf(The array has been reverted:n); for(p=arr;parr+10;p
34、+) printf(%d ,*p);實參用指針變量,形參用數(shù)組64例:從10個數(shù)中找出其中最大值和最小值。 int max,min; /*全局變量*/void max_min_value(int array,int n)int *p,*array_end; array_end=array+n; max=min=*array; for(p=array+1;pmax)max=*p; else if (*pmin)min=*p; return;main()int i,number10; printf(enter 10 integer umbers:n); for(i=0;i10;i+) scanf(
35、%d,&numberi); max_min_value(number,10);printf(nmax=%d,min=%dn,max,min); int max,min; /*全局變量*/void max_min_value(int *array,int n)int *p,*array_end; array_end=array+n; max=min=*array; for(p=array+1;pmax)max=*p; else if (*pmin)min=*p; return;main()int i,number10,*p; p=number; printf(enter 10 integer u
36、mbers:n); for(i=0;i10;i+,p+) scanf(%d,p); p=number; max_min_value(p,10); printf(nmax=%d,min=%dn,max,min);65l一級指針變量與一維數(shù)組的關(guān)系一級指針變量與一維數(shù)組的關(guān)系int *p 與與 int q10 數(shù)組名是指針(地址)數(shù)組名是指針(地址)常量常量p=q; p+i 是是qi的地址的地址數(shù)組元素的表示方法數(shù)組元素的表示方法:下標(biāo)法下標(biāo)法和和指針法指針法, 即若即若p=q, 則則 pi qi *(p+i) *(q+i) 形參數(shù)組形參數(shù)組實質(zhì)上是實質(zhì)上是指針變量指針變量,即,即int q in
37、t *q在定義指針變量(不是形參)時,在定義指針變量(不是形參)時,不能不能把把int *p 寫成寫成int p;系統(tǒng)只給系統(tǒng)只給p分配能保存一個指針值的內(nèi)存區(qū)分配能保存一個指針值的內(nèi)存區(qū)(一般一般2字節(jié));而字節(jié));而給給q分配分配2*10字節(jié)的內(nèi)存區(qū)字節(jié)的內(nèi)存區(qū)66u指針與二維數(shù)組指針與二維數(shù)組l二維數(shù)組的地址二維數(shù)組的地址對于一維數(shù)組:(1)數(shù)組名array表示數(shù)組的首地址,即array0的地址;(2)數(shù)組名array是地址常量(3)array+i是元素arrayi的地址(4)arrayi *(array+i)arrayint array10;67語言允許把一個二維數(shù)組分解為多個一維數(shù)組
38、來處理。因此數(shù)組a可分解為三個一維數(shù)組,即a0,a1,a2。每一個一維數(shù)組又含有四個元素。 從二維數(shù)組的角度來看,a是二維數(shù)組名,a代表整個二維數(shù)組的首地址,也是二維數(shù)組0行的首地址,等于1000。a+1代表第一行的首地址,等于1008 681357911131517192123a0a1a2aa+1a+2a0 a0+1 a0+2 a0+3行指針行指針列指針列指針 a0 *(a+0) *a &a00 行指針行指針 ,列指針列指針69有一個排,下設(shè)3個班,每班有4個戰(zhàn)士,排長只管理到班,班長管理戰(zhàn)士。排長A00A01A02A03A10A11A12A13A20A21A22A23A0A1A2班長排長走
39、一步班長走一步排長走一步=A+1=&A1A班長走一步=A00A01A02A03A0A0既是數(shù)組名,也是數(shù)組首元素地址A0=&A00=*(A+0)A0+1A0+1=*(A+0)+1=*A+1=&A01行指針列指針70 a+i = &ai = ai = *(a+i) = &ai0, 值相等,含義不同值相等,含義不同 a+i &ai,表示第表示第i行首地址行首地址,指向行,指向行 ai *(a+i) &ai0,表示第表示第i行第行第0列元素地址,指向列列元素地址,指向列7172732. 指向多維數(shù)組元素的指針變量指向多維數(shù)組元素的指針變量(1) 指向指向數(shù)組元素數(shù)組元素的指針變量的指針變量 例例8.
40、12 有一個有一個34的二維數(shù)組,要求的二維數(shù)組,要求用指向元素的指針變量輸出二維數(shù)組各用指向元素的指針變量輸出二維數(shù)組各元素的值。元素的值。74解題思路:解題思路:u二維數(shù)組的元素是整型的,它相當(dāng)于整型變二維數(shù)組的元素是整型的,它相當(dāng)于整型變量,可以用量,可以用int*型指針變量指向它型指針變量指向它u二維數(shù)組的元素在內(nèi)存中是按行順序存放的二維數(shù)組的元素在內(nèi)存中是按行順序存放的,即存放完序號為,即存放完序號為0的行中的全部元素后,的行中的全部元素后,接著存放序號為接著存放序號為1的行中的全部元素,依此的行中的全部元素,依此類推類推u因此可以用一個指向整型元素的指針變量,因此可以用一個指向整型
41、元素的指針變量,依次指向各個元素依次指向各個元素75#include int main() int a34=1,3,5,7,9,11,13,15, 17,19,21,23; int *p; for(p=a0;pa0+12;p+) if(p-a0)%4=0) printf(“n”); printf(“%4d”,*p); printf(n); return 0;控制換行控制換行逐個訪問各元素時常用此類指針逐個訪問各元素時常用此類指針763 3、指向多維數(shù)組的指針、指向多維數(shù)組的指針_數(shù)組指針數(shù)組指針 773 3、指向多維數(shù)組的指針、指向多維數(shù)組的指針_數(shù)組指針數(shù)組指針 78(2) 指向由個元素組成
42、的一維數(shù)組的指針指向由個元素組成的一維數(shù)組的指針變量變量 例例8.13 輸出二維數(shù)組任一行任一列元素的輸出二維數(shù)組任一行任一列元素的值。值。解題思路:假設(shè)仍然用例解題思路:假設(shè)仍然用例8.12程序中的二程序中的二維數(shù)組,例維數(shù)組,例8.12中定義的指針變量是指向中定義的指針變量是指向變量或數(shù)組元素的,現(xiàn)在改用指向一維數(shù)變量或數(shù)組元素的,現(xiàn)在改用指向一維數(shù)組的指針變量。組的指針變量。79#include int main()int a34=1,3,5,7,9,11,13,15, 17,19,21,23; int (*p)4,i,j; p=a; printf(“enter row and colu
43、m:); scanf(“%d,%d”,&i,&j); printf(“a%d,%d=%dn”, i,j,*(*(p+i)+j); return 0;行指針行指針aij803. 用指向數(shù)組的指針作函數(shù)參數(shù)用指向數(shù)組的指針作函數(shù)參數(shù)一維數(shù)組名可以作為函數(shù)參數(shù),多維數(shù)組一維數(shù)組名可以作為函數(shù)參數(shù),多維數(shù)組名也可作函數(shù)參數(shù)。名也可作函數(shù)參數(shù)。用指針變量作形參,以接受實參數(shù)組名傳用指針變量作形參,以接受實參數(shù)組名傳遞來的地址。遞來的地址。可以有兩種方法:可以有兩種方法:用指向變量的指針變量用指向變量的指針變量用指向一維數(shù)組的指針變量用指向一維數(shù)組的指針變量81 例例8.14 有一個班,有一個班,3個學(xué)生
44、,各學(xué)個學(xué)生,各學(xué)4門課,門課,計算總平均分?jǐn)?shù)以及第計算總平均分?jǐn)?shù)以及第n個學(xué)生的成績。個學(xué)生的成績。 解題思路:這個題目是很簡單的。本例用指解題思路:這個題目是很簡單的。本例用指向數(shù)組的指針作函數(shù)參數(shù)。用函數(shù)向數(shù)組的指針作函數(shù)參數(shù)。用函數(shù)average求總平均成績,用函數(shù)求總平均成績,用函數(shù)search找找出并輸出第出并輸出第i個學(xué)生的成績。個學(xué)生的成績。82#include int main() void average(float *p,int n); void search(float (*p)4,int n); float score34=65,67,70,60, 80,87,90,81,90,99,100,98; average(*score,12); search(score,2)
溫馨提示
- 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 石河子大學(xué)《食品工程原理二》2021-2022學(xué)年第一學(xué)期期末試卷
- 石河子大學(xué)《現(xiàn)代人工智能技術(shù)》2023-2024學(xué)年期末試卷
- 石河子大學(xué)《家畜繁殖學(xué)》2022-2023學(xué)年第一學(xué)期期末試卷
- 沈陽理工大學(xué)《自動控制理論》2021-2022學(xué)年期末試卷
- 沈陽理工大學(xué)《建筑模型制作與工藝》2021-2022學(xué)年第一學(xué)期期末試卷
- 沈陽理工大學(xué)《電工與電子技術(shù)實驗》2023-2024學(xué)年期末試卷
- 光伏代理商合同范本
- 沈陽理工大學(xué)《環(huán)境設(shè)計》2021-2022學(xué)年第一學(xué)期期末試卷
- 海事法院 合同解除 典型案例
- 合同到期的續(xù)簽申請書
- 農(nóng)業(yè)昆蟲分類-螨類
- MT-T 1201.1-2023 煤礦感知數(shù)據(jù)聯(lián)網(wǎng)接入規(guī)范 第1部分:安全監(jiān)控
- 胎盤早剝應(yīng)急預(yù)案演練腳本
- 四川省綿陽市某中學(xué)自主招生物理試卷(含答案)
- 2023年湖南省中小學(xué)教師系列專業(yè)技術(shù)職稱職務(wù)評審表
- 我要的是葫蘆教學(xué)設(shè)計萬冬霞(五篇)
- 常見地質(zhì)災(zāi)害及其自救方法演示文稿
- 臨戰(zhàn)轉(zhuǎn)換措施
- 氧化還原反應(yīng)電化學(xué)基礎(chǔ)
- GB/T 5269-1999傳動及輸送用雙節(jié)距精密滾子鏈和鏈輪
- GB/T 30790.8-2014色漆和清漆防護(hù)涂料體系對鋼結(jié)構(gòu)的防腐蝕保護(hù)第8部分:新建和維護(hù)技術(shù)規(guī)格書的制定
評論
0/150
提交評論