版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)
文檔簡介
1、C語言程序設(shè)計Soochow University1主要內(nèi)容地址和指針的概念變量的指針和指向變量的指針變量數(shù)組的指針和指向數(shù)組的指針變量字符串的指針和指向字符串的指針變量函數(shù)的指針和指向函數(shù)的指針變量返回指針值的函數(shù)指針數(shù)組和指向指針的指針有關(guān)指針的數(shù)據(jù)類型和指針運算的小結(jié)習(xí)題C語言程序設(shè)計Soochow University1主要內(nèi)C語言程序設(shè)計Soochow University28.1 指針是什么C語言程序設(shè)計Soochow University28.1C語言程序設(shè)計Soochow University3地址和指針的概念變量定義時的內(nèi)存分配如果在程序中定義了一個變量,在編譯時就給這個變量
2、分配內(nèi)存單元。系統(tǒng)根據(jù)程序中定義的變量類型,分配一定長度的空間。內(nèi)存單元的地址和內(nèi)存單元的內(nèi)容這兩個概念的區(qū)別內(nèi)存區(qū)的每一個字節(jié)有一個編號,這就是“地址”,它相當(dāng)于旅館中的房間號。在地址所標(biāo)志的內(nèi)存單元中存放數(shù)據(jù),這相當(dāng)于旅館中各個房間中居住旅客一樣。C語言程序設(shè)計Soochow University3地址和C語言程序設(shè)計Soochow University4地址和指針的概念變量的“直接訪問”方式通過變量名來訪問在程序中一般是通過變量名來對內(nèi)存單元進行存取操作的。其實程序經(jīng)過編譯以后己經(jīng)將變量名轉(zhuǎn)換為變量的地址,對變量值的存取都是通過地址進行的。變量的“間接訪問”方式保存變量地址的變量:i_p
3、ointer=&i;這時,i_pointer的值就是2000,即變量i所占用單元的起始地址。變量的“間接訪問”過程:先找到存放“i的地址”的變量,即i_pointer,從中取出i的地址(2000),然后到2000、2001字節(jié)取出i的值(3)。C語言程序設(shè)計Soochow University4地址和C語言程序設(shè)計Soochow University5地址和指針的概念“直接訪問”和“間接訪問”方式下變量的存儲過程為了表示將數(shù)值3送到變量中,可以有兩種表達(dá)方法:(1) 將3送到變量i所標(biāo)志的單元中。(2) 將3送到變量i_pointer所“指向”的單元(即i所標(biāo)志的單元)中。見上圖。所謂“指向”
4、就是通過地址來體現(xiàn)的?!爸羔槨焙汀爸羔樧兞俊币粋€變量的地址稱為該變量的“指針”。如果有一個變量專門用來存放另一變量的地址(即指針),則它稱為“指針變量”。指針變量的值(即指針變量中存放的值)是指針(地址)。請區(qū)分“指針”和“指針變量”這兩個概念。C語言程序設(shè)計Soochow University5地址和C語言程序設(shè)計Soochow University68.2 指針變量C語言程序設(shè)計Soochow University68.2C語言程序設(shè)計Soochow University7定義一個指針變量指針變量也必須先定義后使用定義指針變量的一般形式:基類型 *指針變量名指針變量的基類型:用來指定該指針
5、變量可以指向的變量的類型。指針變量只能用來指向和其基類型相同類型的變量,如基類型為int的指針變量只能用來指向整型變量,絕對不能指向?qū)嵭妥兞?。int*pointer_1,*pointer_2, a;用賦值語句可使一個指針變量指向另一個變量C語言程序設(shè)計Soochow University7定義一C語言程序設(shè)計Soochow University8在定義指針變量時要注意兩點(1) 指針變量前面的“*”,表示該變量的類型為指針型變量。注意:指針變量名是pointer_1、pointer_2,而不是*pointer_1、*pointer_2。(2) 在定義指針變量時必須指定基類型。例如只有整型變量的
6、地址才能放到指向整型變量的指針變量中。C語言程序設(shè)計Soochow University8在定義C語言程序設(shè)計Soochow University9指針變量的引用指針變量中只能存放地址(指針),不要隨便將一個整型常量(或任何其他非地址類型的數(shù)據(jù))賦給一個指針變量。兩個有關(guān)的運算符(1) &: 取地址運算符。(2) *: 指針運算符(或稱“間接訪問”運算符)。例如:&a為變量a的地址,*p為指針變量p所指向的存儲單元。注意:指針使用前必須先初始化!pointer_1 = &i;注意:規(guī)則修改:指針必須先定義并且初始化后,才可以使用C語言程序設(shè)計Soochow University9指針變C語言程
7、序設(shè)計Soochow University10指針變量的引用程序舉例例:通過指針變量訪問整型變量。main( ) int a,B, *pointer_1, *pointer_2; /*這里出現(xiàn)*表示指針定義*/ a=100;B=10; /*把變量a的地址賦給pointer_1,不是*pointer_1=&a */ pointer_1=&a;/*把變量B的地址賦給pointer_2,不是*pointer_2=&a */ pointer_2=&B; printf(%d,%dn,a,B); /*這里出現(xiàn)的*表示對指針的使用*/ printf(“%d,%dn”,*pointer_1,*pointer_
8、2); /這里會出現(xiàn)什么結(jié)果? prinft(“%d,%dn”, pointer_1, pointer_2); 運行結(jié)果為:100,10100,10C語言程序設(shè)計Soochow University10指針C語言程序設(shè)計Soochow University11對“&”和“*”運算符的深入說明(1) 如果已執(zhí)行了“pointer_1=&a;”語句,若有&*pointer_1它的含義是什么?&*pointer_1相當(dāng)于&apointer_2 = &*pointer_1pointer_2 = pointer_1C語言程序設(shè)計Soochow University11對“C語言程序設(shè)計Soochow U
9、niversity12(2) *&a的含義是什么?與a等價; *&a和*pointer_1的作用是一樣的(假設(shè)已執(zhí)行了“pointer_1=&a”),它們等價于變量a。即*&a與a等價,見圖(3) (*pointer_1)+相當(dāng)于a+。注意括號是必要的,如果沒有括號,就成為了*pointer_1+,+和*為同一優(yōu)先級別,相當(dāng)于先做*pointer_1,然后做pointer_1+對“&”和“*”運算符的深入說明C語言程序設(shè)計Soochow University12(2C語言程序設(shè)計Soochow University13例: 輸入a和B兩個整數(shù),按先大后小的順序輸出a和B。main()int *
10、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=%Dnn,a,B); printf(max=%D,min=%Dn,*p1,*p2); 運行情況如下:5,9a=5,B=9max=9,min=5 當(dāng)輸入a=5,B=9時,由于aB,將p1和p2交換。交換前的情況見圖 (a),交換后見圖(b)。結(jié)論:在使用指針時,我們要清楚操作的是指針本身,還是指針?biāo)赶虻淖兞緾語言程序設(shè)計Soochow University13例:C語言程序設(shè)計Soochow Universit
11、y14函數(shù)的參數(shù)回顧形式參數(shù)和實際參數(shù)二者具有各自獨立的內(nèi)存空間C語言中函數(shù)參數(shù)傳值是單向的實際參數(shù) 形式參數(shù)例如:void swap(int n1,int n2) int temp; if (n1 n2) temp = n1; n1 = n2; n2 = temp;void main() int a,b; scanf(%d%d,&a,&b); printf(a=%d; b=%d,a,b); swap(a,b); printf(a=%d; b=%d,a,b);輸入: 9 5輸出: a=9; b=5輸出: a=9; b=5C語言程序設(shè)計Soochow University14函數(shù)C語言程序設(shè)計S
12、oochow University15函數(shù)的參數(shù)回顧函數(shù)的調(diào)用過程首先把a、b的值復(fù)制到swap函數(shù)的堆棧區(qū)間,并賦值給行參n1、n2.交換n1、n2的值。返回。95調(diào)用函數(shù)運行狀態(tài)返回地址9 / 55 / 99main()swap()abn1n2temp棧區(qū)結(jié)果被調(diào)函數(shù)進行的操作結(jié)果無法反應(yīng)在主調(diào)函數(shù)中。用傳地址的形式C語言程序設(shè)計Soochow University15函數(shù)C語言程序設(shè)計Soochow University16指針作為函數(shù)參數(shù)指針作為函數(shù)參數(shù)將一個變量的地址傳到另一個函數(shù)中。例如:void swapp(int *n1,int *n2) int temp; if (*n1 *
13、n2) temp = *n1; *n1 = *n2; *n2 = temp;void main() int a,b; scanf(%d%d,&a,&b); printf(a=%d; b=%d,a,b); swapp(&a,&b); printf(a=%d; b=%d,a,b);輸入: 9 5輸出: a=9; b=5輸出: a=5; b=9C語言程序設(shè)計Soochow University16指針C語言程序設(shè)計Soochow University17指針作為函數(shù)參數(shù)函數(shù)的調(diào)用過程首先把a、b的地址值復(fù)制到swapp函數(shù)的堆棧區(qū)間,并賦值給行參n1、n2.交換n1、n2所指向內(nèi)存單元的值。返回。結(jié)
14、果被調(diào)函數(shù)進行的操作結(jié)果反應(yīng)在主調(diào)函數(shù)中。被調(diào)函數(shù)實際上是在主調(diào)函數(shù)的堆棧區(qū)間中進行的操作實際是一種地址傳遞方式95調(diào)用函數(shù)運行狀態(tài)返回地址200820049main()swap()abn1n2temp棧區(qū)20042008C語言程序設(shè)計Soochow University17指針C語言程序設(shè)計Soochow University18指針作為函數(shù)參數(shù)指針變量作為函數(shù)參數(shù)典型錯誤舉例一swap(int *n1,int *n2) int*temp;*temp=*n1; *n1=*n2; *n2=*temp;問題:temp沒有初始化,指向的內(nèi)存單元是不確定的對沒有初始化的指針賦值非常危險!/*此語句有
15、問題*/C語言程序設(shè)計Soochow University18指針C語言程序設(shè)計Soochow University19指針作為函數(shù)參數(shù)指針變量作為函數(shù)參數(shù)典型錯誤舉例二swap(int *n1,int *n2) int*p; p=n1;n1=n2;n2=p;95調(diào)用函數(shù)運行狀態(tài)返回地址2008 / 20042004 / 20082008main()swap()abn1n2 p棧區(qū)20042008問題交換的只是兩個形參所指向的內(nèi)存單元。C語言程序設(shè)計Soochow University19指針C語言程序設(shè)計Soochow University20指針變量作為函數(shù)參數(shù)C語言中實參變量和形參變量之
16、間的數(shù)據(jù)傳遞是單向的“值傳遞”方式。指針變量作函數(shù)參數(shù)也要遵循這一規(guī)則,這時的值是指針的值,也就是地址值。調(diào)用函數(shù)不可能改變實參指針變量的值,但可以改變實參指針變量所指變量的值。運用指針變量作參數(shù),可以從函數(shù)調(diào)用中得到多個變化了的值。如果不用指針變量是難以做到這一點的。參考下例:C語言程序設(shè)計Soochow University20指針C語言程序設(shè)計Soochow University21指針作函數(shù)參數(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);p
17、rintf(n%d,%d,%dn,a,B,C);swap(int *pt1, int *pt2) int temp; temp=*pt1; *pt1=*pt2; *pt2=temp;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);運行情況如下: 9,0,10 10,9,0C語言程序設(shè)計Soochow University21指針指針舉例編寫一個函數(shù),實現(xiàn)將大寫字母轉(zhuǎn)換從小寫字母,小寫字母轉(zhuǎn)換成大寫字母。在main函數(shù)中測試該函數(shù)的
18、正確性。C語言程序設(shè)計Soochow University22指針舉例編寫一個函數(shù),實現(xiàn)將大寫字母轉(zhuǎn)換從小寫字母,小寫字母C語言程序設(shè)計Soochow University238.3 通過指針引用數(shù)組C語言程序設(shè)計Soochow University238.C語言程序設(shè)計Soochow University24數(shù)組的指針和指向數(shù)組的指針變量數(shù)組的指針是指數(shù)組的起始地址數(shù)組元素的指針是數(shù)組元素的地址。指向數(shù)組元素的指針定義一個指向數(shù)組元素的指針變量的方法,與以前介紹的指向變量的指針變量相同。例如:int a10; int *p; p=&a0;C語言程序設(shè)計Soochow University24
19、數(shù)組C語言程序設(shè)計Soochow University25指向數(shù)組元素的指針C語言規(guī)定數(shù)組名代表數(shù)組的首地址,也就是第0號元素的地址。下面語句等價:p=&a0;p=a; 或者int *p = &a0;int *p = a;注意數(shù)組名a不代表整個數(shù)組,上述“p=a;”的作用是“把a數(shù)組的首地址賦給指針變量p”,而不是“把數(shù)組a各元素的值賦給p”。C語言程序設(shè)計Soochow University25指向C語言程序設(shè)計Soochow University26通過指針引用數(shù)組元素通過指針對數(shù)組元素賦值,如:*p=1;如果指針變量p已指向數(shù)組中的一個元素,則p+1指向同一數(shù)組中的下一個元素(而不是將p
20、值簡單地加1)。C語言程序設(shè)計Soochow University26通過C語言程序設(shè)計Soochow University27數(shù)組元素指針使用的進一步理解如果p的初值為&a0,則:(1) p+i和a+i就是ai的地址(2) *(p+i)或*(a+i)是p+i或a+i所指向的數(shù)組元素,即ai。例如,*(p+5)或*(a+5)就是a5。(3) 指向數(shù)組的指針變量也可以帶下標(biāo),如pi與*(p+i)等價數(shù)組元素引用的兩種方法:(1) 下標(biāo)法,如ai或pi形式,p是指向數(shù)組的指針變量,其初值p=a。(2) 指針法,如*(a+i)或*(p+i)。其中a是數(shù)組名,p是指向數(shù)組的指針變量,其初值p=a。C語
21、言程序設(shè)計Soochow University27數(shù)組C語言程序設(shè)計Soochow University28數(shù)組元素指針使用例子例: 輸出數(shù)組中的全部元素。假設(shè)有一個整型數(shù)組a,有10個元素。要輸出各元素的值有三種方法:(1) 下標(biāo)法。main( )int a10; inti; for(i=0;i10;i+) scanf(%d,&ai);printf(n);for(i=0;i10;i+) printf(“%d ”,ai);(2)數(shù)組名方法main( )int a10; inti; for(i=0;i10;i+) scanf(%d,&ai);printf(n);for(i=0;i10;i+) p
22、rintf(“%d ”, *(a+i);(3)指針方法main( )int a10; inti; int *p;for(i=0;i10;i+) scanf(“%d”,p+i);printf(n);for(p=a;p(a+10);p+) printf(%d ,*p);C語言程序設(shè)計Soochow University28數(shù)組C語言程序設(shè)計Soochow University29數(shù)組元素的指針變量使用過程中的注意事項(1) 指針變量可以實現(xiàn)使本身的值改變,數(shù)組名是否也可以?例如,上述第(3)種方法是用指針變量p來指向元素,用p+使p的值不斷改變,這是合法的。如果不用p而使a變化(例如,用a+)行不
23、行呢?答案是不行的,因為a是數(shù)組首地址,這個地址在編譯期就定下來了,在程序運行過程中始終會保持不變。程序中如果出現(xiàn)a+,編譯器在編譯的時候就會報錯。(2) 要注意指針變量的當(dāng)前值。(3) 注意數(shù)組下標(biāo)越界問題 (4) 注意指針變量的運算(見P236)C語言程序設(shè)計Soochow University29數(shù)組C語言程序設(shè)計Soochow University30例:通過指針變量輸出a數(shù)組的10個元素請檢查以下程序的正確性:main( ) int*p,i,a10; p=a; for(i=0;i10;i+)scanf(%d”, p+); printf(n); for(i=0;i10;i+,p+)pr
24、intf(“%d”, *p);p=a;數(shù)組元素的指針變量使用過程中的注意事項C語言程序設(shè)計Soochow University30例:C語言程序設(shè)計Soochow University31用數(shù)組名作函數(shù)參數(shù)數(shù)組名可以用作函數(shù)的形參和實參。如:main( ) f(int arr ,int n) int array10; f(array,10); 當(dāng)用數(shù)組名作參數(shù)時,如果形參數(shù)組中各元素的值發(fā)生變化,實參數(shù)組元素的值隨之變化。實參數(shù)組名代表該數(shù)組首地址,而形參是用來接收從實參傳遞過來的數(shù)組首地址的。因此,形參應(yīng)該是一個指針變量。實際上,C編譯都是將形參數(shù)組作為指針變量來處理的。f(int arr
25、, int n)實際上相當(dāng)于f(int *arr, int n)C語言程序設(shè)計Soochow University31用數(shù)C語言程序設(shè)計Soochow University32實參數(shù)組名和形參數(shù)組名的區(qū)別:實參數(shù)組名代表一個固定的地址,或者說是指針型常量,而形參數(shù)組并不是一個固定的地址值。如: f(int arr , int n)printf(%dn, *arr); /*輸出array0的值,*/arr=arr+3;printf(%dn, *arr); /*輸出array3的值,*/C語言程序設(shè)計Soochow University32實參C語言程序設(shè)計Soochow University33
26、用數(shù)組名作函數(shù)參數(shù)舉例例:設(shè)計一個函數(shù)將數(shù)組a中n個整數(shù)按相反順序存放,見下圖示意。解此題的算法為:將a0與an-1對換,再將a1與an-2對,直到將下圖中的a(n-1)/2與 an-int(n-1)/2)-1對換。程序: C語言程序設(shè)計Soochow University33用數(shù)C語言程序設(shè)計Soochow University34重要歸納歸納起來,如果有一個實參數(shù)組,想在函數(shù)中改變此數(shù)組的元素的值,實參與形參的表示形式有以下4種情況:(1) 形參和實參都用數(shù)組名,如:main( ) f(int x ,int n) int a10; f(a,10); 可以認(rèn)為有一形參數(shù)組,與實參數(shù)組共用一段
27、內(nèi)存單元。C語言程序設(shè)計Soochow University34重要C語言程序設(shè)計Soochow University35重要歸納(2) 實參用數(shù)組名,形參用指針變量。如:main( ) f(int *x,int n) int a10; f(a,10); 實參a為數(shù)組名,形參x為指向整型變量的指針變量,函數(shù)開始執(zhí)行時,x指向a0,即x=&a0。通過x值的改變,可以指向a數(shù)組的任一元素。C語言程序設(shè)計Soochow University35重要C語言程序設(shè)計Soochow University36重要歸納(3) 實參形參都用指針變量。例如:main( ) f(int *x,int n) int
28、a10, *p; p=a; f(p,10); 實參p和形參x都是指針變量。先使實參指針變量p指向數(shù)組a,p的值是&a0。然后將p的值傳給形參指針變量x,x的初始值也是&a0 。通過x值的改變可以使x指向數(shù)組a的任一元素。C語言程序設(shè)計Soochow University36重要C語言程序設(shè)計Soochow University37重要歸納(4) 實參為指針變量,形參為數(shù)組名。如:main() f(int x ,int n) int a10,*p; p=a; f(p,10); 實參p為指針變量,它使指針變量p指向a0,即p=a或p=&a0。形參為數(shù)組名x,從前面的介紹已知,實際上將x作為指針變量
29、處理,今將a0的地址傳給形參x,使指針變量x指向a0。也可以理解為形參數(shù)組x取得a數(shù)組的首地址,x數(shù)組和a數(shù)組共用同一段內(nèi)存單元。C語言程序設(shè)計Soochow University37重要C語言程序設(shè)計Soochow University388.4 通過指針引用字符串C語言程序設(shè)計Soochow University388.C語言程序設(shè)計Soochow University39字符串的指針和指向字符串的指針變量字符串的表示形式字符數(shù)組法:用字符數(shù)組存放一個字符串。例如:main( ) char string=IloveChina!; printf(%sn,string);C語言程序設(shè)計Sooc
30、how University39字符C語言程序設(shè)計Soochow University40字符串的指針和指向字符串的指針變量字符串的表示形式字符指針法 :用字符指針指向一個字符串??梢圆欢x字符數(shù)組,而定義一個字符指針。用字符指針指向字符串中的字符。例如:main( ) char*string=I love China!;printf(%sn,string);C語言對字符串常量是按字符數(shù)組處理的,在內(nèi)存開辟了一個字符數(shù)組用來存放字符串常量。程序在定義字符指針變量string時把字符串首地址(即存放字符串的字符數(shù)組的首地址)賦給string。C語言程序設(shè)計Soochow University40
31、字符C語言程序設(shè)計Soochow University41字符數(shù)組、字符串和字符指針的理解字符數(shù)組存放字符數(shù)據(jù)的數(shù)組,沒有字符串結(jié)束標(biāo)志在定義時可以整體初始化,但不能在非定義時進行整體初始化字符串存放于字符數(shù)組中,必須有字符串結(jié)束標(biāo)志字符串在內(nèi)存占有的字節(jié)數(shù)為長度1在定義時可以整體初始化,但不能在非定義時進行整體初始化字符指針可以指向字符數(shù)據(jù)的指針變量,可以指向字符數(shù)組,也可以指向字符串在定義時可以初始化,也可以在非定義時進行初始化必須先初始化,才可以使用字符串輸出的理解:格式控制符“%s”C語言程序設(shè)計Soochow University41字符C語言程序設(shè)計Soochow Universi
32、ty42字符串指針作函數(shù)參數(shù)使用字符指針變量和字符數(shù)組的比較(見P263)字符串指針作函數(shù)參數(shù)與指針變量作函數(shù)參數(shù)的語法規(guī)定完全相同。copy_string函數(shù)的幾種形式(見P261)目的:深刻體會指針給C程序帶來的好處簡化程序的編寫工作量,使得程序更簡潔。指針給C程序帶來的麻煩需要仔細(xì)控制指針的使用降低了程序的可讀性C語言程序設(shè)計Soochow University42字符字符指針應(yīng)用舉例例如:編寫一個函數(shù),實現(xiàn)字符串str1與字符串str2的比較。編寫一個函數(shù),實現(xiàn)字符串str1與str2的拼接編寫一個函數(shù),求字符串str1的長度C語言程序設(shè)計Soochow University43字符指
33、針應(yīng)用舉例例如:C語言程序設(shè)計Soochow Uni動態(tài)內(nèi)存分配與指向它的指針變量動態(tài)內(nèi)存分配與指向它的指針變量動態(tài)內(nèi)存分配什么是內(nèi)存的動態(tài)分配非靜態(tài)的局部變量是分配在內(nèi)存中的動態(tài)存儲區(qū)的,這個存儲區(qū)是一個稱為棧的區(qū)域C語言還允許建立內(nèi)存動態(tài)分配區(qū)域,以存放一些臨時用的數(shù)據(jù),這些數(shù)據(jù)需要時隨時開辟,不需要時隨時釋放。這些數(shù)據(jù)是臨時存放在一個特別的自由存儲區(qū),稱為堆區(qū)怎樣建立內(nèi)存的動態(tài)分配對內(nèi)存的動態(tài)分配是通過系統(tǒng)提供的庫函數(shù)來實現(xiàn)的,主要有malloc,calloc,free,realloc這4個函數(shù)以上4個函數(shù)的聲明在stdlib.h頭文件中,在用到這些函數(shù)時應(yīng)當(dāng)用“#include ”指令
34、把stdlib.h頭文件包含到程序文件中。動態(tài)內(nèi)存分配什么是內(nèi)存的動態(tài)分配怎樣建立內(nèi)存的動態(tài)分配malloc函數(shù)其函數(shù)原型為 void *malloc(unsigned int size); 其作用是在內(nèi)存的動態(tài)存儲區(qū)中分配一個長度為size的連續(xù)空間函數(shù)的值(也就是函數(shù)的返回值)是所分配區(qū)域的第一個字節(jié)的地址,或者說,此函數(shù)是一個指針型函數(shù),返回的指針指向該分配域的開頭位置怎樣建立內(nèi)存的動態(tài)分配malloc函數(shù) 怎樣建立內(nèi)存的動態(tài)分配 malloc(100);開辟100字節(jié)的臨時分配域,函數(shù)值為其第1個字節(jié)的地址 注意指針的基類型為void,即不指向任何類型的數(shù)據(jù),只提供一個地址如果此函數(shù)未
35、能成功地執(zhí)行(例如內(nèi)存空間不足),則返回空指針(NULL) 怎樣建立內(nèi)存的動態(tài)分配 malloc(100);怎樣建立內(nèi)存的動態(tài)分配2calloc函數(shù)其函數(shù)原型為 void *calloc(unsigned n, unsigned size); 其作用是在內(nèi)存的動態(tài)存儲區(qū)中分配n個長度為size的連續(xù)空間,這個空間一般比較大,足以保存一個數(shù)組。怎樣建立內(nèi)存的動態(tài)分配2calloc函數(shù)怎樣建立內(nèi)存的動態(tài)分配用calloc函數(shù)可以為一維數(shù)組開辟動態(tài)存儲空間,n為數(shù)組元素個數(shù),每個元素長度為size。這就是動態(tài)數(shù)組。函數(shù)返回指向所分配域的起始位置的指針;如果分配不成功,返回NULL。如: p=(int
36、 *)calloc(50,4);開辟504個字節(jié)的臨時分配域,把起始地址賦給指針變量p 等價于: p = (int*)malloc(50*4); 例如:分配包含20個元素的整型數(shù)組: p = (int*)calloc(20, sizeof(int); p = (int*)malloc(20*sizeof(int);怎樣建立內(nèi)存的動態(tài)分配用calloc函數(shù)可以為一維數(shù)組開辟動怎樣建立內(nèi)存的動態(tài)分配sizeof()運算符計算數(shù)據(jù)類型在內(nèi)存在占有的字節(jié)數(shù)例如:sizeof(char) : 1bytesizeof(int) : 2 or 4bytessizeof(double): 8bytes使用si
37、zeof運算符可以提高程序的移植性。在動態(tài)內(nèi)存分配中,要求大家使用該運算符計算數(shù)據(jù)類型在內(nèi)存占有的字節(jié)數(shù)。C語言程序設(shè)計Soochow University50怎樣建立內(nèi)存的動態(tài)分配sizeof()運算符C語言程序設(shè)計怎樣建立內(nèi)存的動態(tài)分配3free函數(shù)其函數(shù)原型為 void free(void *p); 其作用是釋放指針變量所指向的動態(tài)空間,使這部分空間能重新被其他變量使用。p應(yīng)是最近一次調(diào)用calloc或malloc函數(shù)時得到的函數(shù)返回值。free(p);釋放指針變量所指向的已分配的動態(tài)空間 free函數(shù)無返回值怎樣建立內(nèi)存的動態(tài)分配3free函數(shù)怎樣建立內(nèi)存的動態(tài)分配4. realloc
38、函數(shù)其函數(shù)原型為void *realloc(void *p,unsigned int size);如果已經(jīng)通過malloc函數(shù)或calloc函數(shù)獲得了動態(tài)空間,想改變其大小,可以用recalloc函數(shù)重新分配。用realloc函數(shù)將p所指向的動態(tài)空間的大小改變?yōu)閟ize。p的值不變。如果重分配不成功,返回NULL,如:realloc(p,50); 將p所指向的已分配的動態(tài)空間改為50字節(jié) 怎樣建立內(nèi)存的動態(tài)分配4. realloc函數(shù)void指針類型 例8.30 建立動態(tài)數(shù)組,輸入5個學(xué)生的成績,另外用一個函放數(shù)檢查其中有無低于60分的,輸出不合格的成績。解題思路:用malloc函數(shù)開辟一個動態(tài)自由區(qū)域,用來存5個學(xué)生的成績,會得到這個動態(tài)域第一個字節(jié)的地址,它的基類型是void型。用一個基類型為int的指針變量p來指向動態(tài)數(shù)組的各元素,并輸出它們的值。但必須先把malloc函數(shù)返回的void指針轉(zhuǎn)換為整型指針,然后賦給p1void指針類型 例8.30 建立動態(tài)數(shù)組,輸入5個學(xué)生的#include #include void check(int *); int main() int *p1,i; p1 = (int *)malloc(5*si
溫馨提示
- 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 老年慢病綜合征的評估
- 2024農(nóng)民承包土地合同書
- 專題 07課內(nèi)閱讀(所有課內(nèi)片段閱讀) -2022-2023學(xué)年五年級語文下冊期末專項復(fù)習(xí)(部編版)
- 2024簡易維修合同格式
- 2024常用房屋裝修合同范本
- 2024建筑工程專業(yè)分包合同
- 2024建筑工程承包施工合同書格式
- 2024工地運輸合同參考范文
- 計算機編程培訓(xùn)課程
- 關(guān)于實習(xí)生實習(xí)報告模板集錦7篇
- 老舊小區(qū)整體改造施工投標(biāo)方案(技術(shù)標(biāo))
- 新湘教版八年級上數(shù)學(xué)復(fù)習(xí)計劃
- GB/T 44200-2024建筑垃圾再生骨料生產(chǎn)成套裝備技術(shù)要求
- 幼兒園小班科學(xué)活動《小手摸一摸》課件
- 文言文閱讀訓(xùn)練:《通鑒紀(jì)事本末-劉邦起兵》(附答案解析與譯文)
- 食品輻照行業(yè)發(fā)展現(xiàn)狀及潛力分析研究報告
- 離婚協(xié)議中子女撫養(yǎng)權(quán)的確定
- 全媒體運營師職業(yè)技能競賽題庫及答案(1-250判斷題)
- 2024場地轉(zhuǎn)租協(xié)議
- 家長會課件:小學(xué)數(shù)學(xué)家長會課件
- 傳染病防治規(guī)劃實施細(xì)則
評論
0/150
提交評論