C語言第章指針_第1頁
C語言第章指針_第2頁
C語言第章指針_第3頁
C語言第章指針_第4頁
C語言第章指針_第5頁
已閱讀5頁,還剩40頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、 地址與指針的概念 指針與變量 指針與數(shù)組 指針與字符串 指針與函數(shù)* 返回指針值的函數(shù) 指針數(shù)組和指向指針的指針 動態(tài)內(nèi)存分配 有關(guān)指針的數(shù)據(jù)類型和指針運(yùn)算小結(jié)地址:內(nèi)存的編號,基本單位是字節(jié)。內(nèi)存單元與內(nèi)存單元的內(nèi)容:數(shù)值被存儲在連續(xù)的若干個內(nèi)存單元中;數(shù)值的存取通過變量進(jìn)行,編譯時已經(jīng)將變量名自動轉(zhuǎn)換為內(nèi)存地址,物理上的存取是通過地址進(jìn)行的;直接訪問:按變量地址直接存取變量值。間接訪問:將變量i的地址存放在另一個變量ip中,通過ip訪問變量i的值。int i=100; /連續(xù)4個字節(jié)變量i2000變量ip1002000因此,數(shù)值100送到變量中有兩種方法:將100送到變量i標(biāo)志標(biāo)志的單元

2、中;將100送到變量ip指向指向的單元中。 即:即:i i標(biāo)志的單元標(biāo)志的單元 指針:一個變量的地址稱為該變量的“指針”。指針變量:專門用來存放另一個變量地址的變量稱為指針變量;指針變量的值是指針。int i=100; /連續(xù)4個字節(jié)變量i2000變量ip1002000程序中 *表示“指向”,*ip與i是同一回事i=100;*ip=100指針變量的定義語句:例如:int *pA;/指向整數(shù)變量的指針變量char *pCh; /指向字符變量的指針變量float *pF;/指向?qū)崝?shù)變量的指針變量在指針定義中,一個*只能表示一個指針。例如:int *pA, pB;/pA是指針變量名, pB是一個普通

3、的整形變量。int *pAa, *pBb; /pAa和pBb都是指針變量。 定義指針變量定義指針變量指針運(yùn)算符:& &:取地址運(yùn)算符;* *:放在操作語句中的指針之前,稱為間接訪問運(yùn)算符。如:int a, b = 10, c;int *ipa, *ipb;ipa = &a;ipb = &b;c = *ipa;指針變量使用前必須初始化;注意變量與指針的區(qū)別; int a, *ipa; ipa = 100; /錯誤 *ipa = &a; /錯誤指針變量的值是可以改變的,即改變指針的指向; int a = 10, b = 20; int *ipa, *ipb;

4、 ipa = &a; ipb = &b; *ipa = *ipb; ipa = ipb; *ipa = 10;102020003000a:地址為2000b:地址為3000ipaipb指針變量的引用指針變量的引用注意指針運(yùn)算的組合: int a = 100, *ipa; ipa = &a; &*ipa ? *&a ? (*ipa)+ ? *(ipa+) ? *ipa+ ? *(+ipa) ? +*ipa ?&*ipa = &a = ipa*&a = *ipa = a(*ipa)+ = a+*(ipa+) 首先取出ipa指向的單元內(nèi)容

5、, 然后ipa指向a的下一個類型單元*ipa+ 與 *(ipa+)等效*(+ipa) 首先ipa指向下一個類型單元, 然后取出該類型單元的內(nèi)容+*pa = +(*ipa) ipa指向的單元內(nèi)容加1 即:a = 101100aipamain() int *p1,*p2,*p,a,b; scanf(%d,%d,&a, &b); p1=&a; p2=&b; if(ab) p=p1; p1=p2; p2=p; printf(na=%d,b=%dn, a, b); printf(max=%d,min=%dn, *p1, *p2);輸入a和b兩個整數(shù),按先大后小的順序輸出a

6、和b abp2p1pabp2p1p通過指針交換實(shí)現(xiàn)swap(int *p1,int *p2) int temp; temp=*p1; *p1=*p2; *p2=temp;main() int a,b; int *ip1,*ip2; scanf(%d,%d,&a, &b); ip1=&a; ip2=&b; if(ab) swap(ip1, ip2); printf(n%d,%dn,a, b);&a&b59abip1ip2&b&b95abp2ip2&a&a59abp1ip1&a&b95abip1ip2i

7、nt *temp;&a&ap1ip1&b&bp2ip2*temp=*p1?temp初值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);得不到所要結(jié)果:從局部變量的作用域考慮;從實(shí)參-形參的值傳送考慮。swap(int *p1,int *p2) int *p; p=p1; p1=p2; p2=p;main() int a,b; int *ip1,*i

