善于利用指針_第1頁
善于利用指針_第2頁
善于利用指針_第3頁
善于利用指針_第4頁
善于利用指針_第5頁
已閱讀5頁,還剩84頁未讀 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、1 29.1 9.1 指針與指針變量的概念指針與指針變量的概念 10110220120230130240140250150260160232 2、變量地址、變量地址系統(tǒng)分配給變量的內存單元的起始地址系統(tǒng)分配給變量的內存單元的起始地址 420002004200620052001200220033 3、指針與指針變量、指針與指針變量l指針:指針:一個變量的地址一個變量的地址l指針變量:指針變量:專門存放變量地址的變量專門存放變量地址的變量5l 直接訪問:按變量名來存取變量值直接訪問:按變量名來存取變量值l 間接訪問:通過存放變量地址的變量去訪問變量間接訪問:通過存放變量地址的變量去訪問變量.200

2、02004200620052001200220038.1 8.1 指針變量的定義指針變量的定義將20送到i-pointer所指向的的單元中6.200020042006200520012002200378.2 指針變量指針變量1.指針變量的定義指針變量的定義l一般形式:一般形式: 存儲類型存儲類型 數據類型數據類型 *指針名;指針名;合法標識符指針變量本身的存儲類型表示定義指針變量不是*運算符例 int *p1,*p2; float *q ; static char *name;注意:1、int *p1, *p2; 與 int *p1, p2;2、指針變量名是p1,p2 ,不是*p1,*p23、

3、指針變量只能指向定義時所規(guī)定類型的變量,這個規(guī)定 的類型稱為該指針變量的“基類型”。 4、指針變量定義后,變量值不確定,應用前必須先賦值指針的目標變量的數據類型圖圖 未初始化的指針未初始化的指針85、在指針變量說明中,“*”是類型說明符,表示其后的變量是指針類型。而表達式中出現的“*”則是一個運算符用以表示指針變量所指的變量。92.為什么要為指針變量定義類型:為什么要為指針變量定義類型:對指針進行進行移動對指針進行進行移動1個位置的操作,如果是個位置的操作,如果是整數整數型,就意味著移動型,就意味著移動2個字節(jié),如果是個字節(jié),如果是字符字符型,就意味著移動型,就意味著移動1個字節(jié)。這就造成指針

4、移個字節(jié)。這就造成指針移動的不確定性,所以需要規(guī)定一個動的不確定性,所以需要規(guī)定一個基類型基類型。 3.14 2.12pP+14bytepP+1P+2P+312342byte103、指針變量的運算、指針變量的運算 指針運算符指針運算符(“&”和和“*” ) “&”(地址運算符地址運算符) :取變量的存儲地址。:取變量的存儲地址。 “*” (引用運算符引用運算符) :是取指針所指向變量的內容:是取指針所指向變量的內容 。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)先級:高于算術運算符,低于正負號運算符。)優(yōu)先級:高于算術運算符,低于正負號運算符。 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); 輸出結果:-44 3 -42a的地

6、址p的地址p所指向a的內容i_pointer-指針變量,它的內容是地址量*i_pointer-指針的目標變量,它的內容是數據&i_pointer-指針變量占用內存的地址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;此處此處*與與類型名類型名在一起。在一起。此時共同定義指針變量此時共同定義指針變量此處此處*與指針變量一起使用。此與指針變量一起使用。此時時代表指針變量所指向的變量代表指針變量所指向的變量& 關于運算符關于運算符&和和 * 的幾點說明:的幾點說明:(2)結合性)結合性:自右向左自右向左 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函數作用是相 同嗎? 程序中有兩處出現*pointer_1和*pointer_2作用一樣嗎? “pointer_1=&a”和 “pointer_2=&b”能不能寫成“*pointer_1=&a”和 “*pointer_2=&b” *&a =? &*pointer_1=?相同相同不一樣不一樣不能不能相當于相當于 *(&a)=a=100&(* pointe

10、r_1)= &(a)=&a= pointer_1174、&與與*運算符運算符l 含義含義l 兩者關系:互為兩者關系:互為逆運算逆運算l 理解理解200020042006200520012002200318198.2.3 指針的賦值運算(=) 指針的賦值運算:就是把地址賦值給指針變量。 指針的賦值運算可以是以下2種方式: 使用取地址運算符,把地址值賦值給指針變量。使用取地址運算符,把地址值賦值給指針變量。 如:int i, *pi ; pi=&i ; 把指針變量的值賦給另一個指針變量。把指針變量的值賦給另一個指針變量。 如:int i,*pa,*pb; pa=&i ; pb=pa;20注意:注意

