指針(胡曉麗)_第1頁
指針(胡曉麗)_第2頁
指針(胡曉麗)_第3頁
指針(胡曉麗)_第4頁
指針(胡曉麗)_第5頁
已閱讀5頁,還剩65頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、C語言程序設(shè)計(jì)大賽培訓(xùn)之 指針教學(xué)實(shí)踐部計(jì)算機(jī)中心教學(xué)實(shí)踐部計(jì)算機(jī)中心胡曉麗胡曉麗指針的用途指針在指針在C 語言里應(yīng)用極為廣泛,是語言里應(yīng)用極為廣泛,是C語言的靈魂語言的靈魂等許多其它數(shù)據(jù)類型等許多其它數(shù)據(jù)類型難以實(shí)現(xiàn)的復(fù)雜操作難以實(shí)現(xiàn)的復(fù)雜操作培訓(xùn)目的o掌握指針的概念、指針變量定義格式和引用o掌握指針的運(yùn)算方法o指針應(yīng)用舉例理解指針理解指針 指針指針 就是內(nèi)存中的就是內(nèi)存中的變量的地址變量的地址理解指針理解指針o內(nèi)存單元的編號(hào):計(jì)算機(jī)內(nèi)內(nèi)存單元的編號(hào):計(jì)算機(jī)內(nèi)存中,每一個(gè)字節(jié)的存儲(chǔ)單存中,每一個(gè)字節(jié)的存儲(chǔ)單元都有一個(gè)編號(hào)(亦稱為元都有一個(gè)編號(hào)(亦稱為內(nèi)內(nèi)存地址存地址) o在在VC中,內(nèi)存單元

2、的編號(hào)是中,內(nèi)存單元的編號(hào)是一個(gè)一個(gè)8位的十六進(jìn)制數(shù)(表示位的十六進(jìn)制數(shù)(表示32位二進(jìn)制數(shù),位二進(jìn)制數(shù),VC是是32位編位編譯系統(tǒng))譯系統(tǒng)) 如:如:0013FF7C0013FF7C0013FF7B0013FF7A0013FF790013FF00.理解指針變量變量:實(shí)質(zhì)是代表了“內(nèi)存中的某個(gè)存儲(chǔ)單元”。若在內(nèi)存中定義了一個(gè)變量,則這個(gè)變量的內(nèi)存的地址也就確定了。若在內(nèi)存中定義了一個(gè)變量,則這個(gè)變量的內(nèi)存的地址也就確定了。理解指針變量的地址變量的地址:表示變量在內(nèi)存中的位置,其:表示變量在內(nèi)存中的位置,其值是該變量在內(nèi)存中所占存儲(chǔ)單元的首字節(jié)的編值是該變量在內(nèi)存中所占存儲(chǔ)單元的首字節(jié)的編號(hào)號(hào)

3、程序中: int i; float k; 內(nèi)存中每個(gè)字節(jié)有一個(gè)編號(hào)-地址.2000200120022005內(nèi)存02003ik 編譯或函數(shù)調(diào)用時(shí)為其分配內(nèi)存單元變量是對(duì)程序中數(shù)據(jù)存儲(chǔ)空間的抽象理解指針oa在內(nèi)存中占在內(nèi)存中占4個(gè)字節(jié),但個(gè)字節(jié),但&a的值是的值是4個(gè)字節(jié)中首個(gè)字節(jié)的編號(hào)個(gè)字節(jié)中首個(gè)字節(jié)的編號(hào) n運(yùn)算符運(yùn)算符&:取地址,如:取地址,如&a 的值為變量的值為變量a的地址的地址 n變量地址的輸出可以用格式字符串變量地址的輸出可以用格式字符串“%p”#include void main() int a;a=8;printf(%d %pn,a,&a); 00

4、13FF7C000000000013FF7B000000000013FF7A000000000013FF79000010000013FF00.理解指針理解指針我們?cè)诔绦蛑兄恍枰赋鲎兞棵瑹o需知道每個(gè)變量我們?cè)诔绦蛑兄恍枰赋鲎兞棵?,無需知道每個(gè)變量在內(nèi)存中的具體地址,每個(gè)變量與具體地址的聯(lián)系是在內(nèi)存中的具體地址,每個(gè)變量與具體地址的聯(lián)系是由由C編譯系統(tǒng)來完成的。對(duì)變量的存取操作就是對(duì)某編譯系統(tǒng)來完成的。對(duì)變量的存取操作就是對(duì)某個(gè)存儲(chǔ)單元進(jìn)行操作。這種個(gè)存儲(chǔ)單元進(jìn)行操作。這種直接按變量的地址存取變直接按變量的地址存取變量值量值的方式稱為的方式稱為“直接存取直接存取”。 4502實(shí)實(shí)驗(yàn)驗(yàn)室室二二

