如何使用指針編寫C程序-2?

善於利用指針

指針是C的一大特色。

正確而靈活的運用它,可以使程序簡潔、靈活、高效。

每一個學習和使用C語言的人都應當深入的學習和掌握指針。

如何使用指針編寫C程序-2

工具/原料

計算機一臺

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]。然後在主函數輸出全部成績。

如何使用指針編寫C程序-2

例2:有a個學生,每個學生有b門課程,找出其中不及格的課程的學生及其學生號。

編程思路:在上例的程序中進行修改。main函數不是隻調用一次search函數,而是調用3次search函數,在search函數中檢查3個學生有無不及格的課程,如果有,就返回該學生的0號課程的地址&score[i][0]。在main函數中檢查返回值,輸出有不及格學生4門課的成績。

如何使用指針編寫C程序-2

指針數組和多重指針

什麼是指針數組

指針數組中的每一個元素均為指針型數據即地址;

定義指針數組的一般形式:

類型名 *數組名[數組長度];

如int *p[4];顯然是數組形式,表示p數組中有四個元素。然後再與前面的*結合,表示此數組是指針類型的。

什麼情況下用到指針數組

一般指針數組比較用來指向若干個字符串,使字符串處理更加靈活。

例:將若干字符串按字母順序由大到小輸出

編程思路:定義一個指針數組name,用各字符串對它進行初始化,即把各字符串中第一個字符的地址賦給指針數組的各元素。然後用選擇法排序,但不是移動字符串,而是改變指針數組的各元素的指向。

如何使用指針編寫C程序-2

指向指針數據的指針

指向指針數據的指針變量簡稱指向指針的指針。name是一個指針數組,它的每一個元素都是指針型的變量,其值為地址。name代表該指針數組首元素的地址。

name+i就是name[i]的地址。可以設置一個指針變量p,指向指針數組的元素。

P就是指向指針型數據的指針變量。

定義一個指向指針數據的指針變量:

char **p;p指向指針數據的指針。

如何使用指針編寫C程序-2

指針數組作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程序-2

動態內存分配與指向它的指針變量

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的指針變量,它不指向任何類型的數據。指向空類型或不指向確定的類型。

在它的值賦給另一個指針變量時由系統對它進行類型轉換,使之適合被賦值的變量的類型。

如何使用指針編寫C程序-2

注意事項

返回指針值的函數,是一個函數,這個函數返回的值是地址

指針數組的數組元素是指針型數據即地址

指向指針型數據的指針,又叫做二重指針

指針數組能做main函數的形參,意義特殊

基類型為void的指針變量,不指向任何類型的數據。指向空類型或不指向確定的類型。

相關問題答案