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
廣告