版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、第第7 7章章 指針指針 存儲地址的變量的類型就是指針類型存儲地址的變量的類型就是指針類型 能直接對內存地址操作能直接對內存地址操作, 實現(xiàn)動態(tài)存儲管理實現(xiàn)動態(tài)存儲管理 容易產生副作用容易產生副作用, 初學者常會出錯初學者常會出錯 學習時應特別細心學習時應特別細心, 多動腦、多對比、多上機多動腦、多對比、多上機 7.1.1 變量的地址和變量的值變量的地址和變量的值內存編址內存編址:內存是連續(xù)的存儲空間。內存是連續(xù)的存儲空間。 對內存進行了編址對內存進行了編址內存編址是連續(xù)的內存編址是連續(xù)的, 它的基本單位為字節(jié)它的基本單位為字節(jié)內存分配:內存分配:系統(tǒng)根據(jù)類型為變量分配內存單元系統(tǒng)根據(jù)類型為變
2、量分配內存單元變量內存單元的起始地址即為變量的地址變量內存單元的起始地址即為變量的地址編譯后編譯后, 每個變量名對應一個地址每個變量名對應一個地址對變量的訪問就是通過這個地址進行的對變量的訪問就是通過這個地址進行的變量引用:變量引用:從變量名對應的地址開始的若干內存單元從變量名對應的地址開始的若干內存單元(字節(jié)數(shù)由定義字節(jié)數(shù)由定義類型確定類型確定)中取出數(shù)據(jù)中取出數(shù)據(jù); 變量賦值:變量賦值:將數(shù)據(jù)按該變量定義的類型存入對應的內存單元中將數(shù)據(jù)按該變量定義的類型存入對應的內存單元中內存單元的內容就是變量的值。內存單元的內容就是變量的值。程序中: int i; float k; 內存中每個字節(jié)有一個
3、編號-地址.2000200120022005內存02003ik 編譯或函數(shù)調用時為其分配內存單元變量是對程序中數(shù)據(jù)存儲空間的抽象 #includevoid main() int* p; int a; p=&a; scanf(“%d”,&a); printf(“%d %d”,*p, a); scanf(“%d”, p); printf(“%d %d”,*p, a); *p=*p+2; printf(“%d %d”,*p, a); a=a+2; printf(“%d %d”,*p, a);.2000200420062005變量a10變量p200120022003指針:一個變量的地址
4、指針:一個變量的地址指針變量:專門存放變量地址的變量叫指針變量指針變量:專門存放變量地址的變量叫指針變量2000指針指針變量 變量的內容 變量的地址指針變量變量變量地址(指針)變量值指向地址存入指針變量整型變量定義格式: 基類型名 *指針變量名 =&變量名 char *p1; int *p2; float *p3; 指針變量賦值 char a,*pa; pa=&a; 指針變量的引用指針變量的引用 *pa=a;兩個與指針有關的運算符 &:取地址運算符,取其右邊變量的地址。 如: &a 取變量a的地址。 *:指向運算符(“間接訪問”運算符) 訪問右邊指針變量所指向的
5、變量。 如:*p 是指針變量p所指向的變量。 &與*運算符 兩者關系:互為逆運算 理解.2000200420062005整型變量i10變量i_pointer2001200220032000指針變量i_pointer-指針變量,它的內容是地址量*i_pointer-指針的目標變量,它的內容是數(shù)據(jù)&i_pointer-指針變量占用內存的地址200010i_pointer*i_pointer&i_pointerii_pointer = &i = &(*i_pointer)i = *i_pointer = *(&i)注意注意:(1) 指針變量定義和引用時
6、指針變量定義和引用時“*”含義有差別。含義有差別。 在引用中在引用中 “*”是是運算符運算符,。 表示指針變量指向的變量。表示指針變量指向的變量。 在指針變量定義時在指針變量定義時“*”理解為指針類型理解為指針類型定義符定義符 表示定義的變量是指針變量。表示定義的變量是指針變量。(2) 不能引用沒有賦值的指針變量不能引用沒有賦值的指針變量。(。(盲指針盲指針) (3) p=&a;是給指針變量是給指針變量p賦值賦值。 *p=3; 是給是給p指向的變量賦值。指向的變量賦值。 兩者含義完全不同。兩者含義完全不同。(4)必須用同類型的指針給指針變量賦值。必須用同類型的指針給指針變量賦值。 指針
7、變量只存放地址指針變量只存放地址。 不能直接用整型量不能直接用整型量(或非地址量或非地址量)賦值給指針變量。賦值給指針變量。 直接訪問與間接訪問直接訪問與間接訪問直接訪問:按變量名存取變量值直接訪問:按變量名存取變量值間接訪問:通過存放變量地址的變量去訪問變量間接訪問:通過存放變量地址的變量去訪問變量例 i=3; -直接訪問指針變量.2000200420062005整型變量i10變量i_pointer20012002200320003例 *i_pointer=20; -間接訪問20前提條件前提條件 i_pointer=&i;指針變量.2000200420062005整型變量i10變量i
8、_pointer2001200220032000整型變量k例 int k, i, i_pointer=&i; k=i; -直接訪問 k=*i_pointer; -間接訪問10例例 7.1 取地址運算符取地址運算符&和指向運算符和指向運算符*的應用。的應用。main() int m, n; int *p=&m,*q=&n; printf(Input m,n:); scanf(%d %d,p,&n); /* 指針變量指針變量p之前不加之前不加&,它與它與&m相同相同 */ printf(m=%d &m=%Xn,m,&m); p
9、rintf(*p=%d p=%Xn,*p,p); printf(n=%d &n=%Xn,n,&n); printf(*q=%d q=%Xn,*q,q);#includevoid swap(int *p1,int *p2);main() int x,y; printf(Input x,y: ); scanf(%d %d,&x, &y); if(xy) swap(&x, &y); printf(Sorted: %d %d n,x,y);void swap(int *p1,int *p2) int p; p=*p1; *p1=*p2; *p2=p;7.
10、2.3 函數(shù)中用指針變量作形參實現(xiàn)變量的引用傳遞7.3 7.3 指針與數(shù)組指針與數(shù)組 數(shù)組名代表該數(shù)組數(shù)組名代表該數(shù)組下標為下標為0的的元素地址(數(shù)組首地址)元素地址(數(shù)組首地址) 數(shù)組名與指針是相同的概念數(shù)組名與指針是相同的概念 數(shù)組名是指針類型的符號常量數(shù)組名是指針類型的符號常量7.3.1 指向一維數(shù)組元素的指針指向一維數(shù)組元素的指針1.定義指向數(shù)組元素的指針變量定義指向數(shù)組元素的指針變量int a10; /* 數(shù)組元素是整型變量數(shù)組元素是整型變量 */int *p; /* 定義定義p是指向整型變量的指針變量是指向整型變量的指針變量 */p=&a0; /* 賦值后賦值后p指向指向a
11、數(shù)組的數(shù)組的0號元素號元素 */p=&a5; /* 賦值后賦值后p指向指向a數(shù)組的數(shù)組的5號元素號元素 */ p=&a0; 和和 p=a; 兩句等價兩句等價2.2.指針運算指針運算1 1、指針變量可以和整數(shù)做加減操作、指針變量可以和整數(shù)做加減操作2 2、指針變量加減一個整數(shù)指針變量加減一個整數(shù)n, n, 表示指針前后移動表示指針前后移動n n個元素個元素 3 3、地址值增減量等于所指向變量占的字節(jié)數(shù)、地址值增減量等于所指向變量占的字節(jié)數(shù)sizeof(type) sizeof(type) int a10; int *p1=&a5; / /* * 定義了定義了p1p1指向整
12、數(shù)類型指向整數(shù)類型(d=2),(d=2),初值為初值為a5a5的地址的地址 * */ /p1- -; / /* * p1 p1減減1, p11, p1指向指向a4,a4,地址值減地址值減(1(1sizeof(int) sizeof(int) * */ /p1+=3; / /* * p1 p1加加3, p13, p1指向指向a7,a7,地址值加地址值加(3(3sizeof(it) sizeof(it) * */ /兩個同類型指針可以相減得到一個整數(shù)兩個同類型指針可以相減得到一個整數(shù), ,等于對應元素下標差,等于對應元素下標差,等于地址值的差除以地址步進單位。等于地址值的差除以地址步進單位。 兩個
13、指針之間不能進行加法、乘法、除法等算術運算。兩個指針之間不能進行加法、乘法、除法等算術運算。 空指針空指針定義定義: :指針變量值為零指針變量值為零表示:表示: int int * * p=0; p=0; p指向地址為0的單元,系統(tǒng)保證該單元不作它用表示指針變量值沒有意義#define NULL 0int *p=NULL:p=NULLp=NULL與未對與未對p p賦值不同賦值不同用途用途: : 避免指針變量的非法引用避免指針變量的非法引用 在程序中常作為在程序中常作為狀態(tài)狀態(tài)比較比較 例 int *p; . while(p!=NULL) . 例 main( ) int i=10; int *p
14、; *p=i; printf(“%d”,*p); 危險!例 main( ) int i=10,k; int *p; p=&k; *p=i; printf(“%d”,*p); 指針變量必須先賦值,再使用.2000200420062005整型變量i10指針變量p200120022003隨機3.3.通過指針引用數(shù)組元素通過指針引用數(shù)組元素#includevoid main() int a10,i; for(i=0;i10;i+) scanf(“%d”,&ai); for(i=0;i10;i+) printf(“%d”,ai);#includevoid main() int a10,i
15、,*p; p=a; for(i=0;i10;i+) scanf(“%d”,p+i); for(i=0;i10;i+) printf(“%d”, *(p+i);#includevoid main() int a10,*p; for(p=a;pa+10;p+) scanf(“%d”,p); for(p=a;pa+10;p+) printf(“%d”, *p);#includevoid main() int a10,i,*p; for(p=a ,i=0; i10; i+,p+) scanf(“%d”,p); for(p=a ,i=0; i10; i+,p+) printf(“%d”, *p);例例
16、7.4 數(shù)組名與指向數(shù)組元素的指針變量。數(shù)組名與指向數(shù)組元素的指針變量。main() int a5=10,20,30,40,50, *p=a; printf(p=%x p+1=%xn,p,p+1); printf(a=%x a+1=%xn,a,a+1); /* a地址值地址值步進單位是步進單位是2不是不是10 */ printf(&a0=%x &a1=%x n,&a0,&a1); printf(*p+2=%d *(p+2)=%dn,*p+2,*(p+2); /* 注意注意*p+2和和*(p+2)的區(qū)別的區(qū)別 */ printf(*a+2=%d *(a+2)=%d
17、n,*a+2,*(a+2);4.4.地址越界問題地址越界問題 (1)(1)不要引用沒有賦值的不要引用沒有賦值的指針指針變量變量, , 使使用指針用指針變量前變量前一定要對它正確賦值。在選擇結構的程序中一定要對它正確賦值。在選擇結構的程序中, , 每一個每一個分支路徑都應在引用分支路徑都應在引用指針指針變量之前對它正確賦值。變量之前對它正確賦值。(2)(2) 用指針用指針變量訪問數(shù)組元素變量訪問數(shù)組元素, , 隨時要檢查隨時要檢查指針指針的變的變化范圍化范圍, , 始終不能超越上下界。始終不能超越上下界。(3)(3)指針指針運算中注意各運算符的優(yōu)先級和結合順序運算中注意各運算符的優(yōu)先級和結合順序
18、, , 多使用括號多使用括號, , 使程序容易理解。使程序容易理解。 指針變量重新賦值后指針變量重新賦值后, , 其中的地址值發(fā)生了變化其中的地址值發(fā)生了變化, , 新的地址值新的地址值是否指向所需要的變量是否指向所需要的變量, , 新的地址值是否有實際意義新的地址值是否有實際意義, , 系統(tǒng)對系統(tǒng)對此都不作檢查此都不作檢查, , 需要由程序員自己檢查需要由程序員自己檢查 5.5.用數(shù)組名或指針變量作函數(shù)參數(shù)。用數(shù)組名或指針變量作函數(shù)參數(shù)。例例 7.6 通過調用一個函數(shù)通過調用一個函數(shù), 將整型數(shù)組的所有元素加將整型數(shù)組的所有元素加10。參數(shù)傳遞用四種方法實現(xiàn)。參數(shù)傳遞用四種方法實現(xiàn)。(1)
19、程序如下:程序如下: #include void add(int b , int n) int i; for(i=0; in; i+) bi+=10; void main( ) int i, a10= 1,2,3,4,5,6,7,8,9,10; add(a,10); for(i=0; i10; i+) printf(%4d,ai); #include void add(int *p, int n) int *pend=p+n; for(; ppend; p+) *p+=10;void main( ) int a10=1,2,3,4,5,6,7,8,9,10, *q=a; add(q,10);
20、for(q=a;qa+10;q+) printf(%4d,*q); (2) 程序如下:程序如下:(3) 程序如下:程序如下: #include void add(int *p, int n) int *pend=p+n; for(; ppend; p+) *p+=10;void main( ) int i, a10= 1,2,3,4,5,6,7,8,9,10; add(a,10); for(i=0; i10; i+) printf(%4d,ai); (4) 程序如下:程序如下:#include void add(int b , int n) int i; for(i=0; in; i+) bi
21、+=10; void main( ) int a10=1,2,3,4,5,6,7,8,9,10, *q=a; add(q,10); for(q=a;qa+10;q+) printf(%4d,*q); #includevoid rmove(int a ,int m, int n) int i,*p,t; for(i=0; ia; p-) *p=*(p-1); *p=t; void main() int m,n,a100,*p; printf(n n=); scanf(%d,&n); printf(Input %d numbers:n,n); for(p=a; pa+n; p+) scan
22、f(%d, p); printf(How many place you want to move?); scanf(%d, &m); rmove(a,m,n); printf(New:n); for(p=a; pa+n; p+) printf(%5d,*p);例例 7.77.7將一維數(shù)組的將一維數(shù)組的各元素循環(huán)右移各元素循環(huán)右移m m個位個位置置, , 用函數(shù)實現(xiàn)用函數(shù)實現(xiàn) 對于二維數(shù)組:(1)a是數(shù)組名, 包含三個元素 a0,a1,a2(2)每個元素ai 又是一個一維 數(shù)組,包含4個 元素aa+1a+2*(*(a+0)+1)*(a0+1)int a34;a0a1a2200020082
23、016200020022008201020162018a00a01a10a11a20a21a02a03a12a13a22a23a0+1a1+1a2+1*(a+0)+1*(a+1)+1*(a+2)+17.3.2 指向多維數(shù)組元素和指向分數(shù)組的指針 對二維數(shù)組對二維數(shù)組 int a34,有有 a-二維數(shù)組的首地址,即第二維數(shù)組的首地址,即第0行的首地址行的首地址 a+i-第第i行行的首地址的首地址 ai *(a+i)-第第i行第行第0列列的元素地址的元素地址 ai+j *(a+i)+j -第第i行第行第j列列的元素地址的元素地址 *(ai+j) *(*(a+i)+j) aija+i=&ai
24、=ai=*(a+i) =&ai0, 值相等,地址運算時步進值不相同值相等,地址運算時步進值不相同 a+i &ai,表示第表示第i行首地址,行首地址,a+1由由2000步進步進2016,實際是,實際是4個元素空間個元素空間 ai *(a+i) &ai0,表示第表示第i行第行第0列元素地址列元素地址a0+1由由2000步進步進2004,實際是,實際是1個元素空間個元素空間int a34;a0a1a2200020162032200020042016202020322036a00a01a10a11a20a21a02a03a12a13a22a23aa+1a+2表示形式含義地址a二
25、維數(shù)組名,數(shù)組首地址a0,*(a+0),*a第0行第0列元素地址a+1第1行首地址a1,*(a+1)第1行第0列元素地址a1+2,*(a+1)+2,&a12第1行第2列元素地址*(a1+2),*(*(a+1)+2),a12第1行第2列元素值20002000201620162024132.指向數(shù)組元素的指針變量指向數(shù)組元素的指針變量例例 7.8 用指針變量輸出數(shù)組元素的值。用指針變量輸出數(shù)組元素的值。main() int a35= 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11,12,13,14,15 ; int *p; for (p=a0;pa0+15;p+) if
26、(p-a0)%5=0) printf(n); printf(%4d,*p); 3.指向分數(shù)組的指針變量指向分數(shù)組的指針變量例例 7.9 用指向二維數(shù)組中分數(shù)組的指針變量用指向二維數(shù)組中分數(shù)組的指針變量, 按行輸出二維數(shù)組按行輸出二維數(shù)組各元素的值。各元素的值。main() int a35= 1, 2, 3, 4, 5 , 6, 7, 8, 9, 10, 11,12,13,14,15 ; int *q,(*p)5; for(p=a;pa+3;p+) for(q=*p;q*p+5;q+) printf(%5d,*q); printf(n); 4.用多維數(shù)組名和指針變量作函數(shù)參數(shù)用多維數(shù)組名和指針變
27、量作函數(shù)參數(shù) (1) 用多維數(shù)組名作實參或形參。用多維數(shù)組名作實參或形參。 如如: f(int a5, int n);(2) 用指向元素的指針變量作實參或形參。用指向元素的指針變量作實參或形參。 f1(int *p);(3) 用指向分數(shù)組的指針變量作實參或形參。用指向分數(shù)組的指針變量作實參或形參。 如如:f2(int (*q)5, int m); 注意注意: 后兩者之間指針移動時地址的增量是不同的。后兩者之間指針移動時地址的增量是不同的。例例 7.10 調用函數(shù)求兩個矩陣之和調用函數(shù)求兩個矩陣之和main() int i,j,aMN= 1,2,3,4, 5,6,7,8 ; int bMN=10
28、,20,30,40, 50,60,70,80 ; print(a); print(b); add(b,a); print(b); for(i=0;iM;i+) for(j=0;jN;j+) printf(%6d,aij); printf(n); printf(n);#define M 2#define N 4void add(int (*p1)N,int (*p2)N) int *q1,*q2,(*u)N=p1+M; for(;p1u;p1+,p2+) q1=*p1; for(q2=*p2;q1*p1+N;q1+) *q1+=*q2; q2+; void print(int (*p)N) in
29、t *q,(*u)N=p+M; for(;pu;p+) for(q=*p;q*p+N;q+) printf(%6d,*q); printf(n); printf(n);7.3.3 7.3.3 用字符數(shù)組和用字符數(shù)組和字符字符型型指針訪問字符串指針訪問字符串 1.1.用字符用字符型型指針指針變量整體輸入變量整體輸入/ /輸出字符串輸出字符串用字符型數(shù)組和字符指針兩種方法整體輸入輸出字符串。用字符型數(shù)組和字符指針兩種方法整體輸入輸出字符串。#includemain() char s20=I am a student!,*p=s; char *pt=You are a teacher!; print
30、f(%sn,s); printf(%sn,pt); scanf(%s,s); printf(%sn,s); scanf(%s,p); printf(%sn,p); 2.對使用字符指針變量和字符數(shù)組的討論對使用字符指針變量和字符數(shù)組的討論 (1)存儲內容不同存儲內容不同 (2)分配的內存單元不同分配的內存單元不同 (3)賦值方法不同。賦值方法不同。 (4)指針變量的值是可以改變的指針變量的值是可以改變的, 字符數(shù)組名是地址常量字符數(shù)組名是地址常量, 它的值是不能改變的它的值是不能改變的 char *p , char s16;scanf(%s,s); /* s是地址常量是地址常量, 有確定地址有確
31、定地址, 正確正確 */scanf (“%s”,p); /* p未指向一個具體的地址未指向一個具體的地址,不應這樣做不應這樣做 */ char str16=I am a srudent.; /* 只能在變量定義時整體賦值只能在變量定義時整體賦值 */可以用賦值語句將字符串首地址賦值給字符指針變量可以用賦值語句將字符串首地址賦值給字符指針變量 char *a; a=I am a srudent.;3.用字符數(shù)組或指針作函數(shù)參數(shù)傳遞字符串用字符數(shù)組或指針作函數(shù)參數(shù)傳遞字符串 void strcpy(char s1,char s2) int i=0; while(s2i!=0) s1i=s2i; i
32、+; s1i=0;void strcpy(char *s1, char *s2) for( ; *s2!=0; s1+, s2+) *s1=*s2; *s1=0;7.3.4 指針數(shù)組和指向指針的指針指針數(shù)組和指向指針的指針 1. 指針數(shù)組的概念指針數(shù)組的概念 一個數(shù)組一個數(shù)組, 其元素均為指針類型變量其元素均為指針類型變量, 稱為指針數(shù)組稱為指針數(shù)組 基類型名基類型名 *數(shù)組名數(shù)組名數(shù)組長度數(shù)組長度=地址初值列表地址初值列表例如:例如:int int * *p4; p4; 例例 7.15 指針數(shù)組的各元素指向整型數(shù)據(jù)的簡單實例指針數(shù)組的各元素指向整型數(shù)據(jù)的簡單實例main() static i
33、nt a5=10,20,30,40,50; /* 要用要用a的元素地址做初值的元素地址做初值,應加應加static */ int *q5=&a0,&a1,&a2,&a3,&a4; int *p; for(p=q;pq+5;p+) printf(%dt,*p);例例 7.16 利用指向分數(shù)組的指針變量利用指向分數(shù)組的指針變量, 輸入多個字符串輸入多個字符串, 將它們按將它們按行存儲在行存儲在二維二維字符數(shù)組中字符數(shù)組中, 然后輸出全部字符串。再用字符型指然后輸出全部字符串。再用字符型指針數(shù)組和指向指針變量的指針變量實現(xiàn)。針數(shù)組和指向指針變量的指針變量實現(xiàn)。
34、main() char a420; char (*p)20; /* p是指向分數(shù)組的指針變量是指向分數(shù)組的指針變量*/ printf(Input strings:n); for(p=a;pa+4;p+) gets(*p); printf(Output strings:n); for(p=a;p0) printf(%sn,*+argv);/* 下標法下標法 */main( int argc, char *argv ) int i; for (i=1;i成員名成員名7.4.2 指向結構體數(shù)組指向結構體數(shù)組元素元素的指針的指針 指針變量可以指向結構體數(shù)組中的元素,改變指針變量的指針變量可以指向結構體
35、數(shù)組中的元素,改變指針變量的值就可以通過它訪問結構體數(shù)組中的各元素。值就可以通過它訪問結構體數(shù)組中的各元素。struct dot float x, y; ;struct examp a10,*p=a;a0.m=0; a0.n=0;p+;p-x=1; p-y=1;p=p+2;p-x=a0.x+1; p-y= a0.y+1;struct examp int n, m; ;struct examp a10,*p=a;p-n+ 引用引用p指向的結構體變量中成員指向的結構體變量中成員n的值的值, 然后使然后使n增增1。(p+)-n 引用引用p指向的結構體變量中成員指向的結構體變量中成員n的值的值, 然后
36、使然后使p增增1+p-n 使使p指向的結構體變量中成員指向的結構體變量中成員n的值先增的值先增1(不是不是p的值增的值增1), 再引用再引用n的值。的值。(+p)-n 使使p的值增的值增1, 再引用再引用p指向的結構體變量中成員指向的結構體變量中成員n的值。的值。#define N 10#define N 10#include#includestruct student int num; char name12; float score;struct student int num; char name12; float score;struct student sN; struct stud
37、ent sN; main( )main( ) struct student struct student * *p ,p ,* *qN; int i,j,k;qN; int i,j,k; printf ( Input %d students num name scoren,N); printf ( Input %d students num name scoren,N); p=s; p=s; for (i=0; iN; i+) for (i=0; inum,p-name,&p-score); scanf(%d%s%f,&p-num,p-name,&p-score); q
38、i=p+; qi=p+; for (i=0; iN-1; i+) for (i=0; iN-1; i+) k=i; k=i; for (j=i+1; jscorescore) k=j; for (j=i+1; jscorescore) k=j; if (k!=i) p=qi; qi=qk; qk=p; if (k!=i) p=qi; qi=qk; qk=p; printf(No.: Name: scoren); printf(No.: Name: scoren); for (i=0; iN; i+) for (i=0; inum,qi-name,qi-score); printf(%5d%15
39、s %8.1fn,qi-num,qi-name,qi-score); 77886653637489789854s0s1s2s3s4s5s6s7s8s9q0q1q2q3q4q5q6q7q8q977886653637489789854q0q1q2q3q4q5q6q7q8q97.4.3 7.4.3 用指向結構體的指針作函數(shù)參數(shù)用指向結構體的指針作函數(shù)參數(shù) 1 1、采取、采取“值傳遞值傳遞”的方式的方式函數(shù)調用時函數(shù)調用時, , 將實參結構體的全部成員按順序賦值給形參將實參結構體的全部成員按順序賦值給形參, , 這種傳遞方式在空間和時間上開銷較大這種傳遞方式在空間和時間上開銷較大, ,由于采用值傳遞由
40、于采用值傳遞方式方式, , 如果在被調用函數(shù)中改變了結構體形參的值如果在被調用函數(shù)中改變了結構體形參的值, , 該值該值不能返回主調函數(shù)。因此一般較少使用不能返回主調函數(shù)。因此一般較少使用 2 2、采取、采取“引用傳遞引用傳遞”的方式的方式( (傳地址傳地址) ) 用指向結構體變量用指向結構體變量( (或數(shù)組或數(shù)組) )的指針作實參的指針作實參, , 將結構體變將結構體變量量( (或數(shù)組或數(shù)組) )的地址傳給形參。如果在被調用函數(shù)中改變的地址傳給形參。如果在被調用函數(shù)中改變了形參指向的結構體的值了形參指向的結構體的值, , 該值可以帶回主調函數(shù)該值可以帶回主調函數(shù) #define N 10#i
41、nclude#define FMT %4d %12s%8d%8d%8d%10.1fnstruct student int num; char name12; int sc3; float av;main() struct student sN,*p; void input( ); printf(Input student:number name score1 score2 score3n); for(p=s; ps+N; p+) input(p); printf(number name score1 score2 score3 averagen); for(p=s; pnu,p-na,p-sc
42、0,p-sc1,p-sc2,p-av);void input(struct student *s) scanf(%d%s%d%d%d,&s-nu,s-na,&s-sc0,&s-sc1,&s-sc2); s-av=(s-sc0+s-sc1+s-sc2)/3.0;7.5 指針與指針與函數(shù)函數(shù)7.5.1 7.5.1 返回指針值的函數(shù)返回指針值的函數(shù) 定義格式定義格式: 類型名類型名 *函數(shù)名函數(shù)名(參數(shù)表參數(shù)表);例如:例如: int *f(int x, int y);char *strcpy(char *s1,char *s2) char *p=s1; while(
43、*s1+=*s2+); return(p); main() char s20= I am a student.; printf(%sn,strcpy(s,You are a eacher.);例例 寫一個函數(shù),求兩個寫一個函數(shù),求兩個int型變量中居于較大值的變量的地址型變量中居于較大值的變量的地址int *f1(int *x,int *y) if(*x*y)return x; elsereturn y;main() int a=2,b=3; int *p; p=f1(&a, &b); printf(%dn,*p);.20002008200A20022004200623 指針變
44、量y 指針變量x(f1)20022000COPY變量a 變量b(main) 指針變量p*7.5.2 指向函數(shù)的指針和函數(shù)參數(shù) 1.1.定義定義 類型說明符類型說明符 ( (* *變量名變量名)();)(); int (int (* *p)() p)() 2.2.賦值賦值 變量名變量名= =函數(shù)名函數(shù)名 p=fname;p=fname; 3. 3.調用調用 變量名變量名( (實參列表實參列表) ) p(x,y);p(x,y); 例例 7.23 指向函數(shù)的指針程序舉例。指向函數(shù)的指針程序舉例。#includeint f(int x) return 3*x*x+5*x-7; void main()
45、int(*p)(); /* 定義定義p為指向函數(shù)的指針變量為指向函數(shù)的指針變量*/ int a,y; p=f; / /* * 對指向函數(shù)的指針變量對指向函數(shù)的指針變量p p賦值賦值* */ / printf(input x= ); scanf(%d,&a); y=(*p)(a); / /* * 用函數(shù)指針變量形式調用函數(shù)用函數(shù)指針變量形式調用函數(shù), , 相當于相當于y=f(a) y=f(a) * */ / printf(y=%dn ,y); 用函數(shù)指針變量作函數(shù)參數(shù)用函數(shù)指針變量作函數(shù)參數(shù)int max(int,int);int min(int,int);int add(int,int);void process(int,int,int (*fun)();void main() int a,b, scanf(%d,%d,&a,&b); process(a,b,max); process(a,b,min); process(a,b,add);void process(int x,int y,int (*fun)() int result; result=(*fun)(x,y); printf(%dn,result);max(int x,int y)
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 企業(yè)內部規(guī)章制度制定與執(zhí)行手冊
- 環(huán)境監(jiān)測技術標準操作手冊
- 影視中的化學知識
- 企業(yè)內部審計風險評估手冊
- 2026年池州九華山佛教協(xié)會公開招聘編外工作人員6名備考題庫附答案詳解(綜合卷)
- 2026云南眾城現(xiàn)代產業(yè)合作發(fā)展有限責任公司招聘備考題庫含答案詳解(綜合題)
- 2026上海市退役軍人事務局系統(tǒng)招聘4人備考題庫含答案詳解(完整版)
- 普及衛(wèi)生知識宣傳
- 2026上半年安徽事業(yè)單位聯(lián)考銅陵市郊區(qū)招聘17人備考題庫附參考答案詳解(鞏固)
- 2026廣東湛江市住房和城鄉(xiāng)建設局事業(yè)單位急需緊缺人才招聘1人備考題庫附答案詳解(考試直接用)
- 2026年標準版離婚協(xié)議書(有財產)
- 養(yǎng)老院電氣火災培訓課件
- 中國工商銀行2025年度春季校園招聘筆試歷年典型考題及考點剖析附帶答案詳解
- 對外話語體系構建的敘事話語建構課題申報書
- 中國家庭財富與消費報告2025年第三季度
- 馬年猜猜樂(馬的成語)打印版
- 精神障礙防治責任承諾書(3篇)
- 2025年擔保公司考試題庫(含答案)
- 合肥新鑫人力資源服務有限公司介紹企業(yè)發(fā)展分析報告
- 2025年金融控股公司行業(yè)分析報告及未來發(fā)展趨勢預測
- 質量控制計劃模板全行業(yè)適用
評論
0/150
提交評論