C語言指針與數(shù)組教程_第1頁
C語言指針與數(shù)組教程_第2頁
C語言指針與數(shù)組教程_第3頁
C語言指針與數(shù)組教程_第4頁
C語言指針與數(shù)組教程_第5頁
已閱讀5頁,還剩37頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

1、CHINA UNIVERSITY OF PETROLEUM(華東)主講教師:孫運雷計算機與通信工程學(xué)院 計算機科學(xué)系入理想的程序,輸出快樂的人生 理解地址與指針的概念 熟悉指針變量的定義與使用 理解數(shù)組與指針的關(guān)系 P27利用指針返回多個值 了解指針的應(yīng)用輸入理想的程序,輸出快樂的人生輸入理想的程序,輸出快樂的人生 swap函數(shù)的例子 值傳遞:修改的只是副本 那么傳地址可行么?#include void swap ( int a, int b) int temp = a; a = b; b = temp;int main ( ) int a = 3, b = 6; s

2、wap(a, b); 傳地址swap(&a, &b);問題:思路可行否?怎么改?1)swap函數(shù)形參2)如何根據(jù)地址取到值?#include void swap ( int x, int y ) printf(調(diào)用時:x地址為:%p, 值為:%dn,&x,x); printf(調(diào)用時:y地址為:%p, 值為:%dn,&y,y); int temp; temp = x; x = y; y = temp;int main ( ) int a = 3, b = 6; printf(a地址為:%p, 值為:%dn,&a,a); printf(b地址為:%p, 值

3、為:%dn,&b,b); swap(a, b); printf(交換后:a地址為:%p, 值為:%dn,&a,a); printf(交換后:b地址為:%p, 值為:%dn,&b,b); return 0;void swap ( int *x, int *y ) printf(調(diào)用時:x地址為:%p, 值為:%dn,x,*x); printf(調(diào)用時:y地址為:%p, 值為:%dn,y,*y); int temp; temp = *x; *x = *y; *y = temp;變化:1)形參用*表示傳遞了地址!2)x和y是地址類型3)從地址取值用了*操作符swap(&

4、;a, &b);輸入理想的程序,輸出快樂的人生輸入理想的程序,輸出快樂的人生一一、地、地址址 在計算機中,把內(nèi)存區(qū)劃分為一個一個的存儲單元,每個單元為一個字節(jié)(bit),它們都有一個編號,這個編號就是內(nèi)存地址。提示:1、程序中的執(zhí)行代碼和變量在執(zhí)行前都在內(nèi)存里保存。2、數(shù)據(jù)所占有的存儲單元個數(shù)是由其類型決定的。3、首地址:第1個單元(0號)的地址輸入理想的程序,輸出快樂的人生如定義: char c=A; int k; .2000200120022005內(nèi)存02003k編譯或函數(shù)調(diào)用時為其分配內(nèi)存單元地址注意:注意:c和和k的地址可能相鄰,也可的地址可能相鄰,也可能不相鄰,是由系統(tǒng)分配的

5、,編程能不相鄰,是由系統(tǒng)分配的,編程人員不用關(guān)心。人員不用關(guān)心。變量變量是對程序中數(shù)據(jù)是對程序中數(shù)據(jù)存儲空間的抽象存儲空間的抽象輸入理想的程序,輸出快樂的人生指針:在C語言中將變量的地址形象化地稱為指針。指針變量:專門存放變量地址的變量.2000200820122010定義整型變量i10定義指針i_pointer指向i(=&i)2002200420062000指針指針指針變量指針變量 變量i的內(nèi)容 變量i的地址指針變量指針變量i_pointer指向指向整型變量整型變量 i輸入理想的程序,輸出快樂的人生指針變量指針變量i_pointer變量變量i 變量值變量值指向指向地址存入地址存入指針

6、變量指針變量變量變量i地址地址輸入理想的程序,輸出快樂的人生輸入理想的程序,輸出快樂的人生 定義int *aPointer; 初始化int *aPointer;aPointer = NULL; /空指針,其實是0或者合并: int *aPointer = NULL; 引用int a = 3, b = 6, tmp;int *pa = NULL, *pb = NULL;pa = &a;pb = &b;tmp = *pa;*pa = *pb;*pb = tmp;指針就是“標(biāo)著門牌號門牌號的鑰匙鑰匙”用“&”記錄了地址用“*”當(dāng)鑰匙使用指針時“*”有兩個作用: 定義時:標(biāo)志標(biāo)

7、志一下,這是個指針 引用時:從該地址取出值取出值輸入理想的程序,輸出快樂的人生一般形式: 類型說明 * 指針變量名;指針變量指向的變量的數(shù)據(jù)類型指針說明符 * 表示定義指針變量例如: int *p1,*p2; float x, *q; char *c;注意: 指針變量定義后,其內(nèi)容不確定,應(yīng)用前必須先賦值輸入理想的程序,輸出快樂的人生如: int a, *p; p = &a;如: int a, *p1, *p2; p1 = &a; p2 = p1;如: int *p; p = NULL;表示空指針,即不指向任何單元,在頭文件stdio.h中定義define NULL 01. 用

