善於利用指針
指針是C的一大特色。
正確而靈活的運用它,可以使程序簡潔、靈活、高效。
每一個學習和使用C語言的人都應當深入的學習和掌握指針。
工具/原料
計算機一臺
Visual C++ 6.0編程環境
方法/步驟
返回指針值的函數
一個函數可以返回一個整型值、字符值、實型值等,也可以返回指針型的數據,即地址。
定義返回指針值的函數的一般形式:
類型名 *函數名(參數列表);
如“int *a(int x,int y);”a是函數名,調用它以後能得到int *型的指針,即整型數據的地址,x,y是形參。
例1:有a個學生,每個學生有b門課程,要求在用戶輸入學號後,能輸出該學生的全部成績。用指針函數實現。
編程思路:定義一個二維數組score,用來存放學生成績(假設a=3,b=4),定義一個查詢學生成績的函數search,它是一個返回指針的函數,形參是指向一維數組的指針變量和整型變量n,從主函數將數組名score和要找的學生號k傳遞給形參。函數的返回值是&score[k][0]。然後在主函數輸出全部成績。
例2:有a個學生,每個學生有b門課程,找出其中不及格的課程的學生及其學生號。
編程思路:在上例的程序中進行修改。main函數不是隻調用一次search函數,而是調用3次search函數,在search函數中檢查3個學生有無不及格的課程,如果有,就返回該學生的0號課程的地址&score[i][0]。在main函數中檢查返回值,輸出有不及格學生4門課的成績。
指針數組和多重指針
什麼是指針數組
指針數組中的每一個元素均為指針型數據即地址;
定義指針數組的一般形式:
類型名 *數組名[數組長度];
如int *p[4];顯然是數組形式,表示p數組中有四個元素。然後再與前面的*結合,表示此數組是指針類型的。
什麼情況下用到指針數組
一般指針數組比較用來指向若干個字符串,使字符串處理更加靈活。
例:將若干字符串按字母順序由大到小輸出
編程思路:定義一個指針數組name,用各字符串對它進行初始化,即把各字符串中第一個字符的地址賦給指針數組的各元素。然後用選擇法排序,但不是移動字符串,而是改變指針數組的各元素的指向。
指向指針數據的指針
指向指針數據的指針變量簡稱指向指針的指針。name是一個指針數組,它的每一個元素都是指針型的變量,其值為地址。name代表該指針數組首元素的地址。
name+i就是name[i]的地址。可以設置一個指針變量p,指向指針數組的元素。
P就是指向指針型數據的指針變量。
定義一個指向指針數據的指針變量:
char **p;p指向指針數據的指針。
指針數組作main函數的形參
指針數組的一個重要應用就是作main函數的形參。
通常main函數的第一行是int main()或int main(void)
括號中是空或有“void”,表示main函數沒有參數,調用main函數時不必給出實參。
在某些情況下,main函數可以有參數,
int main(int argc,char *argv[])
其中argc和argv就是main函數的形參,他們是程序的”命令行參數”;
什麼情況下main函數需要參數?main函數的形參是從哪裡傳遞過來的?
形參的值是不可能在main函數中的。Main函數是操作系統調用的,實參只能由操作系統給出。實參和執行文件的命令是一起給出的。
命令行的一般形式:
命令名 參數1 參數2 ……參數 n
命令名是可執行文件名;
選擇“工程”“設置”“調試”“程序變量”輸入實參;
動態內存分配與指向它的指針變量
C語言中允許建立內存動態分配區域,存放一些臨時用的數據,這些數據可以隨時開闢,隨時釋放。存放的特別的自由存儲區成為堆(heap)區,這些數據不能用變量名或數組名引用,只能通過指針來引用。
怎樣建立內存的動態分配
對內存的動態分配是通過系統的提供的庫函數來實現的。
主要有:malloc,calloc,free,realloc.
頭文件“#stdio.h
void *malloc(unsigned int size);
其作用是在內存動態存儲區中分配一個長度為size的連續空間。
void *calloc(unsigned n, unsigned size);
其作用是在內存動態存儲區中分配n個長度為size的連續空間,這個空間一般比較大,足以保存一個數組。
void free(void *p);
其作用是釋放指針變量P所指向的動態空間。
void *realloc(void *p, unsigned int size);
如果已經通過malloc,colloc獲得動態空間,想改變其大小,可以用realloc函數重新分配。
函數返回值都是void*類型的。
void指針類型
可以定義一個基類型為void的指針變量,它不指向任何類型的數據。指向空類型或不指向確定的類型。
在它的值賦給另一個指針變量時由系統對它進行類型轉換,使之適合被賦值的變量的類型。
注意事項
返回指針值的函數,是一個函數,這個函數返回的值是地址
指針數組的數組元素是指針型數據即地址
指向指針型數據的指針,又叫做二重指針
指針數組能做main函數的形參,意義特殊
基類型為void的指針變量,不指向任何類型的數據。指向空類型或不指向確定的類型。