程式設計題——虛數求和(簡單結構體的應用)
阿新 • • 發佈:2018-12-03
結構體知識回顧
結構基礎知識
C的聚合資料型別(aggregate data type) 能夠同時儲存超過一個的單獨資料.
C提供了兩種型別的聚合資料型別,陣列和結構.
- 陣列是相同型別的元素的集合,它的每個元素是通過下標引用或指標間接訪問來選擇的.
- 結構也是一些值的集合,值成為它的成員(member),結構屬於標量型別可以作為傳遞給函式的引數,它們也可以作為返回值從函式返回,相同型別的結構變數之間可以賦值,可以宣告指向結構的指標,取一個結構變數的地址,也可以宣告結構陣列.
一些結構體的使用誤區
struct
{
int a;
char b;
float c;
}
struct
{
int a;
char b;
float c;
}y[20], *z;
z = &x;//此語句是非法的使用
這兩個宣告被編譯器當做兩種不同的型別,即是它們的成員列表完全相同.因此,變數y和z的型別和x的型別不同, z = &x語句是非法的
兩種不同函式引數定義的函式
定義結構體,仿照int求和函式
#include <stdio.h> //定義複數結構體,型別重新命名為complex typedef struct { int real; int imaginary; }complex; /* ** 類比整型的求和函式 ** int sum(int a, int b); ** 函式返回值是結構體,函式引數也是結構體型別 */ complex Sum_Complex(complex a, complex b) { complex temp; temp.real = a.real + b.real; temp.imaginary = a.imaginary + b.imaginary; return temp; //返回結構體 } int main() { complex a1, a2, sum; printf("Please input the first number's real part and imaginary part:\n"); scanf("%d %d", &a1.real, &a1.imaginary); printf("Please input the second number's real part and imaginary part:\n"); scanf("%d %d", &a2.real, &a2.imaginary); sum = Sum_Complex(a1, a2); //結構體變數訪問成員方式 printf("Sum is %d + %di\n", sum.real, sum.imaginary); }
這個函式雖然能夠產生正確地結果,但是效率很低.
C語言的引數傳值呼叫方式要求把引數的一份拷貝傳遞給函式,要想把它作為引數進行傳遞,必須在堆疊中進行復制,結束後再丟棄,利用效率非常低.
利用結構體 指標重新編寫
#include <stdio.h> #include <stdlib.h> //定義複數結構體,型別重新命名為complex typedef struct { int real; int imaginary; }complex; //返回值:complex的結構體指標 //函式引數也是結構體指標 complex *Add(complex *x, complex *y) { //malloc返回值是一個指標,不能申(complex)malloc(sizeof(complex)) complex *result = (complex *)malloc(sizeof(complex)); result->real = x->real + y->real; result->imaginary = x->imaginary + y->imaginary; return result; //返回結構體 } //亮點:將列印寫成函式 void Print_Struct(complex * ps) { printf("%d + %di", ps->real, ps->imaginary); } int main() { //結構體成員賦值可以用括號 complex a1 = {1, 2}; complex a2 = {3, 4}; //定義結構體指標 complex *result = Add(&a1, &a2);//&a1, &a2指標 Print_Struct(result); return 0; }
利用指標進行傳遞顯然好的多
- 它並不需要把整個結構作為引數傳遞給函式,也不需要把整個結構作為返回值返回
- 呼叫程式無需知道結構的內容,所以提高了程式的模組化程度.
- PS:函式傳遞指標的缺陷在於函式可以對呼叫程式的結構變數進行修改.可以在函式中使用const關鍵字來防止這類修改