8、變量的地址給指針變量賦值 (使用求地址運算符&)注:只能用同類型變量的地址進行賦值!如定義:int *s; float f; 則 s=&f;是非法的2. 用相同類型的指針變量賦值3. 賦空值若不需要指向某個特定的存儲地址,或不確定指向時則賦空值。注意:下面賦值是非法的 int a,*p; p=2000; a=p;輸入理想的程序,輸出快樂的人生變量必須變量必須已定義已定義且且類型類型應(yīng)一致應(yīng)一致用用已初始化過已初始化過的指針變量作初值的指針變量作初值格式: 類型說明 * 指針變量名=初始地址;例int a,*p=&a;例int *p=&a, a;例int a; i

9、nt *p=&a; int *q=p;輸入理想的程序,輸出快樂的人生#include int main() int a,b, *p_1=&a, *p_2=&b; a=100;b=10; printf(%d,%dn,a,b); printf(%d,%dn,*p_1, *p_2); printf(%p,%pn,p_1, p_2); return 0; 輸入理想的程序,輸出快樂的人生若有: int a=5, *p=&a; 則(1) a*p &ap a=3*p=3(2) &與*互為逆運算 &(*p) p *(&a) a (3) (*p)+

10、 a+不定pa不定5&a表示等價表示等價輸入理想的程序,輸出快樂的人生1)賦值:int a,*p1=&a; scanf(“%d”,p1);2)輸出:printf(“%x”,p1);3)增減:(*p1)+; p1-; p1+=4; 4)取內(nèi)容:*p1=5; a=5; printf(“%d”,*p1);5)比較:通常與指針常量NULL進行比較,兩指針變量值的大小比較往往是無意義的。輸入理想的程序,輸出快樂的人生假設(shè)&a1=0 x28ff18#include int main( ) int a1=3; int *p1; p1=&a1; printf(%xn,p1);

11、p1+; printf(%xn,p1); return 0;p1+a10000001100000000000000000000000028ff1828ff1928ff1a28ff1bp128ff1c28ff1828ff1c輸入理想的程序,輸出快樂的人生 直接訪問:通過變量本身對變量進行存取的方式。 間接訪問:通過指針變量實現(xiàn)對變量的訪問方式。 間接訪問的過程是:由指針變量得到變量的地址,根據(jù)該地址找到變量的存儲區(qū),再對該存儲區(qū)的內(nèi)容進行存取,從而實現(xiàn)了對變量的間接訪問int a,*p=&a;a=10; /*直接訪問,結(jié)果a的值為10*/*p=*p+10; /*間接訪問,結(jié)果a的值為20

12、 */輸入理想的程序,輸出快樂的人生 int a=5, *p=&a; &*p *&a (*p)+ &a a *p+ *(p+) a+ 輸入理想的程序,輸出快樂的人生#include int main() int a=2,*p=&a,*q=&a; printf(%d %dn,*p+,*(q+); p=&a; q=&a; printf(%d %dn,*p, (*q)+); printf(%dn,*q); return 0;2 22 23輸入理想的程序,輸出快樂的人生#include int main( ) int a1=11,a2=2

13、2; int *p1,*p2,*p; p1=&a1; p2=&a2; printf(“%d,%dn”,*p1,*p2); p=p1; p1=p2; p2=p; printf(“%d,%dn”,*p1,*p2); return 0;p1&a11122a1p2a2&a2*p1*p2&a1&a2輸入理想的程序,輸出快樂的人生#include int main( ) int a1=11,a2=22,t; int *p1,*p2; p1=&a1; p2=&a2; printf(“%d,%dn”,a1,a2); t=*p1; *p1=*p2;

14、 *p2=t; printf(“%d,%dn”,a1,a2); return 0;p1&a11122a1p2a2&a22211t 11*p2*p1輸入理想的程序,輸出快樂的人生#include int main( ) int i, sum=0;int *p1 = &i; int *p2 = ∑ for(i=1; i=100; i+) *p2 += *p1 ; printf(1+2+100=%dn, *p2);return 0;int i, sum=0;for( i=1; i=100; i+ )sum = sum + i;printf(1+2+.+100=

15、%dn, sum);輸入理想的程序,輸出快樂的人生#include int main() int i, x, sum;int *p1 = &x;/ p1指向x int *p2 = ∑/ p2指向sum*p2 = 0;/ 即sum=0 printf(輸入10個整數(shù):);for(i=0; i10; i+)scanf(%d, p1);*p2 = *p2 + *p1;printf(累加和為%dn, *p2);return 0;輸入理想的程序,輸出快樂的人生#include #define N 10int fun(int x,int m,double *avg);int main