5、我有幾種方法我有幾種方法可以到實(shí)驗(yàn)室可以到實(shí)驗(yàn)室上機(jī)?上機(jī)?2、按實(shí)驗(yàn)室所在的、按實(shí)驗(yàn)室所在的教室編號(hào)教室編號(hào)1、按實(shí)驗(yàn)室名字、按實(shí)驗(yàn)室名字按變量名按變量名按變量地址按變量地址 (即即 指針指針)實(shí)實(shí)驗(yàn)驗(yàn)室室一一實(shí)實(shí)驗(yàn)驗(yàn)室室三三45034707理解指針理解指針指針指針:也是一種變量,這種變量是用來存放內(nèi)也是一種變量,這種變量是用來存放內(nèi)存地址的。存地址的。指針變量o指針是指針是 字節(jié)的編號(hào),即地址。字節(jié)的編號(hào),即地址。 o指針也是要存儲(chǔ)的,因此每個(gè)指針也需要指針也是要存儲(chǔ)的,因此每個(gè)指針也需要一個(gè)變量來存儲(chǔ)它。這個(gè)變量稱為指針變一個(gè)變量來存儲(chǔ)它。這個(gè)變量稱為指針變量。指針變量的值是某一定義好的

6、變量的量。指針變量的值是某一定義好的變量的地址。地址。理解指針變量&a2001p=&a;1011ap例:例:int *p; int a=3;101220020000001100000000間接存?。哼@種通過變量p到變量a的地址,然后再存取變量a的值的方式稱為“間接存取”。指針變量p指向了變量a的含義是:指針p中存放了變量a的地址。指針變量的定義定義形式如下:定義形式如下: 數(shù)據(jù)類型數(shù)據(jù)類型 *指針變量名指針變量名; 如:如: int *p1, num; o表示的意思為:表示的意思為: 定義了一個(gè)指針變量定義了一個(gè)指針變量p1,它指向的是一個(gè)整型數(shù),它指向的是一個(gè)整型數(shù)據(jù)?;蛘哒f

7、,這時(shí)候據(jù)?;蛘哒f,這時(shí)候p1中存儲(chǔ)的是一個(gè)整型變量中存儲(chǔ)的是一個(gè)整型變量的地址。的地址。 o注意:指針變量定義了之后,需要給它賦一個(gè)確注意:指針變量定義了之后,需要給它賦一個(gè)確定的變量的地址,否則,就會(huì)出現(xiàn)嚴(yán)重的系統(tǒng)錯(cuò)定的變量的地址,否則,就會(huì)出現(xiàn)嚴(yán)重的系統(tǒng)錯(cuò)誤。誤。指針變量的引用#include main() int a; /定義一個(gè)整型變量定義一個(gè)整型變量a int *p1; /定義指向整型變量的指針定義指向整型變量的指針p1 p1=&a; /p1中應(yīng)存放變量中應(yīng)存放變量a的地址的地址 *p1=5; /通過指針變量通過指針變量p1給給a賦值賦值 printf(a=%d, a);

