版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、第8章 指針山西財(cái)經(jīng)大學(xué)華商學(xué)院C語言程序設(shè)計(jì)指針的概念指針變量指針與數(shù)組0102038.1 指針的概念變量與地址程序中: int i10; float k20; 內(nèi)存中一個(gè)字節(jié)是一個(gè)內(nèi)存單元,它的編號-地址.2000200120022005內(nèi)存02003ik 編譯或函數(shù)調(diào)用時(shí)為其分配內(nèi)存單元1020printf(“%d”, i;).2000200420062005整型變量i10變量i_pointer200120022003指針與指針變量2000指針指針變量 變量的內(nèi)容 變量的地址指針:一個(gè)變量的地址指針變量:專門存放變量地址的變量指針變量與其所指向的變量之間的關(guān)系3i2000i_pointe
2、r指針變量變量變量地址(指針)變量值指向地址存入指針變量 & 與 * 運(yùn)算符含義: 取變量的地址單目運(yùn)算符優(yōu)先級: 2結(jié)合性:自右向左含義: 取指針?biāo)赶蜃兞康膬?nèi)容單目運(yùn)算符優(yōu)先級: 2結(jié)合性:自右向左兩者關(guān)系:互為逆運(yùn)算理解.2000200420062005整型變量i10變量i_pointer2001200220032000指針變量i_pointer-指針變量,它的內(nèi)容是地址量*i_pointer-指針的目標(biāo)變量,它的內(nèi)容是數(shù)據(jù)&i_pointer-指針變量占用內(nèi)存的地址i_pointer &i &(*i_pointer)i *i_pointer *(&i)i_pointer = &i =
3、&(*i_pointer)i = *i_pointer = *(&i)直接訪問與間接訪問直接訪問:按變量地址存取變量值間接訪問:通過存放變量地址的變量去訪問變量例 i=3; -直接訪問指針變量.2000200420062005整型變量i10變量i_pointer20012002200320003例 *i_pointer=20; -間接訪問208.2 指針變量指針變量的定義一般形式: 基類型 *指針名;合法標(biāo)識符指針的目標(biāo)變量的數(shù)據(jù)類型定義指針變量例 int *p1,*p2; float *q ; char *name;注意:1、指針變量名是p1,p2 ,不是*p1,*p22、 int *p1,
4、 *p2; 與 int *p1, p2;3、指針變量只能指向定義時(shí)所規(guī)定類型的變量4、定義指針變量時(shí)必須指定基類型。這是因?yàn)榛愋偷?指定與指針的移動和指針的運(yùn)算(加、減)相關(guān)1.算術(shù)運(yùn)算int *p,i;char *q , c;p=&i;q=&c;.i10001001100220002001cpqpq p+; q+;指針的運(yùn)算指針的運(yùn)算 y=*px+;y=(*px)+;.1010001001100220002001pxpx11iy=*px;px+;y=*px;(*px)+; (i+)y=10px=1002y=10*px=11px=1000問題1、若變量已正確定義并且指針p已經(jīng)指向某個(gè)變量x,
5、則(*p)-相當(dāng)于_。A、p- B、x- C、*(p-) D、&x- -問題2、下列語句定義 pf 為指向 float 類型變量 f 的指針,_是正確的。A、float f, *pf = f; B、float f, *pf = &f; C、float *pf = &f, f; D、float f, pf = f;BB實(shí)際例子:指針的概念main() int a; int *pa=&a; a=10; printf(a:%dn,a); printf(*pa:%dn,*pa); printf(&a:%dn,&a); printf(pa:%dn,pa); printf(&pa:%dn,&pa);.-3
6、8-34-32-33整型變量a10指針變量pa-37-36-35-38運(yùn)行結(jié)果:a:10*pa:10&a:-38pa:-38&pa:-36指針變量的初始化一般形式:基類型 *指針名=初始地址值;賦給指針變量,不是賦給目標(biāo)變量例 int i; int *p=&i;變量必須與已說明過的類型應(yīng)一致例 int *p=&i; int i;例 int i; int *p=&i; int *q=p;用已初始化指針變量作初值例 main( ) int i=10; int *p; *p=i; printf(“%d”,*p); 危險(xiǎn)!例 main( ) int i=10,k; int *p; p=&k; *p=i
7、; printf(“%d”,*p); 指針變量必須先賦值,再使用.2000200420062005整型變量i10指針變量p200120022003隨機(jī)例 輸入兩個(gè)數(shù),并使其從大到小輸出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=%dn,a,b); printf(max=%d,min=%dn,*p1,*p2);運(yùn)行結(jié)果:a=5,b=9 max=9,min=5.指針變量p1 指針變量p20002008200220042006 指針變量p2 整
8、型變量b 整型變量a5200692008200620082006例 輸入兩個(gè)數(shù),并使其從大到小輸出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=%dn,a,b); printf(max=%d,min=%dn,*p1,*p2);運(yùn)行結(jié)果:a=9,b=5 max=9,min=5.指針變量p1 指針變量p20002008200220042006 指針變量p2 整型變量b 整型變量a5200692008595指針變量作為函數(shù)參數(shù)地址傳遞特點(diǎn)
9、:共享內(nèi)存,“雙向”傳遞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);例 將數(shù)從大到小輸出.20002008200A2002200420065變量a 變量b(main)9 變量temp 變量y 變量x(swap)55959COPY指針變量作為函數(shù)參數(shù)地址傳遞特點(diǎn):共享內(nèi)存,“雙向”傳遞swap(int x,int y) int temp; temp=x; x=y; y=temp;main() int
10、 a,b; scanf(%d,%d,&a,&b); if(ab) swap(a,b); printf(n%d,%dn,a,b);例 將數(shù)從大到小輸出值傳遞.20002008200A2002200420065變量a 變量b(main)9運(yùn)行結(jié)果:5, 9swap(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)
11、; printf(n%d,%dn,a,b);.20002008200A200220042006200C200E2010.59整型變量a 整型變量b(main)指針pointer_1指針pointer_220002002(swap)指針p1指針p2整型p5920002002COPY5例 將數(shù)從大到小輸出指針變量作為函數(shù)參數(shù)地址傳遞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; pointe
12、r_2=&b; if(ab)swap(pointer_1,pointer_2); printf(n%d,%dn,a,b);.20002008200A200220042006200C200E2010.59整型變量a 整型變量b(main)指針pointer_1指針pointer_22000200259例 將數(shù)從大到小輸出運(yùn)行結(jié)果:9,5地址傳遞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=
13、&a; pointer_2=&b; if(ab) swap(pointer_1,pointer_2); printf(n%d,%dn,a,b);運(yùn)行結(jié)果:9,9編譯警告!結(jié)果不對!int x;int *p=&x;x;例 將數(shù)從大到小輸出.20002008200A200220042006200C200E2010.59整型變量a 整型變量b(main)指針pointer_1指針pointer_2200020029920002002COPY(swap)指針p1指針p2指針p*假設(shè)2000指針變量在使用前必須賦值!swap(int x,int y) int t; t=x; x=y; y=t;main(
14、) 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);運(yùn)行結(jié)果:5,9例 將數(shù)從大到小輸出值傳遞.20002008200A200220042006200C200E2010.59整型a 整型b(main)pointer_1pointer_2200020029COPY(swap)整型x整型b整型t5559運(yùn)行結(jié)果:5,9例 將數(shù)從大到小輸出swap(int *p1, in
15、t *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);.20002008200A200220042006200C200E2010.59整型a 整型b(main)pointer_1pointer_22000200220002002COPY(swap)指針p1指針p2指
16、針p*2000地址傳遞20002002如何通過函數(shù)調(diào)用得到n個(gè)改變的值1.在主調(diào)函數(shù)中設(shè)n個(gè)變量,用n個(gè)指針變量指向它們2. 用指針變量作形參,將n個(gè)變量的地址傳給所調(diào)用的函數(shù)的形參3.通過形參指針變量,改變該n個(gè)變量的值4.主調(diào)函數(shù)中就可以使用這些改變了值的變量。指向一維數(shù)組的指針定義首先定義一個(gè)整型數(shù)組a,再定義一個(gè)指向整型變量的指針變量p,然后將此數(shù) 組的第0號元素的地址賦予p,此時(shí)p就是 指向a數(shù)組的指針,數(shù)組的指針就是數(shù)組的起始地址。例如: int a5; int *p; p&a0; /*或p=a;*/8.3 指針與數(shù)組說明C語言中數(shù)組名代表數(shù)組的首地址,p&a0與pa 等價(jià),這里a
17、代表數(shù)組的首地址。指針的類型必須與數(shù)組元素的類型一致; 定義指針的同時(shí)賦予數(shù)組的首地址。例如: int a8; int *pa; 或 int *p=&a0;通過指針變量來引用一維數(shù)組的元素例如:定義如下數(shù)組和指針變量p: int a8,i,*p=a; (1) 下標(biāo)法:用ai 來引用數(shù)組a的第i個(gè)數(shù)組元素,(2) 指針法用*(ai),*(pi),pi引用數(shù)組的第i個(gè)數(shù)組元素(即:ai)。說明:a+i相當(dāng)于p+i等同于&ai指向數(shù)組元素的指針變量的運(yùn)算p+1指向數(shù)組的下一個(gè)元素,而不是p值加1。例如:數(shù)組元素是整型,每個(gè)元素占2個(gè)字節(jié),則p+1意味著使p的原值(地址)加2個(gè)字節(jié),使它指向下一個(gè)元素
18、。 p+; +p; /*使p指向數(shù)組的后一個(gè)元素 */p-; -P; /*使p指向數(shù)組的前一個(gè)元素 */p+i; /*使p往后移i個(gè)元素 */p-i; /*使p往前移i個(gè)元素 */p-q; /*求指針變量p和q之間元素的個(gè)數(shù),且q在p前*/p+q /* 兩個(gè)地址相加,無意義 */注意:若a是數(shù)組名,p是指向a數(shù)組的指針變量,則a+是非法的,但p+是合法的且經(jīng)常使用,用于指向數(shù)組下一個(gè)元素的地址。例 數(shù)組元素的引用。 1)用下標(biāo)法main() int a10,i; for( i=0; i10; i+) ai=i; for(i=0;i10;i+) printf(%d ,ai); 2)用數(shù)組名 ma
19、in() int a10,i; for( i=0; i10; i+) ai=i; for(i=0;i10;i+) printf(%d ,*(a+i); 3)用指針變量main() int a10,*p ,i; for(i=0; i10; i+) ai=i; for(p=a; p(a+10); p+) printf(%d ,*p); 小結(jié):1)引用數(shù)組元素包括下標(biāo)法和指針法 如:*(a+i)或*(p+i)或pi指針變量可以實(shí)現(xiàn)本身值的改變,但應(yīng)注意指針變量的當(dāng)前值。 如:p+1不同于p+3) 注意指針變量的運(yùn)算,弄清先取p值,還是先使p加1例 int a=1,2,3,4,5,6,7,8,9,10
20、,*p=a,i; 數(shù)組元素地址的正確表示:(A)&(a+1) (B)a+ (C)&p (D)&pi數(shù)組名是地址常量p+,p- ()a+,a- ()a+1, *(a+2) ()例 void main() int a =5,8,7,6,2,7,3; int y,*p=&a1; y=(*-p)+; printf(“%d ”,y); printf(“%d”,a0); 輸出:5 6pp58762730123456a例 注意指針變量的運(yùn)算6main() int i,*p,a7; p=a; for(i=0;i7;i+) scanf(%d,p+); printf(n); for(i=0;i7;i+,p+) p
21、rintf(%d,*p);例 注意指針的當(dāng)前值p=a;pp58762730123456apppppp指針變量可以指到數(shù)組后的內(nèi)存單元數(shù)組名作函數(shù)參數(shù)數(shù)組名作函數(shù)參數(shù),是地址傳遞數(shù)組名作函數(shù)參數(shù),實(shí)參與形參的對應(yīng)關(guān)系實(shí)參形參數(shù)組名指針變量數(shù)組名指針變量數(shù)組名數(shù)組名指針變量指針變量例 將數(shù)組a中的n個(gè)整數(shù)按相反順序存放 ij 3 7 9 11 0 6 7 5 4 20 1 2 3 4 5 6 7 8 9ijijijji11760594723實(shí)參與形參均用數(shù)組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=
22、xi; xi=xj; xj=t; main() int i,a10=3,7,9,11,0,6,7,5,4,2; inv(a,10); printf(The array has been reverted:n); for(i=0;i10;i+) printf(%d,ai); printf(n);m=4例 將數(shù)組a中的n個(gè)整數(shù)按相反順序存放 void inv(int *x, int n) int t,*p,*i,*j,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=3,7,9,11,0,6,7,5,4,2;
溫馨提示
- 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)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年企業(yè)公司上半年工作總結(jié)(四篇)
- 2025年度江河三片區(qū)環(huán)湖路(規(guī)劃支路)道路設(shè)施智能管理系統(tǒng)建設(shè)合同
- 2025年中專班主任工作總結(jié)(2篇)
- 2025年度房地產(chǎn)項(xiàng)目貸款期限及展期管理合同
- 2025年度建筑工程項(xiàng)目招投標(biāo)代理合同
- 2025年度大型公共建筑項(xiàng)目合同模板
- 2025年二方賓館轉(zhuǎn)讓合同范文(2篇)
- 2025年度家政服務(wù)與家庭生活可持續(xù)發(fā)展合同
- 2025年度養(yǎng)老機(jī)構(gòu)保安員聘用及老年人安全保障合同
- 2025年度建筑工程黃沙材料采購合同范本
- 2023湖北成人學(xué)位英語考試真題及答案1
- Q∕SY 06342-2018 油氣管道伴行道路設(shè)計(jì)規(guī)范
- 物業(yè)管理企業(yè)用工風(fēng)險(xiǎn)與防范對策
- 拜耳法氧化鋁生產(chǎn)工藝流程框圖
- 叉車日常維護(hù)保養(yǎng)檢查記錄表
- 心源性休克的護(hù)理.ppt課件
- 精品解析:2022年黑龍江省哈爾濱市中考語文試題(原卷版)
- 營業(yè)抄核收業(yè)務(wù)知識講座
- 單位事故隱患排查治理制度及臺賬
- 分公司經(jīng)營模式
- 上海通用泛亞整車開發(fā)流程
評論
0/150
提交評論