C語言中的結構體------>C語言的實體
C語言中的結構體——>C語言的實體
1.結構體概念
2. 結構體宣告
3. 結構體定義
5. 結構體變數成員的引用
6. 結構體變數的賦值
7. 結構體變數的初始化
8. 結構體的巢狀
結構體的概念:
C語言中引入了一種構造出句型別成為結構體,他是由若干個成員構成,成員本身可以是基本資料型別,也可以是其他構造型別,他相當與高階語言中的記錄,類似與java高階語言中的實體類。可以表示一些複雜的資料型別;類似:
struct student{ char *name; int age; int num; float weight; };
結構體的宣告:
結構體在使用之前,需要先宣告結構體
宣告的語法:
struct 結構體名稱
{
型別說明符號 成員名;//成員列表
};
成員表有若干個成員組成,每個成員都是該結構體的一部分,對每個成員必須做出型別說明,成員可以是基本資料型別,也可以是構造資料型別;
注意:
- {}後面是要有分號”;”的
- 結構體的宣告可以在原始檔程式的開頭部分中,也可以宣告在標頭檔案中,一般在實際的開發過程中,都是定義在標頭檔案中的;
- 結構體的名字與其成員是可以重名的,結構體成員和其他變數也可以重名,
- 結構體型別的名稱必須是”struct 結構體名”,注意struct關鍵字是不能被省略的;
- 結構體需要先宣告在去使用
- 結構體使用必須要 定義對應的結構體變數
- 結構體型別相當與一個模型,宣告的時候是不分配記憶體的,只有定義相應的結構體變數的時候,才會分配實際的記憶體
結構體變數的定義:
語法1:預先已宣告結構體
struct 結構體名 變數1,變數2,...變數n;
語法2:宣告結構體的時候同時定義結構體變數
struct 結構體名{
成員列表;
} 變數名1,變數名2...變數n;
語法3:直接定義結構體變數
struct {
成員列表;
}變數名1,...,變數名n;
注意:結構體變數的定義儘量不要在標頭檔案中,宣告結構體的時候放在標頭檔案中,結構體和結構體變數就類似與java中的類和物件之間的關係。
結構體變數成員的引用
C語言中不允許對結構體變數整體進行輸入和輸出的,對結構體變數的操作都是對結構體變數成員進行操作的。是個體關係,不能整體操作
引用方式:
結構體變數.成員名
機構體變數成員通過"."來引用
如果成員本身就是屬於一個結構體型別的話,那麼此時就繼續用若干個點運算子號,一級一級的找,直到找到自己操作的那個
class.student.name = "zhangsan";
我們可以引用結構體變數成員的地址,也可以引用結構體變數的地址
結構體變數的賦值
初始化方法1:
結構體變數的賦值,就是對結構體變數的各個成員進行賦值
如:student.xh = 100;
student.name = "hello";
可以用輸入語句來進行賦值:
scanf("%s %f",&student.sex,&student.score);
允許具有相同型別的結構體變數進行相互賦值:
student1 = student2;
注意:結構體中成員變數如果是字元陣列的話,不能進行賦值,但是可以使用strcpy進行拷貝,如果是字元指標的話,可以直接進行賦值,所以在操作過程中我們儘量使用字元指標來進行操作;
注意:陣列名本來就是地址,所以在賦值的時候,不需要加&符號:
char gender[30];
如:scanf("%s",gender);
沒有進行賦值初始化的時候,由於結構體變數是區域性變數,因此儲存在棧中,其初始的值是隨機數值;其佔用的位元組數等於它成員變數佔用的總的位元組數,成員越多,其佔用的位元組數也就越多
初始化方法2:
預先已宣告結構體再定義結構體變數並初始化:
struct 結構體名 變數名1 = {成員值類表},...,
變數名n = {成員值列表};
初始化方法3:
宣告結構體的同時定義結構體變數並且初始化:
struct 結構體名{
成員變數;
}變數名1 = {成員數值列表},變數名2 = {成員數值列表},...,變數名n ={成員值列表};
初始化方式4:
直接定義結構體變數並且初始化
strcut {
成員列表;
}變數名1={成員值列表},...,變數名n={成員值列表};
結構體的巢狀
可以將一個結構體放入另外一個結構體內,但是結構體不能巢狀它自身,如果巢狀自身的話,就必須是結構體指標型別
struct address{
char country[20];
char city[20];
}
struct student{
int xh;
char name[20];
struct address addr;
};
要訪問結構體address中的成員,而address是另外一個結構體student的成員,可以通過點運算子的鏈式方式訪問
如:訪問成員country: stu.addr.country
訪問city:stu.addr.city;
下面通過程式碼來完整的展示下結構體的玩法:
#ifndef __TEACHER_H_
#define __TEACHER_H_
/*定義一個街道結構體,成員變數為國家,城市,和街道*/
struct address{
char *country;
char *city;
char *street;
};
/*定義一個teacher結構體,成員變數為編號,年齡,姓名,工齡,地址*/
struct teacher{
int num;
int age;
char *name;
int teach_year;
struct address addr;
};
#endif
原始檔程式碼
#include<stdio.h>
#include<stdlib.h>
#include"teacher.h"
#include<string.h>
struct score{
int math_score;
int chinese_score;
int english_score;
};
/*定義一個學生型別*/
struct student{
int xh;//
char *name;
int class;
struct address addr;
struct score all_score;
}zzf ={1,"zzf",3,{"china","shanghai","yindu_road"},{80,85,90}};//宣告的時候直接去定義一個學生zzf,並且初始化。
//打印出學生的資訊
void printfStudentInfo(struct student stu);
void printfTeacherInfo(struct teacher tea);
int main(int argc,char *argv[]){
printfStudentInfo(zzf);
printf("==========================\n");
//定義的時候初始化
struct teacher teacher_zhang = {1,50,"zhang",5,{"china","minhang","yizhong"}};
printfTeacherInfo(teacher_zhang);
printf("===============================\n");
//先定義後初始化
struct teacher teacher_wang;
teacher_wang.num = 2;
teacher_wang.age = 40;
teacher_wang.name = "wang";
teacher_wang.teach_year = 10;
teacher_wang.addr.country = "china";
teacher_wang.addr.city = "shanghai";
teacher_wang.addr.street ="chunshen_road";
printfTeacherInfo(teacher_wang);
printf("=============相同結構體名變數jiegouti賦值======\n");
struct teacher teacher_other;
teacher_other = teacher_wang;
printfTeacherInfo(teacher_wang);
printf("==============================");
//不去定義結構體名,然後直接定義結構體變數
struct{
char book_name[20];
int pages;
int charpter_nums;
}math_book;
//如果使用字元陣列的話,就必須使用strcpy才能賦值
strcpy(math_book.book_name,"jihe");
math_book.pages = 150;
math_book.charpter_nums = 12;
printf("book name:%s,book pages:;%d,book charpter_nums:%d\n",math_book.book_name,math_book.pages,math_book.charpter_nums);
return 0;
}
void printfStudentInfo(struct student stu){
printf("stu xh:%d\n",stu.xh);
printf("stu name:%s\n",stu.name);
printf("stu class:%d\n",stu.class);
printf("student country:%s,city:%s,street:%s\n",stu.addr.country,stu.addr.city,stu.addr.street);
printf("student math:%d,chinese:%d,english:%d\n",stu.all_score.math_score,stu.all_score.chinese_score,stu.all_score.english_score);
}
void printfTeacherInfo(struct teacher tea){
printf("teacher num:%d\n",tea.num);
printf("teacher age:%d\n",tea.age);
printf("teacher name:%s\n",tea.name);
printf("teacher teacher_year:%d\n",tea.teach_year);
printf("teacher country:%s,city:%s,street:%s\n",tea.addr.country,tea.addr.city,tea.addr.street);
}
程式碼是可以直接進行run的,謝謝大家觀看。本人是一個新C的Coder,持續更新中,有什麼疑問或者錯誤的地方,請看官們及時指出,謝謝大家