C語言中的指針_第1頁
C語言中的指針_第2頁
C語言中的指針_第3頁
C語言中的指針_第4頁
C語言中的指針_第5頁
已閱讀5頁,還剩14頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

會計學1C語言中的指針10.1指針的概念一、內(nèi)存的訪問方式1、直接訪問(通過變量名對內(nèi)存單元進行存取操作。)200020022004ijk

3

6

9

:

內(nèi)存用戶數(shù)據(jù)區(qū)::如:i=2,j=6,k=9printf(“%d”,i);該輸出語句是這樣執(zhí)行的:根據(jù)變量名與地址的對應(yīng)關(guān)系(該關(guān)系在編譯時確定),找到變量的地址2000,然后將從2000開始的兩個字節(jié)的內(nèi)容(即3)取出后輸出。第1頁/共19頁10.1指針的概念2000200220043010ijki_p

3

6

92000

:

內(nèi)存用戶數(shù)據(jù)區(qū)::2、間接訪問將變量i的地址存放在另一個變量中。假設(shè)變量i_p用來存放整型變量的地址,它被分配3010、3011兩個字節(jié),可用下例語句將i的地址存放到i_p中。

i_p=&i;即i-p中的的值為2000此時,要存取變量的值,可以先找到存放“i”地址的變量i_p,從中取出i的地址(2000),然后到2000,2001字節(jié)取出i的值3。第2頁/共19頁兩個概念:(1)指針──即地址

一個變量的地址稱為該變量的指針。通過變量的指針能夠找到該變量。(2)指針變量──專門用于存儲其它變量地址的變量指針變量i_p的值就是變量i的地址。10.1指針的概念第3頁/共19頁變量的指針就是變量的地址,存放變量地址的變量就是指針變量。為表示指針變量和它指向的變量之間的關(guān)系,用指針運算符“*”表示。即:*(i_p)就是i_p所指向的變量。10.2變量的指針和指向變量的指針變量20003i_p*(i_p)i因此,下面兩個語句的作用相同:①i=3; /*將3直接賦給變量i*/②i_p=&i;/*使i_p指向i*/*i_p=3;/*將3賦給指針變量i_p所指向的變量*/第4頁/共19頁10.2變量的指針和指向變量的指針變量1、指針變量的定義一般形式:類型標識符

*變量名如:int*p1;char*p2;float*p3;說明:*表示該變量為指針型變量,指針變量名為p1,p2,p3定義指針變量時必須指定基類型。它表示指針變量中存放的地址所指向的是什么類型的數(shù)據(jù)。給指針變量賦值:如:p1=&i(將i的地址賦給p1)注:一般不直接賦數(shù)值第5頁/共19頁2、指針變量的引用用指針變量對變量賦值:如:inti,j,*p;p=&i;*p=3;j=*p+2;注意:p是地址變量,而*p是非地址變量,與i是一回事?!?”:為指針運算符或叫指向運算符、間接運算符。定義后p=&I后*p=3后Ijp::::100010021004Ijp100010021004Ijp100010021004Ijp100031000100010021004j=*p+2后351000第6頁/共19頁例10.1通過指針變量訪問整型變量

main()

{inta,b;int*pointer_1,*pointer_2;

a=100;b=10;

pointer_1=&a;/*把變量a的地址賦給pointer_1*/

pointer_2=&b;/*把變量b的地址賦給pointer_2*/

printf(”%d,%d\n”,a,b);printf(”%d,%d\n”,*pointer_1,*pointer_2);}*pointer_1=&a對嗎?

運行結(jié)果為:

100,10100,10第7頁/共19頁關(guān)于運算符&和*的幾點說明:(1)結(jié)合性&和*兩運算符的優(yōu)先級相同,但結(jié)合方向為自右向左如:inta,b,*p1,*p2;p1=&a;p2=&b;&*p1的含義?

&*p1相當于&(*p1),等于&(*p1)=&(a)=&a=p1*&a的含義?*&a相當于*(&a)=*(p1)=a(2)優(yōu)先級處于第二位(見附錄)第8頁/共19頁(3)自增自減運算如:inta,b,*p;p=&a;a=3;b=5;(*p)++:相當于a++

,a=4*p++:相當于*(p++),先求*P的值(為3),然后P再++,若p原為1000,則p++為1002,即P不再指向a了。若floata,*p;p=&a;

當p為1000,則p++為1004第9頁/共19頁例10.2輸入a和b兩個整數(shù),按先大后小的順序輸出a和b。

main()

{int*p1,*p2,*p,a,b;

scanf("%d,%d“,&a,&b);

p1=&al;p2=&b;if(a<b){p=p1;pl=p2;p2=p;}printf("\na=%d,b=%d\n”,a,b);

printf("max=%d,min=%d\n“,*pl,*p2);

}

運行情況如下:輸入5,9回車,輸出結(jié)果?

a=5,b=9max=9,min=5第10頁/共19頁交換地址(指針變量),使p1指向大數(shù)b,而變量a、b未變。&a&b59&b5&a9p1ap2bppp1ap2b第11頁/共19頁3、指針變量作為函數(shù)參數(shù)功能:將一個變量的地址傳送到另一函數(shù)中,實參和形參均用指針。例10.3即對輸入的兩個整數(shù)按大小順序輸出(用函數(shù)處理)。

運行情況如下:輸入:5,9回車輸出:9,5voidswap(int*p1,*p2){intp;

p=*p1;*p1=*p2;*p2=p;}voidmain(){inta,b;int*pointer_1,*pointer_2;

scanf("%d,%",&a,&b);pointer_1=&a;pointer_2=&b;if(a<b)swap(pointer_1,pointer_2);

printf("\n%d,%d\n"a,b);

}第12頁/共19頁函數(shù)調(diào)用過程第13頁/共19頁下面例子能不能正確交換數(shù)據(jù)?

voidswap(pl,p2)

int*p1,*p2;{int*p;

p=pl;p1=p2;p2=p;

voidmain()

{inta,b;int*pointer_1,*pointer_2;

scanf(”%d%d",&a,&b);

pointer_l=&a;pointer_2=&b;

if(a<b)swap(pointer_l,pointer_2);

printf(”\n%d,%d\n”,*pointer_1,*pointer_2);

}第14頁/共19頁出錯的原因是參量不是雙向傳遞。&a&b59&a&b59&b5&b5&a9&a9Pointer_1ap1ap1apointer_1apointer_2bp2bp2bpointer_2b(a)(b)(c)(d)&a&b第15頁/共19頁如果想通過函數(shù)調(diào)用得到n個要改變的值,可以用如下方法:在主調(diào)函數(shù)中設(shè)n個變量,用n個指針變量指向他們;然后將指針變量作實參,將這n個變量的地址傳給所調(diào)用的函數(shù)的形參通過形參指針變量,改變該n個變量的值;主調(diào)函數(shù)中就可以使用這些改變了值的變量。第16頁/共19頁例10.4輸入a、b、c三個整數(shù),按大小順序輸出。(P228)

swap(int*

pt1,int*

pt2){intp;p=*pt1;*pt1=*pt2;*pt2=p;}exchange(int*

q1,int*

q2,int*

q3){if(*q1<*q2)swap(q1,q

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論