2.calloc函數
其函數原型為:
void*calloc(unsignedn,unsignedsize);
該函數用來按數據對象的個數申請分配內存。參數n、size為unsignedint型,n表示數據對象的個數,size是每個數據對象需要的存儲空間字節數。如果申請成功,函數返回一個void型指針,否則返回NULL指針。
為了給指定類型的數據進行動態分配,常用sizeof函數確定該類型數據所占字節數。為了判定申請是否成功,通常要驗證該函數的返回值是不是空指針(NULL或0)。
3.realloc函數
其函數原型為:
void*realloc(void*p,unsignedsize);
該函數用來對以p為起始地址的動態內存實施重新分配。其中,p表示已獲得的動態內存的起始地址,size為unsignedint型,表示要求重新分配的空間字節數。如果申請成功,函數返回一個void型指針p,否則返回NULL指針。重新分配區可以大於或小於原來的動態區。
4.free函數
其函數原型為:
voidfree(void*p);
該函數釋放以p為起始地址的動態內存區,函數沒有返回值。
[例1024]利用動態內存分配存放n個整數的一維數組,並求各個元素的和。
#include
voidmain() { intsum,i,n,*p; printf("Enterthedimensionofarray:"); scanf("%d",&n); if((p=(int*)calloc(n,sizeof(int)))==NULL) { printf("cantallocatememory.\n"); exit(1); } printf("Enter%dvaluesofarray:\n",n); for(i=0;i scanf("%d",p+i); sum=0; for(i=0;i sum+=*(p+i); printf("sum=%d\n",sum); free(p); } 程序說明: (1)首先定義一個指針變量p,用來存放動態分配內存單元的首地址。 (2)用calloc函數來分配n*sizeof(int)大小的內存空間,並將calloc函數的返回值通過強製類型轉換後存放在指針變量p中。 (3)然後通過指針變量p來操作動態存儲空間。 (4)用完後釋放內存空間。 動態內存分配得到的是一個沒有名字隻有起始地址的連續存儲空間,相當於一個無名的一維數組。動態存儲分配的步驟: (1)定義一個指針變量,用來保存存儲空間的起始地址。 (2)調用動態內存分配函數分配內存。 (3)將動態內存分配函數返回的指針賦給已定義的指針變量。 (4)當動態內存用完後,一定要釋放這一存儲空間,否則可能把堆中的內存耗光。 本章介紹了很多不同類型的指針變量的定義和使用方法。這些指針變量的定義形式很相近,很容易混淆。在此將指針變量的定義以一張表格的形式展現給讀者,見表101,希望讀者能比較出它們的差別。 除了本章介紹的相關對象的指針外,後麵章節還會介紹結構體指針和文件指針的知識。讀者可以把這些知識放在一塊,作一個係統的歸納總結。 要學好指針,必須深刻理解和牢固掌握表102中的幾個基本概念和運算。 習題十 1.指針變量的值和類型分別是什麼? 2.指針變量與變量的指針的區別是什麼? 3.輸入三個整數,按由小到大的順序輸出。 4.輸入10個整數,將其中最小的數與第一個數對換,把最大的數與最後一個數對換。 5.將一個3×3的整型矩陣轉置。 6.求一個字符串的子串,如在字符串“Thisisagoodboy!”中取出子串“good”。 7.寫一個無返回值的函數,使變量自增1。 8.寫一個函數,輸入一行文字,找出其中大寫字母、小寫字母、空格、數字及其他字符各有多少。 9.寫一個函數,求一個字符串的子串。 10.編寫三個函數,它們分別將以秒為單位的總時間轉換成小時、分鍾、秒;然後在一個函數中通過指向函數指針參數來調用這些函數。 11.一個班有4個學生,都學了5門課程。編寫一指針函數求每個學生的平均分。 12.用指針數組對五個字符串進行排序,並將排序後的結果按順序輸出。 13.用malloc函數開辟動態存儲單元,然後輸入10個整數,最後按從小到大的順序進行排序。