8、例:int *p,*s,k=20; s=&k; p=&s;.2000200420062005整型變量k變量s200120022003變量p20072008202000200020042004s=*pk=*s所以:k=*p說明:(1)指針p的基類型是int類型的指針。(2)是求地址運(yùn)算符。(3)因?yàn)榛緮?shù)據(jù)類型int、float、char等所需存儲(chǔ)空間不同,所以需要定義指針變量的基類型。例例: 指針的概念指針的概念main() int a; int *pa=&a; a=10; printf(a:%dn,a); printf(*pa:%dn,*pa); printf(&am

9、p;a:%x(hex)n,&a); printf(pa:%x(hex)n,pa); printf(&pa:%x(hex)n,&pa);運(yùn)行結(jié)果:a:10*pa:10&a:f86(hex)pa:f86(hex)&pa:f88(hex).f86f8af8cf8b整型變量a10指針變量paf87f88f89f86指針的運(yùn)算方法指針的移動(dòng)所謂移動(dòng)指針就是對(duì)指針變量加上或減去一個(gè)所謂移動(dòng)指針就是對(duì)指針變量加上或減去一個(gè)整數(shù)整數(shù),或通過賦值運(yùn)算,使指針指向相鄰的存,或通過賦值運(yùn)算,使指針指向相鄰的存儲(chǔ)單元。只有當(dāng)指針指向一串連續(xù)的存儲(chǔ)單元儲(chǔ)單元。只有當(dāng)指針指向一串連

10、續(xù)的存儲(chǔ)單元時(shí),還可以和指向同一串連續(xù)存儲(chǔ)單元的指針時(shí),還可以和指向同一串連續(xù)存儲(chǔ)單元的指針進(jìn)行相減的運(yùn)算,除此之外,不可以對(duì)指針進(jìn)進(jìn)行相減的運(yùn)算,除此之外,不可以對(duì)指針進(jìn)行任何其它的算術(shù)運(yùn)算。行任何其它的算術(shù)運(yùn)算。指針的運(yùn)算方法 指針變量只能進(jìn)行邏輯運(yùn)算和相減的算術(shù)運(yùn)算。指針變量只能進(jìn)行邏輯運(yùn)算和相減的算術(shù)運(yùn)算。 不是指向同一數(shù)組的指針變量運(yùn)算是無意義的。不是指向同一數(shù)組的指針變量運(yùn)算是無意義的。 指針變量的值加指針變量的值加1或減或減1,并不是地址加,并不是地址加1中減中減1,而是加,而是加上或減去該變量在內(nèi)存中所占的字節(jié)數(shù),該字節(jié)數(shù)由指上或減去該變量在內(nèi)存中所占的字節(jié)數(shù),該字節(jié)數(shù)由指針的

11、基類型決定。針的基類型決定。指針的移動(dòng)111122334455a0a1a2a3a4pqDD00DD02DD04DD06DD08DD0ADD0CDD0EDD10ijDD12DD14DD16p=&a0;DD00q=p+2;DD04q+;DD06q-;DD04i=*p;11j=*q;33例:例:指針的運(yùn)算方法指針的比較在關(guān)系表達(dá)式中,可以對(duì)指針進(jìn)行比較。即兩在關(guān)系表達(dá)式中,可以對(duì)指針進(jìn)行比較。即兩個(gè)變量地址的比較。個(gè)變量地址的比較。通常兩個(gè)或多個(gè)指針指向同一目標(biāo)時(shí)(一串連續(xù)的存儲(chǔ)單元),比較才有意義。指針應(yīng)用舉例-指針作為函數(shù)的參數(shù)指針可以作為參數(shù)在主調(diào)函數(shù)和被調(diào)用函數(shù)之間指針可以作為參數(shù)在

12、主調(diào)函數(shù)和被調(diào)用函數(shù)之間傳遞數(shù)據(jù),通過指針可以在被調(diào)用函數(shù)中地調(diào)用傳遞數(shù)據(jù),通過指針可以在被調(diào)用函數(shù)中地調(diào)用中的變量進(jìn)行引用,這也就使得通過形參改變對(duì)中的變量進(jìn)行引用,這也就使得通過形參改變對(duì)應(yīng)實(shí)參的值有了可能,利用此形式就可以把兩個(gè)應(yīng)實(shí)參的值有了可能,利用此形式就可以把兩個(gè)或兩個(gè)以上的數(shù)據(jù)從被調(diào)用的函數(shù)返回到調(diào)用函數(shù)?;騼蓚€(gè)以上的數(shù)據(jù)從被調(diào)用的函數(shù)返回到調(diào)用函數(shù)。例例 將數(shù)從大到小輸出將數(shù)從大到小輸出指針應(yīng)用舉例-指針作為函數(shù)的參數(shù)swap(int x,int y) int temp; temp=x; x=y; y=temp;main() int a,b; scanf(%d,%d,&

13、a,&b); if(ab) swap(a,b); printf(n%d,%dn,a,b);指針應(yīng)用舉例-指針作為函數(shù)的參數(shù).20002008200A2002200420065變量a 變量b(main)9 變量temp 變量y 變量x(swap)559 59COPYswap(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);指針應(yīng)用舉例-指針作為函數(shù)的參數(shù)swap(int x,int y)

