版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、2指針與指針變指針與指針變 量的概念量的概念 指針變量的定義與引用指針變量的定義與引用數(shù)組的指針和指針數(shù)組的使用;數(shù)組的指針和指針數(shù)組的使用;字符串指針和指向字符串的指針變量的字符串指針和指向字符串的指針變量的使用;使用; 3預(yù)預(yù) 備備 知知 識(shí)識(shí)內(nèi)存:就是內(nèi)部存儲(chǔ)器,是由存儲(chǔ)單元組成內(nèi)存:就是內(nèi)部存儲(chǔ)器,是由存儲(chǔ)單元組成 的。它的特點(diǎn)是存儲(chǔ)單元是的。它的特點(diǎn)是存儲(chǔ)單元是線性連續(xù)線性連續(xù) 的。存儲(chǔ)單元的最小單位是的。存儲(chǔ)單元的最小單位是字節(jié)字節(jié)。 1. 內(nèi)存的概念內(nèi)存的概念4地址:為了訪問(wèn)內(nèi)存中的某個(gè)存儲(chǔ)單元,我們地址:為了訪問(wèn)內(nèi)存中的某個(gè)存儲(chǔ)單元,我們 要為它編號(hào),這種編號(hào)稱為要為它編號(hào),這
2、種編號(hào)稱為內(nèi)存地址內(nèi)存地址。 通過(guò)地址我們就能夠訪問(wèn)該地址所標(biāo)通過(guò)地址我們就能夠訪問(wèn)該地址所標(biāo) 識(shí)的存儲(chǔ)單元。識(shí)的存儲(chǔ)單元。2. 地址的概念地址的概念5變量的地址:變量的地址:變量在內(nèi)存中總占用幾個(gè)連續(xù)的變量在內(nèi)存中總占用幾個(gè)連續(xù)的 字節(jié),字節(jié),開始字節(jié)的地址開始字節(jié)的地址,就是變量的地址。,就是變量的地址。6一、指針與指針變量的概念一、指針與指針變量的概念指針:指針:一個(gè)變量的地址稱為該變量的指針。一個(gè)變量的地址稱為該變量的指針。指針變量指針變量:若一個(gè)變量專用于存放另一個(gè)變量:若一個(gè)變量專用于存放另一個(gè)變量 的地址(指針),則該變量稱為指針變量。的地址(指針),則該變量稱為指針變量。7指針
3、的對(duì)象指針的對(duì)象:當(dāng)把變量的地址存入指針變量后,:當(dāng)把變量的地址存入指針變量后,我們就可以說(shuō)我們就可以說(shuō)這個(gè)指針指向了該變量這個(gè)指針指向了該變量。 8“&”(地址運(yùn)算符地址運(yùn)算符) :取變量的存儲(chǔ)地址。取變量的存儲(chǔ)地址?!?” (指針運(yùn)算符指針運(yùn)算符) :是取指針?biāo)赶蜃兞康闹凳侨≈羔標(biāo)赶蜃兞康闹?。 如:&a 是求變量a的地址。 *p 是p所指向的變量的值9“&”運(yùn)算和運(yùn)算和“*”運(yùn)算是一對(duì)互逆運(yùn)算。運(yùn)算是一對(duì)互逆運(yùn)算。 &*p &i p *&i *p i101、指針變量的定義、指針變量的定義 格式:格式: 類型標(biāo)識(shí)符類型標(biāo)識(shí)符 * * 指針
4、變量名指針變量名 ;如: int *p1, *p2;二、指針變量的定義與引用指明了該指針指向指明了該指針指向的內(nèi)存空間所存儲(chǔ)的內(nèi)存空間所存儲(chǔ)的數(shù)據(jù)類型。的數(shù)據(jù)類型。指向指向11在定義指針變量時(shí)要注意以下幾個(gè)問(wèn)題在定義指針變量時(shí)要注意以下幾個(gè)問(wèn)題: 變量名變量名p2前面的前面的“*”不能省略,不能省略,如果寫成如果寫成 int *p1, p2; 會(huì)如何?會(huì)如何? 定義中的“*”表示所定義的變量是指針變量,但指針變量名是p1、p2,而非*p1、*p2。 12指針變量只能指向定義時(shí)所規(guī)定類型的變量。指針變量只能指向定義時(shí)所規(guī)定類型的變量。 定義指針變量后,并未確定該變量指向何處。定義指針變量后,并未
5、確定該變量指向何處。在引用指針變量前必須在引用指針變量前必須首先讓它指向一個(gè)變量首先讓它指向一個(gè)變量,即先賦值后使用。即先賦值后使用。 13指針變量指向一個(gè)變量的格式:指針變量指向一個(gè)變量的格式: 指針變量名指針變量名=&變量名;變量名; 如:如: p=&i;14 #include stdio.h void main() int i=5; int *p; /定義指針變量p p=&i; /將 i的地址賦給p printf(%d,%d,%d,i,p,*p); 思考思考1:運(yùn)行結(jié)果?:運(yùn)行結(jié)果?已知已知i的地址是的地址是1245052思考思考2: p=&i可換成 *p
6、=i 或*p=&i嗎? 15 #include stdio.h void main() int *p1,*p2,*p,a,b; scanf(%d,%d,&a,&b); p1=&a; p2=&b; if (ab) p=p1;p1=p2;p2=p; printf(a=%d,b=%d,max=%d,min=%d,a,b,*p1,*p2); 16三、指針變量作為函數(shù)參數(shù)三、指針變量作為函數(shù)參數(shù) 指針可以用作函數(shù)參數(shù),指針可以用作函數(shù)參數(shù),將一個(gè)變量的地址傳送到另一個(gè)函數(shù)中。將一個(gè)變量的地址傳送到另一個(gè)函數(shù)中。這在調(diào)用函數(shù)希望改變參數(shù)的值時(shí)非常有用。這在調(diào)用函數(shù)希
7、望改變參數(shù)的值時(shí)非常有用。 17例:用指針變量編寫實(shí)現(xiàn)兩個(gè)數(shù)的交換的函數(shù)例:用指針變量編寫實(shí)現(xiàn)兩個(gè)數(shù)的交換的函數(shù)void swap(int *p1, int *p2); main() int x1=100,x2=200; printf(x1=%d,x2=%dn,x1,x2); swap(&x1,&x2); printf(x1=%d,x2=%dn,x1,x2);void swap (int *p1, int *p2) int temp; temp=*p1; *p1=*p2; *p2=temp; 思考:運(yùn)行結(jié)果如何?思考:運(yùn)行結(jié)果如何?18 void swap(int *p1, i
8、nt *p2); main() int x1=100,x2=200; int *pp1,*pp2; pp1=&x1;pp2=&x2; printf(x1=%d,x2=%dn,x1,x2); swap(pp1,pp2); printf(x1=%d,x2=%dn,x1,x2); void swap (int *p1, int *p2) int temp; temp=*p1; *p1=*p2; *p2=temp; 19圖示交換過(guò)程中存儲(chǔ)單元內(nèi)容的變化:圖示交換過(guò)程中存儲(chǔ)單元內(nèi)容的變化:12345620思考1:如果函數(shù)的參數(shù)不用指針而用整數(shù),能否實(shí)現(xiàn)值的交換?思考2:若調(diào)用語(yǔ)句改為 s
9、wap(x1,x2);可否?可否? 21void swap (int *p1, int *p2) int *temp; *temp=*p1; *p1=*p2; *p2=*temp; void swap (int *p1, int *p2) int *temp; temp=p1; p1=p2; p2=temp; 思考3:若函數(shù)換成如下形式,結(jié)果如何?22void swap(int *p1, int *p2); main() int a=100,b=200; int *p01,*p02; p01=&a;p02=&b; if (ab) swap(p01,p02); printf(%d
10、,%dn,*p01,*p02);void swap (int *p1, int *p2) int *temp; temp=p1; p1=p2; p2=temp; 100,20023void main() void exchange(int *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,%d,a,b,c); void swap(int *pt1,int
11、 *pt2) int temp;temp=*pt1;*pt1=*pt2;*pt2=temp;void 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(*q2*q3) swap(q2,q3);例:按大小順序輸出例:按大小順序輸出三個(gè)整數(shù)三個(gè)整數(shù) 。24指針(2)指針與指針變指針與指針變 量的概念量的概念 指針變量的定義與引用指針變量的定義與引用數(shù)組與指針數(shù)組與指針 字符串與指針字符串與指針25數(shù)組與指針數(shù)組與指針1 一維數(shù)組
12、和指針2 指針的運(yùn)算3 用數(shù)組名做函數(shù)參數(shù)261 一維數(shù)組和指針 數(shù)組是連續(xù)存放的若干個(gè)元素的集合。 數(shù)組名是指向第一個(gè)元素的指針(首地址)27int a10,*p ; /定義定義思考:如何將思考:如何將p指向數(shù)組指向數(shù)組a?p=a ; /將數(shù)組將數(shù)組a的的 首地址賦給首地址賦給pp=&a0;/等價(jià)于等價(jià)于p=a28 定義指針變量時(shí)也可以賦初值 int *p=&a0;/int *p; p=&a0;或 int *p=a;/int *p; p=a;29 數(shù)組元素 的下標(biāo)在 內(nèi)部實(shí)現(xiàn)時(shí),統(tǒng)一按“基地址位移”的方式處理。 a,a+1,a+i p+1/指向同一數(shù)組的下一個(gè)元素30
13、 數(shù)組數(shù)組a中第中第 i個(gè)元素的地址可表示為:個(gè)元素的地址可表示為: &ai /下標(biāo)表示 p+i /指針變量,初值p=a; a+i /數(shù)組指針 數(shù)組數(shù)組a第第 i個(gè)元素的內(nèi)容可表示為:個(gè)元素的內(nèi)容可表示為: ai/下標(biāo)表示 *(p+i)/指針變量,初值p=a; *(a+i)/數(shù)組指針31例:輸出例:輸出1010個(gè)元素?cái)?shù)組中的全部元素。個(gè)元素?cái)?shù)組中的全部元素。方法二:通過(guò)數(shù)組名計(jì)算數(shù)組元素地址,找出元素的值。方法二:通過(guò)數(shù)組名計(jì)算數(shù)組元素地址,找出元素的值。 main()main() int a10=54,65,8,2,3,56,8,21,57,98,i; int a10=54,65,8
14、,2,3,56,8,21,57,98,i; for(i=0;i10;i+) for(i=0;i10;i+) printf(%4d, printf(%4d, * *(a+i)(a+i) ); ); 方法一:下標(biāo)法。方法一:下標(biāo)法。 main()main() int a10=54,65,8,2,3,56,8,21,57,98, i; int a10=54,65,8,2,3,56,8,21,57,98, i; for(i=0;i10;i+) for(i=0;i10;i+) printf(%4d, printf(%4d, aiai ); ); 32方法三:用指針變量指向數(shù)組元素方法三:用指針變量指向數(shù)
15、組元素 main() int a10=54,65,8,2,3,56,8,21,57,98, *p, i; p=a; for(i=0;i10;i+) printf(%4d, *(p+i) );注注 : 以上三種方法,利用指針變量效率最高。以上三種方法,利用指針變量效率最高。 33main() int a10=54,65,8,2,3,56,8,21,57,98, *p, i;for (p=a;p(a+10);p+) printf(“%4d”, *p );/與上例有什么區(qū)別?與上例有什么區(qū)別?main() int a10=54,65,8,2,3,56,8,21,57,98, *p, i;for (p
16、=a,i=0;i10;i+,p+) printf(%4d, *p );main() int a10=54,65,8,2,3,56,8,21,57,98, *p, i;p=a;for (i=0;i10;i+) printf(%4d, *p+ );34353637說(shuō)明:指針變量與數(shù)組名的區(qū)別:說(shuō)明:指針變量與數(shù)組名的區(qū)別: 如: int i, *p, a6; p=&i ; /正確 a=&i ; a+; a+=i ; /錯(cuò)誤,因?yàn)椴荒芙o常量賦值地址變量地址變量地址常量地址常量38要注意指針變量的當(dāng)前值。要注意指針變量的當(dāng)前值。 例如:通過(guò)指針變量輸入輸出例如:通過(guò)指針變量輸入輸出a
17、a數(shù)組元素。數(shù)組元素。main()main() int int * *p,i,a5;p,i,a5; p=a; p=a; for(i=0;i5;i+) scanf(“%6d”,p+); for(i=0;i5;i+) scanf(“%6d”,p+); /p/p最后指向數(shù)組最后指向數(shù)組a a的末尾的末尾 p=a;/p=a;/使使p p重新指向數(shù)組重新指向數(shù)組a a的首地址的首地址 for(i=0;i5;i+) for(i=0;i5;i+) printf(%2d, printf(%2d,* *p+); p+); 39小結(jié):用指針輸入和輸出數(shù)組的典型格式 #include stdio.h void ma
18、in() int a3,*p,i; p=a; for (i=0;i=2;i+) scanf(%d,p+); p=a; for (i=0;i=2;i+) printf(%4d,*p+); 402 2 指針的運(yùn)算指針的運(yùn)算414243*p+,等價(jià)于,等價(jià)于*(p+)。*(p+)與與*(+p)作用不同。作用不同。(*p)+表示表示p所指向的元素值加所指向的元素值加1。注意:注意:*p+、*(p+)、(*p)+、*(+p)的含義的含義 4410634pa*p+、*(p+)、(*p)+、*(+p)*(-p) *(p-)的值各為多少?指針如何變化?的值各為多少?指針如何變化?45464748有問(wèn)題嗎?有問(wèn)
19、題嗎?49 如果有一個(gè)實(shí)參數(shù)組,想在函數(shù)中改變此數(shù)組的元素的值,如果有一個(gè)實(shí)參數(shù)組,想在函數(shù)中改變此數(shù)組的元素的值,實(shí)參與形參都可用數(shù)組名或指針變量其對(duì)應(yīng)關(guān)系有以下實(shí)參與形參都可用數(shù)組名或指針變量其對(duì)應(yīng)關(guān)系有以下4 4種情況:種情況:實(shí)參與形參都用數(shù)組名;實(shí)參與形參都用數(shù)組名;實(shí)參、形參都用指針變量;實(shí)參、形參都用指針變量;實(shí)參用數(shù)組名,形參用指針變量;實(shí)參用數(shù)組名,形參用指針變量;實(shí)參為指針變量,形參用數(shù)組名。實(shí)參為指針變量,形參用數(shù)組名。注意:用指針變量作實(shí)參時(shí)一定要有確定的值。注意:用指針變量作實(shí)參時(shí)一定要有確定的值。2 2 、數(shù)組名作函數(shù)的參數(shù)、數(shù)組名作函數(shù)的參數(shù) 5051525354
20、55練習(xí):將數(shù)組練習(xí):將數(shù)組a的元素倒置存放在數(shù)組的元素倒置存放在數(shù)組b中。中。#include stdio.hvoid main() int a10,b10,*p,*q,i; p=a+9; q=b; for (i=0;i=9;i+) scanf(%d,a+i); for (i=0;i10;i+) *q=*p; q+; p-; q=b; for (i=0;i=q;p-) printf(%c,*p); /putchar(*p); 6263例:64#include stdio.h#include string.hint huiwen(char *p) int n=strlen(p); char *
21、q=p+n-1; while (pq) if (*p=*q) p+;q-; else return 0; return 1;void main() char *m=abcba; printf(是回文嗎?是回文嗎?); if (huiwen(m)=1) printf(yes!); else printf(no!) ; 65666768697071#include stdio.hvoid main()int b=3; char *fmt=“b=%dn; printf(fmt,b); 6 72#include stdio.hvoid main() int x=5,*p; p=&x; scan
22、f(%d,p); scanf(%d,&x); printf(%d,*p); printf(%d,x);#include stdio.hvoid main()char d10,*q;/char d10=apple,*q; q=apple; q=d; scanf(%s,q); scanf(%s,d); printf(%s,q); printf(%s,d);7.注意使用的區(qū)別注意使用的區(qū)別73練習(xí)練習(xí)1:輸出字符串中:輸出字符串中n個(gè)字符后的所有字符。個(gè)字符后的所有字符。 main() char *ps; int n,i; gets(ps); scanf(%d,&n); for (i=0;in;i+) ps+; /ps=ps+n; printf(%sn,ps); 74練習(xí)練習(xí)2、在輸入的字符串中查找有無(wú)、在輸入的字符串中查找有無(wú)k字符。字符。#
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 損害賠償和解協(xié)議書3篇
- 招標(biāo)文件范本的內(nèi)容說(shuō)明3篇
- 工業(yè)材料采購(gòu)規(guī)定3篇
- 房屋買賣合同正規(guī)格式3篇
- 工傷全權(quán)代理書3篇
- 房屋買賣委托公證指南3篇
- 招標(biāo)編號(hào)修改優(yōu)化招標(biāo)過(guò)程的關(guān)鍵步驟3篇
- 開庭委托書寫作技巧大放送3篇
- 教育培訓(xùn)部門主管派遣服務(wù)合同3篇
- 招標(biāo)文件附件格式創(chuàng)新方法3篇
- DB3502∕Z 5058-2020 廈門市城市軌道交通工程預(yù)算定額(土建工程)
- 《橋梁工程計(jì)算書》word版
- (完整版)ECRS培訓(xùn)課件
- 《激光原理》復(fù)習(xí)解析
- 增值稅發(fā)票稅控系統(tǒng)專用設(shè)備注銷發(fā)行登記表
- 質(zhì)量管理體系各條款的審核重點(diǎn)
- 聚丙烯化學(xué)品安全技術(shù)說(shuō)明書(MSDS)
- 蔬菜采購(gòu)合同水果蔬菜采購(gòu)合同
- CX-TGK01C型微電腦時(shí)間溫度控制開關(guān)使用說(shuō)明書
- 電儀工段工段長(zhǎng)職位說(shuō)明書
- 簡(jiǎn)易送貨單EXCEL打印模板
評(píng)論
0/150
提交評(píng)論