16、() int a=1,2,3,4,5,6,7,8,9,10,sum; double average; sum=fun(a,N,&average); printf(%d,%.2fn,sum,average); return 0; int fun(int x,int m,double *avg)int i,sum=0;for(i=0;im;i+) sum=sum+xi;*avg=(double)sum/m;return sum;輸入理想的程序,輸出快樂的人生輸入理想的程序,輸出快樂的人生一、一維數(shù)組的地址l 數(shù)組名是表示數(shù)組首地址, 即第一個數(shù)組元素的地址,a即為&a0l 數(shù)組元素

17、ai的地址是&ai, &a0, &a1l 數(shù)組元素ai的地址可表示為a+i, 即:a+i就是&ail 數(shù)組元素ai可用*(a+i)表示#include int main( ) int i, a5=5,3,1,2,4;for(i=0; i5; i+)printf(“%d n”,*(a+i); 508A 508E 5092 5096 509Aa0 a1 a2 a3 a4 a a a a a如:int a5=3, 5, 2, 1, 4;輸入理想的程序,輸出快樂的人生如定義:int a10, *p = a; 則: p=&a0;若令:p = &ai 則:*

18、p就是ai可見,當(dāng)p=a時,有:&a0= a = p &ai = a+i = p+i=&piai = *(a+i)= *(p+i) =pia0a1a2a3a9整型指針整型指針p&a0p輸入理想的程序,輸出快樂的人生#include int main( ) int i, a5=5,3,1,2,4,*p;for(i=0; i5; i+) printf(%d ,*(a+i);printf(n); /*地址法*/for (p=a; pa+5; p+)printf(%d , *p); printf(n); /*指針法*/注意:p是指針變量,取值可變,可指向各個數(shù)組元素a是

19、數(shù)組名,是地址(指針)常量,其值不可變?nèi)缍x:int a10, *p = a; 則: p=&a0;若令:p = &ai 則:*p就是ai可見,當(dāng)p=a時,有:&a0= a = p &ai = a+i = p+iai = *(a+i)= *(p+i)*a+輸入理想的程序,輸出快樂的人生運算含義p+p指向后一個數(shù)組元素p-p指向前一個數(shù)組元素p+i指向當(dāng)前元素后第i個數(shù)組元素p-i指向當(dāng)前元素前第i個數(shù)組元素p-q兩個指針之間相差的元素個數(shù)關(guān)系運算pq:p在后p=q:指向同一元素a+i數(shù)組a中下標(biāo)為i的元素如定義:int a10, *p = a, *q=a;p=ap

20、+1/a+1*(p+i)a數(shù)組數(shù)組a0a1a2aia9p+i/a+ip+9/a+9輸入理想的程序,輸出快樂的人生下標(biāo)法a0a1a2a3a4指針法*a*(a+1)*(a+2)*(a+3)*(a+4)*p*(p+1)*(p+2)*(p+3)*(p+4)各元素地址&a0&a1&a2&a3&a4aa+1a+2a+3a+4pp+1p+2p+3p+4(1)下標(biāo)法:如ai形式;(2)指針法:如*(a+i)或 *(p+i)。如定義:int a5, *p = a;通過改變p的值,也可使p指向任意數(shù)組元素輸入理想的程序,輸出快樂的人生#include int main()

21、int a5=1,2,3,4,5,*p=a,i; for(i=0;i5;i+) printf(%dt,ai); printf(n); for(i=0;i5;i+) printf(%dt,*(a+i); printf(n); for(i=0;i5;i+) printf(%dt,*(p+i); printf(n); p=a; for(i=0;i5;i+,p+) printf(%dt, *p); return 0;更常用方法更常用方法常用,直觀常用,直觀輸入理想的程序,輸出快樂的人生例:int a =1,2,3,4,5,6,7,8,9,10,*p=a,i=5; 選擇:數(shù)組元素地址的正確表示:(A)

22、&(a+i) (B) a+ (C) &p (D) p+I例:指出程序輸出結(jié)果(略) int main() int a =5,8,7,6,2,7,3; int y,*p=&a1; y=(*-p)+; printf(“%d, ”,y); printf(“%dn”,a0); pp58762730123456a6y=55 65 6輸入理想的程序,輸出快樂的人生int main() int i,*p,a7; p=a; for(i=0;i7;i+) scanf(%d,p+); printf(n); for(i=0;i7;i+) printf(%2d,*p+); printf(n);

23、p=a;輸入理想的程序,輸出快樂的人生/*用下標(biāo)變量實現(xiàn)*/#include #define N 5int main() int aN=5, 4, 3, 2, 1;int i=0 , j=N-1 , t ; while( ij ) t= ai; ai = aj; aj = t; i+; j-;for( i=0; iN; i+ )printf( “%5dn, ai );/*用指針實現(xiàn)*/#include #define N 5int main() int aN=5, 4, 3, 2, 1;int *p = a, *q = a+N-1;int i, t;while( pq ) t = *p; *p = *q; *q = t; p+; q-; for( p=a, i=0; iN; i+ ) printf( %5dn, *p+ );輸入理想的程序,輸出快樂的人生輸入理想的程序,輸出快樂的人生#include #define N 10int main() int i, aN, *p

溫馨提示

  • 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)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論