
- 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語言 - 主函式
- 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語言 - 函式指標
- 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程式設計中,struct是一種派生資料型別。就像我們可以傳遞基本資料型別的引數一樣,也可以將struct資料型別的變數傳遞給函式。您還可以使用值傳遞和引用傳遞方法傳遞結構體。C語言中的函式也可以返回struct資料型別。
閱讀本章以瞭解以下概念:
- 如何傳遞struct型別的元素
- 如何傳遞struct變數
- 如何從函式返回struct
- 如何返回struct指標
讓我們從第一個開始,學習如何傳遞struct型別的元素。
如何傳遞結構體元素
派生型別是由一個或多個任何基本型別的元素以及其他派生型別組合而成的。可以按值或按引用將元素傳遞給函式。
示例
在下面的示例中,我們有一個名為“rectangle”的派生型別,它包含兩個元素。我們有一個struct變數“r”,其元素為“r.len”和“l.brd”,它們被傳遞給一個函式。然後,area()函式計算矩形的面積。
#include <stdio.h> struct rectangle{ float len, brd; }; int area(float, float); int main(){ struct rectangle r; r.len = 10.50; r.brd = 20.5; area(r.len, r.brd); return 0; } int area(float a, float b){ double area = (double)(a*b); printf("Length: %f \nBreadth: %f \nArea: %lf\n", a, b, area); return 0; }
輸出
執行此程式碼時,將產生以下輸出:
Length: 10.500000 Breadth: 20.500000 Area: 215.250000
如何傳遞結構體變數
讓我們修改上面的示例,將struct變數本身(而不是其元素)傳遞給area()函式。“rectangle”結構體型別還有一個名為“area”的附加元素。
示例
在函式內部,透過點運算子(.)訪問struct變數的元素,並計算面積。
#include <stdio.h> struct rectangle{ float len, brd; double area; }; int area(struct rectangle); int main(){ struct rectangle r; r.len = 10.50; r.brd = 20.5; area(r); return 0; } int area(struct rectangle r){ r.area = (double)(r.len*r.brd); printf("Length: %f \nBreadth: %f \nArea: %lf\n", r.len, r.brd, r.area); return 0; }
輸出
執行程式碼並檢查其輸出:
Length: 10.500000 Breadth: 20.500000 Area: 215.250000
如何從函式返回結構體
我們知道C語言中的函式可以返回任何型別的返回值。在這個例子中,area()函式被定義為返回一個struct變數。
示例
在main()函式內部,長度和寬度的輸入被傳遞給area()函式。在area()函式內部,計算面積並填充struct變數,然後將其返回給main()函式,在main()函式中顯示其元素。
#include <stdio.h> struct rectangle { float len, brd; double area; }; struct rectangle area(float x, float y); int main(){ struct rectangle r; float x, y; x = 10.5; y = 20.5; r = area(x, y); printf("Length: %f \n Breadth: %f \n Area: %lf\n", r.len, r.brd, r.area); return 0; } struct rectangle area(float x, float y){ double area = (double)(x*y); struct rectangle r = {x, y, area}; return r; }
輸出
執行此程式碼時,將產生以下輸出:
Length: 10.500000 Breadth: 20.500000 Area: 215.250000
如何按引用傳遞結構體
在C語言中,可以定義函式使其引數按值或按引用傳遞。引用是指向現有變數的指標。
示例
在這個例子中,在main()中聲明瞭一個“rectangle”型別的struct變數,並將它的地址傳遞給一個名為area()的使用者定義函式。
呼叫area()函式時,它可以使用間接運算子(→)使用變數的元素。它計算結果並將其賦值給area元素“r → area”。
#include <stdio.h> struct rectangle{ float len, brd; double area; }; int area(struct rectangle *); int main(){ struct rectangle r; r.len = 10.50; r.brd = 20.5; area(&r); return 0; } int area(struct rectangle *r){ r -> area = (double)(r -> len * r -> brd); printf("Length: %f \nBreadth: %f \nArea: %lf\n", r -> len, r -> brd, r -> area); return 0; }
輸出
執行程式碼並檢查其輸出:
Length: 10.500000 Breadth: 20.500000 Area: 215.250000
如何返回結構體指標
讓我們重寫上面的程式碼來定義area()函式並返回指向rectangle資料型別struct的指標。
示例
area()函式有兩個按值傳遞的引數。main()函式從使用者讀取長度和寬度並將它們傳遞給area()函式,area()函式填充一個struct變數並將它的引用返回給main()函式。
#include <stdio.h> struct rectangle { float len, brd; double area; }; struct rectangle * area(float x, float y); int main (){ struct rectangle *r; float x, y; x = 10.5; y = 20.5; r = area(x, y); printf("Length: %f \n Breadth: %f \n Area: %lf\n", r->len, r->brd, r->area); return 0; } struct rectangle * area(float x, float y){ double area = (double)(x*y); static struct rectangle r; r.len = x; r.brd = y; r.area = area; return &r; }
輸出
執行此程式碼時,將產生以下輸出:
Length: 10.500000 Breadth: 20.500000 Area: 215.250000