8、p2; scanf(%d,%d,&a, &b); ip1=&a; ip2=&b; if(ab) swap(ip1, ip2); printf(n%d,%dn,*ip1, *ip2);調(diào)用函數(shù)不可能改變實(shí)參指調(diào)用函數(shù)不可能改變實(shí)參指針變量的值,但可以改變實(shí)針變量的值,但可以改變實(shí)參指針變量所指變量的值。參指針變量所指變量的值。&a&b59abip1ip2&b&a59abp1p2&a&b59abp1p2&b&a59abip1ip2swap(int *p1,int *p2) int t; t=*p1; *

9、p1=*p2; p2=t;exchange(int *q1, int *q2, int *q3) if(*q1*q2) swap(q1, q2); if(*q1*q3) swap(q1, q3); if(*q2*q3) swap(q2, q3);輸入a、b、c 3個整數(shù),按大小順序輸出 main() 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(n%d,%d,%d n,a,b,c);一個變量

10、有一個地址,一個數(shù)組包含若干元素,每個數(shù)組元素都在內(nèi)存中占用存儲單元,它們都有相應(yīng)的地址。所謂數(shù)組的指針是指數(shù)組的起始地址,數(shù)組元素的指針是數(shù)組元素的地址。 一個數(shù)組是由連續(xù)的一塊內(nèi)存單元組成的。數(shù)組名就是這塊連續(xù)內(nèi)存單元的首地址。一個數(shù)組也是由各個數(shù)組元素(下標(biāo)變量)組成的。每個數(shù)組元素按其類型不同占有幾個連續(xù)的內(nèi)存單元。一個數(shù)組元素的首地址也是指它所占有的幾個內(nèi)存單元的首地址。指向數(shù)組的指針變量的定義指向數(shù)組的指針變量的定義int a10;/定義a為包括10個整數(shù)數(shù)據(jù)的數(shù)組int *p;/定義p為指向整數(shù)變量的指針變量指向數(shù)組元素的指針變量的賦值指向數(shù)組元素的指針變量的賦值p = &

11、;a0;/把數(shù)組a的第0號元素的地址賦給指針變量pp = &a5;/把數(shù)組a的第5號元素的地址賦給指針變量p數(shù)組名就是數(shù)組第一個元素地址數(shù)組名就是數(shù)組第一個元素地址p = a;/把數(shù)組a的首地址賦給指針變量p指針變量的初始化指針變量的初始化int a10;int *p = a;/等價于int *p = &a0;C語言規(guī)定:如果指針變量p已指向數(shù)組中的一個元素,則p+1指向同一數(shù)組中的下一個元素。如果p的初值為&a0,則:數(shù)組元素訪問:初值數(shù)組元素訪問:初值p=a 下標(biāo)法:ai 指針法:*(p+i) *(a+i)實(shí)際地址:實(shí)際地址: a+i*d /每個元素 占d個字節(jié)p+

12、i和a+i就是ai的地址,或者說它們指向a數(shù)組的第i個元素。*(p+i)或*(a+i)就是p+i或a+i所指向的數(shù)組元素,即ai。例如,*(p+5)或*(a+5)就是a5。指向數(shù)組的指針變量也可以帶下標(biāo),如pi與*(p+i)等價。 main() int a10, i; for(i=0;i10;i+) ai=i; for(i=0;i10;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);【例】輸出數(shù)組中的全部元素下標(biāo)法:

