
- C語言教程
- C語言 - 首頁
- C語言基礎
- C語言 - 概述
- C語言 - 特性
- C語言 - 歷史
- C語言 - 環境設定
- C語言 - 程式結構
- C語言 - Hello World
- C語言 - 編譯過程
- C語言 - 註釋
- C語言 - 詞法單元
- C語言 - 關鍵字
- C語言 - 識別符號
- C語言 - 使用者輸入
- C語言 - 基本語法
- C語言 - 資料型別
- C語言 - 變數
- C語言 - 整數提升
- C語言 - 型別轉換
- C語言 - 型別強制轉換
- C語言 - 布林值
- C語言中的常量和字面量
- C語言 - 常量
- C語言 - 字面量
- C語言 - 轉義序列
- C語言 - 格式說明符
- C語言中的運算子
- C語言 - 運算子
- C語言 - 算術運算子
- C語言 - 關係運算符
- C語言 - 邏輯運算子
- C語言 - 位運算子
- C語言 - 賦值運算子
- C語言 - 一元運算子
- C語言 - 自增和自減運算子
- C語言 - 三元運算子
- C語言 - sizeof 運算子
- C語言 - 運算子優先順序
- C語言 - 其他運算子
- C語言中的決策控制
- C語言 - 決策控制
- C語言 - if 語句
- C語言 - if...else 語句
- C語言 - 巢狀 if 語句
- C語言 - switch 語句
- C語言 - 巢狀 switch 語句
- C語言中的迴圈
- C語言 - 迴圈
- C語言 - while 迴圈
- C語言 - for 迴圈
- C語言 - do...while 迴圈
- C語言 - 巢狀迴圈
- C語言 - 無限迴圈
- C語言 - break 語句
- C語言 - continue 語句
- C語言 - goto 語句
- C語言中的函式
- C語言 - 函式
- C語言 - main 函式
- C語言 - 按值呼叫函式
- C語言 - 按引用呼叫函式
- C語言 - 巢狀函式
- C語言 - 可變引數函式
- C語言 - 使用者自定義函式
- C語言 - 回撥函式
- C語言 - return 語句
- C語言 - 遞迴
- C語言中的作用域規則
- C語言 - 作用域規則
- C語言 - 靜態變數
- C語言 - 全域性變數
- C語言中的陣列
- C語言 - 陣列
- C語言 - 陣列的特性
- C語言 - 多維陣列
- C語言 - 將陣列傳遞給函式
- C語言 - 函式返回陣列
- C語言 - 可變長陣列
- C語言中的指標
- C語言 - 指標
- C語言 - 指標和陣列
- C語言 - 指標的應用
- C語言 - 指標運算
- C語言 - 指標陣列
- C語言 - 指標到指標
- C語言 - 將指標傳遞給函式
- C語言 - 函式返回指標
- C語言 - 函式指標
- C語言 - 指向陣列的指標
- C語言 - 指向結構體的指標
- C語言 - 指標鏈
- C語言 - 指標與陣列
- C語言 - 字元指標和函式
- C語言 - 空指標
- C語言 - void 指標
- C語言 - 野指標
- C語言 - 解引用指標
- C語言 - 近指標、遠指標和巨型指標
- C語言 - 指標陣列的初始化
- C語言 - 指標與多維陣列
- C語言中的字串
- C語言 - 字串
- C語言 - 字串陣列
- C語言 - 特殊字元
- C語言結構體和聯合體
- C語言 - 結構體
- C語言 - 結構體和函式
- C語言 - 結構體陣列
- C語言 - 自引用結構體
- C語言 - 查詢表
- C語言 - 點 (.) 運算子
- C語言 - 列舉 (或 enum)
- C語言 - 結構體填充和打包
- C語言 - 巢狀結構體
- C語言 - 匿名結構體和聯合體
- C語言 - 聯合體
- C語言 - 位域
- C語言 - typedef
- C語言中的檔案處理
- C語言 - 輸入和輸出
- C語言 - 檔案 I/O (檔案處理)
- C語言預處理器
- C語言 - 預處理器
- C語言 - 預處理指令
- C語言 - 預處理器運算子
- C語言 - 宏
- C語言 - 標頭檔案
- C語言中的記憶體管理
- C語言 - 記憶體管理
- C語言 - 記憶體地址
- C語言 - 儲存類
- 其他主題
- C語言 - 錯誤處理
- C語言 - 可變引數
- C語言 - 命令執行
- C語言 - 數學函式
- C語言 - static 關鍵字
- C語言 - 隨機數生成
- C語言 - 命令列引數
- C語言程式設計資源
- C語言 - 問答
- C語言 - 快速指南
- C語言 - 速查表
- C語言 - 有用資源
- C語言 - 討論
C語言中函式返回陣列
C語言中的函式有助於程式設計師採用模組化程式設計。函式可以定義為接受一個或多個引數,它能夠返回單個值到呼叫環境。但是,函式可以定義為返回一個值的陣列。在C語言中,可以透過以下方法之一使函式返回陣列:
- 將陣列作為引數傳遞並返回指標
- 在函式中宣告一個靜態陣列並返回其指標
- 使用malloc() 函式
將陣列嵌入到結構體變數中並將其傳遞給函式
我們使用這些方法來計算給定數字的平方、立方和平方根。
按引用傳遞陣列
在下面的示例中,我們在main()中聲明瞭一個未初始化的陣列,並將其與一個整數一起傳遞給函式。在函式內部,陣列被填充了平方、立方和平方根。該函式返回此陣列的指標,使用該指標,可以在 main() 函式中訪問和列印這些值。
示例
#include <stdio.h> #include <math.h> int arrfunction(int, float *); int main(){ int x=100; float arr[3]; arrfunction(x, arr); printf("Square of %d: %f\n", x, arr[0]); printf("cube of %d: %f\n", x, arr[1]); printf("Square root of %d: %f\n", x, arr[2]); return 0; } int arrfunction(int x, float *arr){ arr[0]=pow(x,2); arr[1]=pow(x, 3); arr[2]=pow(x, 0.5); }
輸出
Square of 100: 10000.000000 cube of 100: 1000000.000000 Square root of 100: 10.000000
返回靜態陣列
而不是從 main() 傳遞一個空陣列,我們可以在被呼叫函式本身內部宣告一個數組,用所需的值填充它,並返回其指標。但是,返回區域性變數的指標是不可接受的,因為它指向一個不再存在的變數。請注意,區域性變數在其函式的作用域結束時將不復存在。因此,我們需要在被呼叫函式 (arrfunction) 內部使用靜態陣列,並將它的指標返回給 main()。
示例
#include <stdio.h> #include <math.h> float * arrfunction(int); int main(){ int x=100, i; float *arr = arrfunction(x); printf("Square of %d: %f\n", x, *arr); printf("cube of %d: %f\n", x, arr[1]); printf("Square root of %d: %f\n", x, arr[2]); return 0; } float *arrfunction(int x){ static float arr[3]; arr[0]=pow(x,2); arr[1]=pow(x, 3); arr[2]=pow(x, 0.5); return arr; }
輸出
Square of 100: 10000.000000 cube of 100: 1000000.000000 Square root of 100: 10.000000
現在,考慮以下函式,它將生成 10 個隨機數並使用陣列返回它們,並按如下方式呼叫此函式:
示例
#include <stdio.h> #include <time.h> #include <stdlib.h> /* function to generate and return random numbers */ int * getRandom( ) { static int r[10]; int i; /* set the seed */ srand( (unsigned)time( NULL ) ); for ( i = 0; i < 10; ++i) { r[i] = rand(); printf( "r[%d] = %d\n", i, r[i]); } return r; } /* main function to call above defined function */ int main () { /* a pointer to an int */ int *p; int i; p = getRandom(); for ( i = 0; i < 10; i++ ) { printf( "*(p + %d) : %d\n", i, *(p + i)); } return 0; }
當以上程式碼編譯並執行時,會產生以下結果:
輸出
r[0] = 2110147662 r[1] = 1427553496 r[2] = 1243625529 r[3] = 857484361 r[4] = 513293736 r[5] = 964923407 r[6] = 36104419 r[7] = 1248464892 r[8] = 1838450240 r[9] = 2096489563 *(p + 0) : 2110147662 *(p + 1) : 1427553496 *(p + 2) : 1243625529 *(p + 3) : 857484361 *(p + 4) : 513293736 *(p + 5) : 964923407 *(p + 6) : 36104419 *(p + 7) : 1248464892 *(p + 8) : 1838450240 *(p + 9) : 2096489563
使用 malloc() 函式
malloc() 函式作為庫函式在stdlib.h 標頭檔案中可用。它在程式執行時動態分配一塊記憶體。變數的正常宣告會導致記憶體在編譯時分配。
void *malloc(size_t size);
malloc() 函式返回一個泛型 void 指標。要在分配的記憶體中分配某種資料型別的值,必須將其強制轉換為所需的型別。例如,要儲存 int 資料,必須將其強制轉換為 int *,如下所示:
int *x = (int *)malloc(sizeof(int);
讓我們分配一塊足以儲存三個 float 值的記憶體,這三個 float 值對應於一個數字的平方、立方和平方根,並將 float 指標返回給 main(),在 main() 中顯示計算出的值。
示例
#include <stdio.h> #include <math.h> #include <stdlib.h> float * arrfunction(int); int main(){ int x=16, i; float *arr = arrfunction(x); printf("Square of %d: %f\n", x, arr[0]); printf("cube of %d: %f\n", x, arr[1]); printf("Square root of %d: %f\n", x, arr[2]); return 0; } float *arrfunction(int x){ float *arr = (float *)malloc(3*sizeof(float)); arr[0]=pow(x,2); arr[1]=pow(x, 3); arr[2]=pow(x, 0.5); return arr; }
輸出
Square of 16: 256.000000 cube of 16: 4096.000000 Square root of 16: 4.000000
在結構體中使用陣列元素
在這種方法中,我們將宣告一個結構體,其中包含一個 float 陣列作為其元素。被呼叫函式 (myfunction) 宣告一個結構體變數,用接收到的引數的平方、立方和平方根填充陣列元素,並將其返回給 main() 函式。
示例
#include <stdio.h> #include <math.h> struct mystruct{ float arr[3]; }; struct mystruct myfunction(int x); int main(){ int x = 9; struct mystruct s = myfunction(x); printf("Square of %d: %f\n", x, s.arr[0]); printf("cube of %d: %f\n", x, s.arr[1]); printf("Square root of %d: %f\n", x, s.arr[2]); return 0; } struct mystruct myfunction(int x){ struct mystruct s1; s1.arr[0]=pow(x,2); s1.arr[1]=pow(x,3); s1.arr[2]=pow(x, 0.5); return s1; }
輸出
Square of 9: 81.000000 cube of 9: 729.000000 Square root of 9: 3.000000
從函式返回字串
使用相同的方法,您可以將字串傳遞給函式並從函式返回字串。C語言中的字串是 char 型別的陣列。在下面的示例中,我們使用指標傳遞字串,在函式內部操作它,然後將其返回給 main()。
在被呼叫函式內部,有一個區域性字串。在返回之前,傳遞的字串與區域性字串連線。
示例
#include <stdio.h> #include <string.h> #include <stdlib.h> char * hellomsg(char *); int main(){ char * name = "TutorialsPoint"; char *arr = hellomsg(name); printf("%s\n", arr); return 0; } char * hellomsg(char *x){ char *arr = (char *)malloc(50*sizeof(char)); strcpy(arr, "Hello "); strcat(arr, x); return arr; }
輸出
Hello TutorialsPoint