14、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);值傳遞.20002008200A2002200420065變量a 變量b(main)9運(yùn)行結(jié)果:5, 9變量x 變量y(swap) 變量t59595swap(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,

15、&b); pointer_1=&a; pointer_2=&b; if(ab)swap(pointer_1,pointer_2); printf(n%d,%dn,a,b);.20002008200A200220042006200C200E2010.59整型變量a 整型變量b(main)指針pointer_1指針pointer_220002002(swap)指針p1指針p2整型p5920002002COPY5運(yùn)行結(jié)果:9,5地址傳遞通過傳送地址值,可以在被調(diào)用函數(shù)中直接改變調(diào)用函數(shù)中的變量的值通過傳送地址值,可以在被調(diào)用函數(shù)中直接改變調(diào)用函數(shù)中的變量的值指針應(yīng)用舉例-指針

16、作為函數(shù)的參數(shù)指針應(yīng)用舉例-指向數(shù)組的指針變量例編寫程序,定義一個(gè)含有15個(gè)元素的數(shù)組,并編寫函數(shù)分別完成以下操作:(1)調(diào)用C庫函數(shù)中的隨機(jī)函數(shù)給所有元素賦以049之間的隨機(jī)數(shù);(2)輸出數(shù)組元素中的值;(3)按順序?qū)γ扛羧齻€(gè)數(shù)求一個(gè)和數(shù),并傳回主函數(shù);(4)最后輸出所有求出的和值。指針應(yīng)用舉例-指向數(shù)組的指針變量調(diào)用隨機(jī)函數(shù)的方法如下:包含頭文件stdlib.hn=rand()%x;n將得到一個(gè)在0(x-1)之間的隨機(jī)數(shù)。指針應(yīng)用舉例-指向數(shù)組的指針變量分析:(1)由于要每隔3個(gè)數(shù)求一個(gè)和,15個(gè)數(shù)要求出5個(gè)和,所以主函數(shù)中要定義一個(gè)數(shù)組來存放5個(gè)和數(shù)。(2)兩次輸出元素的值,雖然輸出對(duì)象

17、不同,但是數(shù)組的類型相同,可調(diào)用一個(gè)函數(shù)來完成,只要指定不同的數(shù)組名,不同的輸出個(gè)數(shù)即可。指針應(yīng)用舉例-指向數(shù)組的指針變量#include stdio.h#include stdlib.h#define SIZE 15#define N 3void getrand(int *,int);void getave(int *,int *,int);void printarr(int *,int);指針應(yīng)用舉例-指向數(shù)組的指針變量void printarr(int *a,int n)int i;for(i=0;in;i+)printf(%4d, *(a+i); if(i+1)%5=0) printf