11、:1.不允許把一個數賦予指針變量,故下面的賦值是錯誤的:2. 被賦值的指針變量前不能再加“*”說明符,如寫為*p=&a 也是錯誤的。 int *p; p=1000;3.指針變量間的賦值和引用應保證基類型相同。若有定義: 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 使用時要進行使用時要進行強制類型轉換強制類型轉換276 6、引用指針變量、引用指針變量格式:格式: * *指針變量指針變量28【例【例】不同類型的指針操作同一內存變量】不同類型的指針操作同一內存變量 29.2008。30交換前35a1a2P1 &a1P2 &a235a1*p2a2*p1交換后P1 &a2P2 &a1p=p1;p1=p2;p2=p318.2.4.指針變量作為函數參數指針變量作為函數參數地址傳遞地址傳遞函數的參數不僅可以是整型、

14、實型、字符型等數據,還可以函數的參數不僅可以是整型、實型、字符型等數據,還可以是指針類型。它的作用是將一個變量的地址傳送到另一個函是指針類型。它的作用是將一個變量的地址傳送到另一個函數中。特點:數中。特點:共享內存共享內存,“雙向雙向”傳遞傳遞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);例 將數從大到小輸出.20002008200A2002200420065變量a 變量b(main)9 變量tem

15、p 變量y 變量x(swap)559 59COPY328.2.4.指針變量作為函數參數指針變量作為函數參數地址傳遞地址傳遞特點:特點:共享內存共享內存,“雙向雙向”傳遞傳遞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);例 將數從大到小輸出值傳遞.20002008200A2002200420065變量a 變量b(main)9運行結果: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例 將數從大到小輸出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例 將數從大到小輸出運行結果:9,5地址傳遞a,b值被改變,指針變量實現“雙向”傳遞35pointer_1=&a; pointer_2=&b;swap(pointer_1,pointer_2)在函數調用時,將實參變量的值傳遞給形參變量。采取的依然是“值傳遞”方式。 swap(int *p1, int *p2)執(zhí)行swap函數的函數體使*p1和*p2的值互換,也就是使a和b的值互換。 p=*p1;*p1=*p2;*p2=p;函數調用結束后,p1和p2不復存在(已釋放) 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);運行結果:9,9編譯警告!編譯警告!結果不對!結果不對!int x;int *p=&x;例 將數從大到小輸出.20002008200A200220042006200C200E2010.59整型變量a 整型變量b(main)指針pointer_1指針pointer_22000200299200020

20、02COPY(swap)指針p1指針p2指針p*假設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);運行結果:5,9例 將數從大到小輸出值傳遞.20002008200A200220042006200C20

21、0E2010.59整型a 整型b(main)pointer_1pointer_2200020029COPY(swap)整型x整型b整型t555 938例 將數從大到小輸出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運行結果:5,93955p1,p2的值被改變,但不能企圖通過改變指針形參的值而使指針實參的值改變。 所以pointer_1,pointer_2的值不變7.指針變量作為函數參數地址傳遞40注意:函數的調用可以(而且只可以)得注意:函數的調用可以(而且只可以)得到一個返回值(即函數值),而使用指針到一個返回值(即函數值),而使用指針變量作參數,可以得到多個變化了

23、的值。變量作參數,可以得到多個變化了的值。如果不用指針變量是難以做到這一點的。如果不用指針變量是難以做到這一點的。要善于利用指針法。要善于利用指針法。41 例例8.5 輸入輸入3個整數個整數a,b,c,要求按由大,要求按由大到小的順序將它們輸出。用函數實現。到小的順序將它們輸出。用函數實現。解題思路:采用例解題思路:采用例8.3的方法在函數中改的方法在函數中改變這變這3個變量的值。用個變量的值。用swap函數交換兩函數交換兩個變量的值,用個變量的值,用exchange函數改變這函數改變這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;調用結束后不會調用結束后不會改變指針的指向改變指針的指向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; / /* * 星號是標識指針類型的語法符號星號是標識指針類型的語法符號 * */ / * *pa = 8; pa = 8; / /* * 星號是間接運算符號星號是間接運算符號 * */ / a =

