worker2.wage=worker.wage; sum=worker1.wage+worker2.wage; worker1.age++
前面已經介紹了有關的數據類型和一些基本的指針變量及其相關的應用,為了求解較為復雜的問題,C語言提供了一種自定義的數據類型的機制,用這種機制可以定義出較復雜的數據類型。這些較復雜數據類型的元素或成員的數據仍然是基本數據類型。靈活地使用這些數據可以大大提高數據的處理效率。
在解決某些實際問題時,某一種相同的數據類型已經不能滿足要求,而必須要多種數據類型的同時運用。例如:你在統計你們班的大學一年級新生購買班服的尺寸時,你需要了解到每個人的身高,體重以及性別。這是一個現實問題,在定義這些變量時,你需要用到float,char等一些變量類型,顯然用一種數據類型是不夠的,C語言因此規定了一種構造數據類型————結構體。
結構體實際上是c編譯沒有提供的數據類型,可以由程序員根據實際情況來自己構造的一種新的數據類型。
結構體定義的一般格式為
struct 結構體名{ 數據類型 成員名 1; 數據類型 成員名2; …… 數據類型 成員名n; };
其中;struct是用來說明類型是結構體的關鍵字,結構體的定義描述了該結構體的組織形式。在程序執行時,結構體說明並不引起系統為該結構體分配空間。真正占用儲存空間的是具有相應結構類型的變量。
下面舉個例子
struct worker{ char name [20]; char sex; int age; float wage; char number [12]; char *p_addr; };
由上面的例子,我們可以看到結構體成員可以是任何基本數據類型的變量,也可以是數組,指針等等。
將上面的程序稍微改動一下。得到下面的程序;
struct worker{ char name [20]; char sex; int age; float wage; struct birthday{ int year; int month; int day; }; char *p_addr; };
以上圖,我們可以明顯的看到結構體變量類型中又有一個結構體變量類型,這就是結構體類型的嵌套,一定要注意程序中的花括號要成對。
struct worker{ char name[20]; char sex; int age; float wage ; struct birthday { int year ; int month; int day; }birthday1; char *p_addr; }worker1,worker2; worker1.sex; worker2.sex;
worker1.sex表示結構體變量worker1的成員sex,
對這個程序,我們要注意的幾點
1`如果成員本身又屬於一個結構體的話,這需要用到若干成員運算符,一級一級的找下去
例如;可以這樣訪問成員
worker1.sex;
worker2.birthday1.month;
2`對結構體變量的成員可以像普通變量一樣進行各種運算、例如
worker1.wage=worker2.wage; sum=worker1.wage+worker2.wage; worker1.age++;
3`可以引用結構體變量成員地址,也可以引用結構體變量的地址。
scanf(“%d”’,&worker1.age); 輸入worker1.age的值
printf("%o",&worker1): 輸入worker1的首地址
關於結構體與數組的內容,我們只舉一個例子
struct worker{ char name[20]; char sex; int age; float wage; struct birthday{ int year; int month; int day; }birthday1; char *p_addr: };
以上定義一個數組worker1,其元素為struct worker類型數據,數組有3個元素。
有關指向結構體數組的指針有人舉一個例子
#include <stdlib.h> #include <stdio.h> struct stud_type{ char name[20]; long num; int age; char sex; }; main() {stuct stud_type student[3],*p; int i; char numstr[20]; for (i=0;p=student;i<3;p++,i++) { printf ("Enter all date of student [%d]:\n,i); scanf ("%S%ld%c",p->age,&p->num,&p->sex): } for (i=0,p=student ;p<student+3;p++,I++) printf ("%3d%-20s%8ld%6d%3c\n",i,p->name,p->num,p->age,p->sex)}; };
這個題目實際上是要求輸入3個人學生的信息並打印出來。
這道題,很有看點,綜合性較強,用到了我們之前學到的知識,值得讀者深思。
在結構體與函數中,值得講的是返回結構體類型值的函數。
因為對於返回函數,我們經常見到,但對其了解的不夠多。 函數的返回值也可以是結構體類型,這時在函數定義是,需要說明返回值的類型為相對應的結構體類型。函數input()的功能是輸入一個結構體數據,並將輸入結構體數據作為返回值,返回給第i個學生記錄,實現第i個學生的數據輸入。
struct student input() { int; struct student stu: scanf("%id",&stu.num) get (stu.name) for (i=0;i<3;I++) scanf ("%f,&stu,score[i]): return stu: }