13、 數(shù)組名法: main() int a10, i, *p = a; for(i=0;i10;i+) *(p+i)=i; for(i=0;i10;i+) printf(a%d=%dn, i, *(p+i);main() int a10,i,*p=a; for (i=0; i10; i+) *(p+) = i; p = a; /必須重指必須重指 for(i=0;i10;i+) printf(a%d=%dn,i, *(p+);指針變量法1: 指針變量法2: 【例】輸出數(shù)組中的全部元素main() int a10,i,*p; for (i=0; i10; i+) scanf(“%d”,&ai)

14、; for(p=a;p(a+10);p+) printf(%d,*p);指針變量法3: main() int a10,i,*p; for (i=0; i10; i+) scanf(“%d”,&ai); for(p=a;a(p+10);a+) printf(%d,*a);?a+錯,a是數(shù)組首地址,是常量,不能+。幾個注意的問題:p+是合法的,而a+是錯誤的。a是數(shù)組名,它是數(shù)組的首地址,是常量;指針變量可以指到數(shù)組以后的內(nèi)存單元,系統(tǒng)并不認(rèn)為非法;*p+ 等價于 *(p+);*(p+)與*(+p)作用不同。若p的初值為a,則*(p+)等價a0,*(+p)等價a1; (*p)+表示p所指向

15、的元素值加1;如果p當(dāng)前指向a數(shù)組中的第i個元素,則 *(p-)相當(dāng)于ai-; *(+p)相當(dāng)于a+i; a) *(-p)相當(dāng)于a-i。指針加減:p+, p-, +p, -p;p+5, p-5;int a10;int *p1=&a0;int *p2=&a5;兩個指針相減:p1-p2兩個指針相加:無意義兩個指針比較:if (p1 p2) 用數(shù)組元素作實(shí)參和用變量作實(shí)參時一樣,是“值傳遞”方式,單向傳遞數(shù)據(jù)。用數(shù)組名作實(shí)參,在調(diào)用函數(shù)時實(shí)際上是把數(shù)組的首地址傳遞給形參,即“地址傳遞”方式,這樣實(shí)參數(shù)組和形參數(shù)組共占同一段內(nèi)存;如果函數(shù)調(diào)用過程中使形參數(shù)組的元素值發(fā)生變化,也就使實(shí)參

16、數(shù)組的元素值發(fā)生變化;這種值的變化是由于形參和實(shí)參數(shù)組共享同一段內(nèi)存造成的。一個實(shí)參數(shù)組,想在函數(shù)中改變此數(shù)組的元素的值,實(shí)參與形參的對應(yīng)關(guān)系有以下4種:形參和實(shí)參都用數(shù)組名;實(shí)參用數(shù)組名,形參用指針變量;形參和實(shí)參都用指針變量;實(shí)參用指針變量,形參用數(shù)組名; f(int arr,int n) main() int array10; f(array,10); array,arrarray0arr0f(int *arr,int n)等價從主調(diào)函數(shù)傳遞過來實(shí)參的地址,array與arr共用一段內(nèi)存單元。arri和*(arr+i)是同一回事,在f被調(diào)用期間,就代表arryi。將n個整數(shù)按相反順序存放

17、 void inv(int x, int n) int i,j,temp, m=(n-1)/2; for (i=0;i=m;i+) j=n-1-i; temp=xi; xi=xj; xj=temp; return;main() int A10=3,7,9,11,0,6,7,5,4,2; int i; printf(“Before inverting:n); for(i=0; i10; i+) printf(%d,ai); printf(n); inv(A, 10); printf(“After inverting:n); for(i=0; i10; i+) printf(%d,ai); pri

18、ntf(n);3 7 9110 6 7 5 4 22 4 5 7 6 0119 7 3ijm將n個整數(shù)按相反順序存放 有了指針,程序變化多種多樣有了指針,程序變化多種多樣void inv(int *x, int n) int *p, m, temp, *fr, *ta; m=(n-1)/2; fr=x; ta=x+n-1; p=x+m; for(; fr=p; fr+, ta-) temp=*fr; *fr=*ta; *ta=temp; return;main() int A10=3,7,9,11,0,6,7,5,4,2; int i, *p = A; printf(“Before inver

19、ting:n); for(i=0; i10; i+) printf(%d,*p+); printf(n); inv(A, 10); printf(“After inverting:n); for(p=A; pb ? a:b);main()int a = 10, b = 20, c;c = max(a,b);main() int (*p)(int,int); int a = 10, b = 20, c; p = max; c = (*p)(a,b);用函數(shù)指針變量調(diào)用函數(shù);用指向函數(shù)的指針作函數(shù)參數(shù)。Vc下必須寫下必須寫函數(shù)在編譯時被分配一入口函數(shù)在編譯時被分配一入口地址,這一地址就是函數(shù)的地址

20、,這一地址就是函數(shù)的指針指針。指令2指令1maxp用函數(shù)指針變量調(diào)用函數(shù);用指向函數(shù)的指針作函數(shù)參數(shù)。int max(int a, int b) return (ab ? a:b);main() int (*p)(int,int); int a = 10, b = 20, c; p = max; c = (*p)(a,b);指向函數(shù)的指針變量定義:函數(shù)返回類型 (*指針變量名)();int (*p)(參數(shù)類型); float (*pf)(參數(shù)類型);函數(shù)指針變量賦值時只用函數(shù)名;p = max; /無參數(shù)對函數(shù)指針變量, p+, p+n,p-等運(yùn)算無意義。返回值為整型指針的函數(shù)名為p的原型說明

21、不能寫成 int *p(參數(shù)類型);Vc下必須寫下必須寫或或c=p(a,b);用指向函數(shù)的指針作函數(shù)參數(shù)。用用指向函數(shù)的指針作形式參數(shù),可以實(shí)現(xiàn)函數(shù)地址的傳遞。也就是將函數(shù)名傳給形參。sub( int(*x1)(int), int (*x2)(int,int) int a,b,i,j; a=(*x1)(i); b=(*x2)(i,j); .f1函數(shù)f2函數(shù)f1x1f2x2用指向函數(shù)的指針作函數(shù)參數(shù)。int max(int a, int b) return (ab?a:b); int min(int a, int b) return(ab?a:b); int add(int a, int b)

22、return (a+b); int process(int a, int b, int (*fun)(int, int) int result = (*fun)(a, b); return result;main()int max(int , int ); int min(int , int ); int add(int , int ); int process(int , int, int (*fun)(int, int); int x, y; scanf(“%d,%dn”, &x, &y); printf(“max:%dn”, process(x, y, max); pri

23、ntf(“min:%dn”, process(x, y, min); printf(“add:%dn”, process(x, y, add); 函數(shù)返回值可以是C語言中的任何定義類型標(biāo)準(zhǔn)和用戶定義;返回值為指針值的函數(shù)定義: 基類型基類型 * *函數(shù)名函數(shù)名( (形參列表形參列表) )如: int *fun(float a, float b)main() 輸入學(xué)生序號,查找打印學(xué)生的成績輸入學(xué)生序號,查找打印學(xué)生的成績score4=60,70,80,90,56,89,76,88,89,78,90,88; float * search(float (*pointer)4,int n); flo

24、at *p; int i,m; scanf(“%d”,&m); p=search(score,m); for(i=0;i4;i+) printf(“%5.1f”,*(p+i);float *search(float (*pointer)4,int n) float *pt; pt=*(pointer+n); return (pt);889078898876895690807060pointerpointer+1pt156.0 89.0 76.0 88.0pt=(*pointer+n);170.0 80.0 90.0 56.0main() 打印有打印有90分以上成績的學(xué)生各科成績分以上成

25、績的學(xué)生各科成績score4=60,70,80,90,56,89,76,88,89,78,90,88; float * search(float (*pointer)4,int n); float *p; int i,j; for (i=0;i3;i+) p=search(score+i); if (p=*(score+i) printf(“%d”,i); for(j=0;j4;j+) printf(“%5.1f”,*(p+j); printf(“n”); float *search(float (*pointer)4) int i; float *pt; pt=*(pointer+1); f

26、or (i=0;i90) pt=*pointer; return(pt);889078898876895690807060pointerpointer+1ptmalloccallocfreemain() int a100, num, i; printf(“input the number:n”); scanf(“%d”, &num); for (i=0; inum; i+) ai = i; 缺點(diǎn): 當(dāng)num很少時,浪費(fèi)空間; 當(dāng)num超過100時,需要重新修改,否則錯誤。原因: 使用了不能擴(kuò)展的靜態(tài)數(shù)組結(jié)構(gòu)。改進(jìn)方法: 采用動態(tài)數(shù)據(jù)結(jié)構(gòu)需要多少,申請多少;數(shù)組一旦定義,其所占的內(nèi)存空間

27、就確定;通過數(shù)組名指示其首地址;malloccallocfreemain() int *a, num, i; printf(“input the number:n”); scanf(“%d”, &num); a = (int *)malloc(num*sizeof(int); if (!a) printf(“沒有足夠內(nèi)存空間!n”, exit(1); for (i=0; inum; i+) ai = i; free(a);函數(shù)原型:void *malloc(unsigned int size);void *calloc(unsigned int n, unsigned int size

28、);void free(void *p);malloccallocfree1)malloc內(nèi)存申請內(nèi)存申請: (類型說明符類型說明符 *) malloc(size);功能功能:在內(nèi)存的動態(tài)存儲區(qū)中分配一塊長度為size字節(jié)的連續(xù)區(qū)域。函數(shù)的返回值為該區(qū)域的首地址。 “類型說明符”表示把該區(qū)域用于何種數(shù)據(jù)類型。 (類型說明符 *)表示把返回值強(qiáng)制轉(zhuǎn)換為該類型指針。 size是一個無符號數(shù)。如: pstr = (char *)malloc(1000*sizeof(char); 申請1000個字節(jié)的連續(xù)空間,首地址賦予指針變量pstr。pstr1000個字節(jié)malloccallocfree2)calloc內(nèi)存申請內(nèi)存申請: (類型說明符類型說明符 *) calloc(n, size);功能功能:在內(nèi)存動態(tài)存儲區(qū)中分配n塊長度為size字節(jié)的連續(xù)區(qū)域。函數(shù)的返回值為該區(qū)域的首地址。 如: pscore = (float *) ca

溫馨提示

  • 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論