18、(n);printf(n);指針應(yīng)用舉例-指向數(shù)組的指針變量void getave(int *a,int *b,int n)int i,j=0,sum=0;for(i=0;in;i+)sum+=*(a+i);/*累加數(shù)組元素累加數(shù)組元素*/if(i+1)%3=0) /*每累加每累加3個(gè)進(jìn)行一次處理個(gè)進(jìn)行一次處理*/bj=sum;sum=0;j+;指針應(yīng)用舉例-指向數(shù)組的指針變量void getrand(int *a,int n)int i;for(i=0;in;i+)*(a+i)=rand()%50;指針應(yīng)用舉例-指向數(shù)組的指針變量main()int xSIZE,wSIZE/N=0; /*數(shù)組

19、中置初值為數(shù)組中置初值為0,準(zhǔn)備存放,準(zhǔn)備存放5個(gè)數(shù)的和個(gè)數(shù)的和*/clrscr();getrand(x,SIZE); /*調(diào)用函數(shù)產(chǎn)生調(diào)用函數(shù)產(chǎn)生15個(gè)隨機(jī)數(shù)放入數(shù)組個(gè)隨機(jī)數(shù)放入數(shù)組x中中*/printf(nOutput %d random numbers:n ,SIZE);printarr(x,SIZE); /*輸出輸出15個(gè)隨機(jī)數(shù)個(gè)隨機(jī)數(shù)*/getave(x,w,SIZE); /*每每3個(gè)數(shù)求一個(gè)和放入數(shù)組個(gè)數(shù)求一個(gè)和放入數(shù)組w中中*/printf(nOutput 5 sum numbers:n);printarr(w,SIZE/N); /*輸出輸出5個(gè)數(shù)的和個(gè)數(shù)的和*/指針應(yīng)用舉例-指

20、向數(shù)組的指針變量指針應(yīng)用舉例-指向數(shù)組的指針變量例:編寫程序,將數(shù)組中的數(shù)按顛倒的順序重例:編寫程序,將數(shù)組中的數(shù)按顛倒的順序重新存放。在操作時(shí),只能借助一個(gè)臨時(shí)存儲(chǔ)單新存放。在操作時(shí),只能借助一個(gè)臨時(shí)存儲(chǔ)單元而不得另外開辟數(shù)組。元而不得另外開辟數(shù)組。分析:不是要求按顛倒的順序打印數(shù)據(jù),而是要分析:不是要求按顛倒的順序打印數(shù)據(jù),而是要求按逆序重新放置數(shù)組中的內(nèi)容。假定求按逆序重新放置數(shù)組中的內(nèi)容。假定a數(shù)組中數(shù)組中有有8個(gè)元素個(gè)元素指針應(yīng)用舉例-指向數(shù)組的指針變量102030405060708010011003100510071009100B100D100Fa0a1a2a3a4a5a6a780

21、7060504030201010011003100510071009100B100D100Fa0a1a2a3a4a5a6a7指針應(yīng)用舉例-指向數(shù)組的指針變量(1)定義兩個(gè)變量i和j,首先將a0,a7進(jìn)行對(duì)調(diào),中間用到一個(gè)臨時(shí)存儲(chǔ)單元,所以定義同類型變量temp。(2)將變量i加1,j減1,滿足條件ij時(shí),將a1和a6進(jìn)行對(duì)調(diào)(3)最后將a3和a4進(jìn)行對(duì)調(diào),此時(shí)i+1,j-1不再滿足條件ij指針應(yīng)用舉例-指向數(shù)組的指針變量#include stdio.h#define NUM 8void invert(int *,int);void priout(int *,int);main()int aNU

22、M=10,20,30,40,50,60,70,80;printf(nOutput primary data: );priout(a,NUM);invert(a,NUM);printf(nOutput the inverse data: );priout(a,NUM);指針應(yīng)用舉例-指向數(shù)組的指針變量void priout(int s,int n)int i;for(i=0;in;i+)printf(%4d,si);printf(n);void invert(int *a,int n)int i,j,temp;for(i=0,j=n-1;ij;i+,j-)temp=*(a+i);*(a+i)=*

23、(a+j);*(a+j)=temp;指針應(yīng)用舉例-指向數(shù)組的指針變量例:例:w數(shù)組中存放了數(shù)組中存放了n個(gè)數(shù)據(jù),編寫函數(shù)刪除下標(biāo)為個(gè)數(shù)據(jù),編寫函數(shù)刪除下標(biāo)為k的元素的值。的元素的值。指針應(yīng)用舉例-指向數(shù)組的指針變量2122232425262728293010011003100510071009a0a1a2a3a4a5a6a7a8a9k262728293021222324262728293030*10011003100510071009a0a1a2a3a4a5a6a7a8a9指針應(yīng)用舉例-指向數(shù)組的指針變量getindex:用于輸入所刪除元素的下標(biāo),函數(shù)中對(duì)輸入的下標(biāo)進(jìn)行檢查,若越界,則要求重新