26、 a a = a * * 10; 10; / /* * 星號是算術乘運算符號星號是算術乘運算符號 * */ /間接運算間接運算( (* *) )的對象只能是地址量的對象只能是地址量舉舉例例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);運行結果:a:10*pa:10&a:f86(hex)pa:f86(hex)&pa:f88(hex).f86f8af8cf8b整型變量a10指針變量paf87f88f89f866. 指針的例子指針的例子46471 1、指針變量的加、減運算、指針變量的加、減運算8.3 8.3 指針和地址運算指針和地址運算 482 2、指針變量的關系運算、指針變量的關系運算l 若若p1p1和和p

28、2p2指向同一數組,則指向同一數組,則 p1p2 p1p2 p1p2 表示表示p1p1指的元素在后指的元素在后 p1=p2 p1=p2 表示表示p1p1與與p2p2指向同一元素指向同一元素l 若若p1p1與與p2p2不指向同一數組,比較無意義不指向同一數組,比較無意義l p=NULLp=NULL或或p!=NULLp!=NULL491 1、數組的指針、數組的指針8.4 8.4 指針與數組指針與數組 50512 2、指向數組的指針變量、指向數組的指針變量8.4 8.4 指針與數組指針與數組 52 535455 例8.6:輸出數組中的全部元素。main() int a10,i; for(i=0;i1

29、0;i+) ai=i; for(i=0;i5;i+) printf(a%d=%dn,i,ai);(下標法)main() int a10,i; for(i=0;i10;i+) *(a+i)=i; for(i=0;i10;i+) printf(a%d=%dn,i,*(a+i);(通過數組名計算元素的地址,找出元素的值) 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種方法最快。使用下標法引用數組元素: 先計

30、算出數組元素的地址(a+i),然后再找到它指向的存儲單元,讀入或寫入它的值。用指針變量p指向數組元素:它不需要每次重新計算元素地址。56a57想一想:想一想:*ptr+和(和(*ptr)+有沒有有沒有 區(qū)別區(qū)別 ?輸出結果:232458例如: f(int arr,int n) main() int array10; f(array,10); 實際上,能夠接受并存放地址值的只能是指針變量。因此,C編譯系統(tǒng)都是將形參數組名作為指針變量來處理的。上例中f(int arr ,int n) 等價于等價于 f(int *arr, int n) 。8.3.4 指針與數組指針與數組59u數組名作函數參數數組名

31、作函數參數l數組名作函數參數,是數組名作函數參數,是地址傳遞地址傳遞l如果有一個實參數組,想在函數中改變此數組如果有一個實參數組,想在函數中改變此數組的元素的值,實參與形參都可用數組名或指針的元素的值,實參與形參都可用數組名或指針變量。其對應關系有以下變量。其對應關系有以下4種情況:種情況:實參形參數組名指針變量數組名指針變量數組名數組名指針變量指針變量60例 將數組a中的n個整數按相反順序存放 ij 3 7 9 11 0 6 7 5 4 20 1 2 3 4 5 6 7 8 9ijijijji11760594723實參與形參均用數組實參與形參均用數組名名m=461例 將數組a中的n個整數按相

32、反順序存放 實參用數組,形參用指針變量37911067542a0a1a2a3a4a5a6a7a8a9xp=x+ma數組60711594723ijijijjiji62例 將數組a中的n個整數按相反順序存放 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例 將數組a中的n個整數按相反順序存放 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);實參用指針變量,形參用數組64例:從10個數中找出其中最大值和最小值。 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一級指針變量與一維數組的關系一級指針變量與一維數組的關系int *p 與與 int q10 數組名是指針(地址)數組名是指針(地址)常量常量p=q; p+i 是是qi的地址的地址數組元素的表示方法數組元素的表示方法:下標法下標法和和指針法指針法, 即若即若p=q, 則則 pi qi *(p+i) *(q+i) 形參數組形參數組實質上是實質上是指針變量指針變量,即,即int q in

37、t *q在定義指針變量(不是形參)時,在定義指針變量(不是形參)時,不能不能把把int *p 寫成寫成int p;系統(tǒng)只給系統(tǒng)只給p分配能保存一個指針值的內存區(qū)分配能保存一個指針值的內存區(qū)(一般一般2字節(jié));而字節(jié));而給給q分配分配2*10字節(jié)的內存區(qū)字節(jié)的內存區(qū)66u指針與二維數組指針與二維數組l二維數組的地址二維數組的地址對于一維數組:(1)數組名array表示數組的首地址,即array0的地址;(2)數組名array是地址常量(3)array+i是元素arrayi的地址(4)arrayi *(array+i)arrayint array10;67語言允許把一個二維數組分解為多個一維數組