24、輸入,直到正確為止。arrout:用于輸出數(shù)組中的元素arrdel:進(jìn)行所要求的刪除操作指針應(yīng)用舉例-指向數(shù)組的指針變量#include stdio.h#define NUM 10int arrdel(int *,int,int);void arrout(int *,int);int getindex(int n);指針應(yīng)用舉例-指向數(shù)組的指針變量main()int n,d,aNUM=21,22,23,24,25,26,27,28,29,30;n=NUM;printf(Output primary data: n);arrout(a,n);d=getindex(n);n=arrdel(a,n,

25、d);printf(nOutput the data after delete:n);arrout(a,n);指針應(yīng)用舉例-指向數(shù)組的指針變量getindex(int n)int p;doprintf(nEnter the index 0=p%d:,n);scanf(%d,&p);while(pn-1);return p;void arrout(int w,int m)int k;for(k=0;km;k+)printf(%5d,wk);printf(n);指針應(yīng)用舉例-指向數(shù)組的指針變量int arrdel(int *a,int n,int k)int i;for(i=k;in-1;

26、i+)ai=ai+1;n-;return n;指針應(yīng)用舉例-指針指向字符串例:編寫函數(shù)例:編寫函數(shù)strlength(*s),函數(shù)返回指針,函數(shù)返回指針s所所指字符串的長度。指字符串的長度。相當(dāng)于庫函數(shù)相當(dāng)于庫函數(shù)strlen的功能。的功能。指針應(yīng)用舉例-指針指向字符串#include stdio.h#include string.hint strlength(char *s)int n=0;while(*(s+n)!=0)n+;return n;main()char str=ABCDEF;int len1,len2;len1=strlength();len2=strlength(str);p

27、rintf(len1=%d,len2=%d,len1,len2);指針應(yīng)用舉例-指針指向字符串例:編寫程序從若干字符串中找出最小的串進(jìn)行輸出。例:編寫程序從若干字符串中找出最小的串進(jìn)行輸出。#include stdio.h#include string.h#define N 20#define M 81指針應(yīng)用舉例-指針指向字符串int getstr(char pM)char tM;/*開辟一個(gè)臨時(shí)的字符串存儲(chǔ)空間開辟一個(gè)臨時(shí)的字符串存儲(chǔ)空間*/int n=0;printf(Enter string. a empty string to end.n);gets(t);while(strcmp(

28、t,)strcpy(pn,t);n+; gets(t);return n;指針應(yīng)用舉例-指針指向字符串char *findmin(char (*a)M,int n)char *q;int i;q=a0;/*用用q指向字符串?dāng)?shù)組中最小串的地址指向字符串?dāng)?shù)組中最小串的地址*/for(i=0;i0)q=ai;return q;指針應(yīng)用舉例-指針指向字符串main()char sNM,*sp;int n;n=getstr(s);sp=findmin(s,n);puts(sp);指針應(yīng)用舉例-函數(shù)指針指向函數(shù)的指針變量的定義#include “stdio.h”double fun(int a,int *

29、p)main()double (*fp)(int ,int *),y;int n;fp=fun;y=(*fp)(56,&n)說明:(1)函數(shù)名代表該函數(shù)的入口地址(2)(*fp)(int,int *)說明fp是一個(gè)指向函數(shù)的指針,這個(gè)函數(shù)的基類型是double(3)fp=fun把fun函數(shù)的地址賦給指針變量fp(4)y=(*fp)(56,&n)實(shí)現(xiàn)對(duì)該函數(shù)的調(diào)用。等于于 y=fun(56,&n)指針應(yīng)用舉例-函數(shù)指針例:函數(shù)名或指向函數(shù)的例:函數(shù)名或指向函數(shù)的指針作為實(shí)參指針作為實(shí)參#include #include double tran(double (*)(dou