38、來處理。因此數組a可分解為三個一維數組,即a0,a1,a2。每一個一維數組又含有四個元素。 從二維數組的角度來看,a是二維數組名,a代表整個二維數組的首地址,也是二維數組0行的首地址,等于1000。a+1代表第一行的首地址,等于1008 681357911131517192123a0a1a2aa+1a+2a0 a0+1 a0+2 a0+3行指針行指針列指針列指針 a0 *(a+0) *a &a00 行指針行指針 ,列指針列指針69有一個排,下設3個班,每班有4個戰(zhàn)士,排長只管理到班,班長管理戰(zhàn)士。排長A00A01A02A03A10A11A12A13A20A21A22A23A0A1A2班長排長走

39、一步班長走一步排長走一步=A+1=&A1A班長走一步=A00A01A02A03A0A0既是數組名,也是數組首元素地址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. 指向多維數組元素的指針變量指向多維數組元素的指針變量(1) 指向指向數組元素數組元素的指針變量的指針變量 例例8.

40、12 有一個有一個34的二維數組,要求的二維數組,要求用指向元素的指針變量輸出二維數組各用指向元素的指針變量輸出二維數組各元素的值。元素的值。74解題思路:解題思路:u二維數組的元素是整型的,它相當于整型變二維數組的元素是整型的,它相當于整型變量,可以用量,可以用int*型指針變量指向它型指針變量指向它u二維數組的元素在內存中是按行順序存放的二維數組的元素在內存中是按行順序存放的,即存放完序號為,即存放完序號為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、指向多維數組的指針、指向多維數組的指針_數組指針數組指針 773 3、指向多維數組的指針、指向多維數組的指針_數組指針數組指針 78(2) 指向由個元素組成

42、的一維數組的指針指向由個元素組成的一維數組的指針變量變量 例例8.13 輸出二維數組任一行任一列元素的輸出二維數組任一行任一列元素的值。值。解題思路:假設仍然用例解題思路:假設仍然用例8.12程序中的二程序中的二維數組,例維數組,例8.12中定義的指針變量是指向中定義的指針變量是指向變量或數組元素的,現在改用指向一維數變量或數組元素的,現在改用指向一維數組的指針變量。組的指針變量。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. 用指向數組的指針作函數參數用指向數組的指針作函數參數一維數組名可以作為函數參數,多維數組一維數組名可以作為函數參數,多維數組名也可作函數參數。名也可作函數參數。用指針變量作形參,以接受實參數組名傳用指針變量作形參,以接受實參數組名傳遞來的地址。遞來的地址??梢杂袃煞N方法:可以有兩種方法:用指向變量的指針變量用指向變量的指針變量用指向一維數組的指針變量用指向一維數組的指針變量81 例例8.14 有一個班,有一個班,3個學生

44、,各學個學生,各學4門課,門課,計算總平均分數以及第計算總平均分數以及第n個學生的成績。個學生的成績。 解題思路:這個題目是很簡單的。本例用指解題思路:這個題目是很簡單的。本例用指向數組的指針作函數參數。用函數向數組的指針作函數參數。用函數average求總平均成績,用函數求總平均成績,用函數search找找出并輸出第出并輸出第i個學生的成績。個學生的成績。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)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論