30、ble),double (*)(double),double);double tran(double (*f1)(double),double (*f2)(double),double x)return (*f1)(x)/(*f2)(x);指針應(yīng)用舉例-函數(shù)指針main()double y,v;v=60*3.1416/180.0; /*v=600*/y=tran(sin,cos,v);printf(“tan(60)=%10.6fn”,y);y=tran(cos,sin,v);printf(“cos(60)=%10.6fn”,y);指針應(yīng)用舉例-動(dòng)態(tài)存儲(chǔ)分配例:short int *pi;flo

31、at *pf;pi=(short *)malloc(2);pf=(float *)malloc(4);說明:(1)因?yàn)閙alloc是void型的,所以需要強(qiáng)制轉(zhuǎn)換類型(2)強(qiáng)制轉(zhuǎn)換類型括號(hào)中的不可少,否則就變成了普通類型。if(pi!=NULL) *p=6;if(pf!=NULL) *pf=3.863.8pipf指針應(yīng)用舉例-動(dòng)態(tài)存儲(chǔ)分配注意:由動(dòng)態(tài)存儲(chǔ)分配得到的存儲(chǔ)單元沒有名字,只能靠指針來引用它。一旦指針改變指向,則原存儲(chǔ)單元及所存數(shù)據(jù)都將無法引用。通過調(diào)用malloc函數(shù)所分配的單元?jiǎng)討B(tài)存儲(chǔ)單元中沒有確定的初值。在動(dòng)態(tài)申請(qǐng)存儲(chǔ)空間時(shí),若不能確定數(shù)據(jù)類型所占字節(jié)數(shù),可通過sizeof運(yùn)算符

32、來求得。指針應(yīng)用舉例-動(dòng)態(tài)存儲(chǔ)分配例: pi=(int *)malloc(sizeof(int); pf=(float *)malloc(sizeof(float);由系統(tǒng)來計(jì)算指定類型所占的字節(jié)數(shù),有利于程序的移植。指針應(yīng)用舉例-鏈表單鏈表struct slistint data;struct slist *next;typedef struct slist SLIST;/0head指針應(yīng)用舉例-鏈表(1)建立帶有頭結(jié)點(diǎn)的單向鏈表步驟:讀取數(shù)據(jù)生成新結(jié)點(diǎn)將數(shù)據(jù)存入結(jié)點(diǎn)的成員變量中將新結(jié)點(diǎn)插入到鏈表中。(重復(fù)操作直到輸入結(jié)束)。指針應(yīng)用舉例-鏈表例:編寫函數(shù)creat_slist,建立如上圖所

33、求的單向鏈表。結(jié)點(diǎn)數(shù)據(jù)域的內(nèi)容從鍵盤輸入,以-1作為輸入結(jié)束標(biāo)志。鏈表頭結(jié)點(diǎn)的地址由函數(shù)值返回。h:頭指針,存放頭結(jié)點(diǎn)的地址r:指向鏈表當(dāng)前的尾結(jié)點(diǎn)s:指向新生成的結(jié)點(diǎn)每當(dāng)s把新開辟的結(jié)點(diǎn)鏈接到鏈表尾后,r便移向這一新的表尾結(jié)點(diǎn)。#include stdio.h#include stdlib.hstruct nodeint data;struct node *next;typedef struct node SLIST;main()SLIST *head;.head=return creat_slist(); /*調(diào)用鏈表建立函數(shù),得到頭結(jié)點(diǎn)地址調(diào)用鏈表建立函數(shù),得到頭結(jié)點(diǎn)地址*/SLIST *creat_slist()SLIST *h,*s,*r;int c;h=(SLIST*)malloc(sizeof(SLIST);/*生成頭結(jié)點(diǎn)生成頭結(jié)點(diǎn)*/r=h;scanf(%d,&c);while(c!=-1)s=(SLIST *)malloc(sizeof(SLIST); /*生成新結(jié)點(diǎn)生成新結(jié)點(diǎn)*/r-data =c;r-next =s;r=s; /*使使r指向當(dāng)前表尾指向當(dāng)前表尾*/scanf(%d,&c);r-next =0; /*置鏈表結(jié)束標(biāo)志置鏈表結(jié)束標(biāo)志*/return h;0headh-next=0指針應(yīng)用舉例-鏈表(1)順序訪問鏈表

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論