c語言基礎知識(十三) 結構體
來自專欄程序員的寫作
結構體(structre)
用戶自己建立數據類型
學會類比
1.什麼是結構體
Int a=10; Int arr[10]={1,2,3,4,5};
存儲班上同學的信息:
Char add[60];Int id[60];Double score[60]
2.結構體類型的聲明
Int a;Int arr[10];
關鍵字 struct
struct Person ---- 類比成 int
//結構體類型的名字(Person)首字母要大寫
{
屬性(成員)
Int id; Char sex; Char name[10];
};//結構體類型
struct Person{ int id; char name[10]; int age; char sex; char addr[20];};//結構體類型的聲明 struct Person 相當於 int
Int a;
結構體類型 int
結構體變數 a
//關於時間的結構體類型struct Date{ int year; int month; int day;};//關於人信息的結構體類型struct Person{ int id; char name[10]; int age; char sex; char addr[20]; struct Date birthday;};struct Person zhangsan;
struct Date 其中Date叫做結構體的名字
3.成員可以屬於另一個結構體類型。(嵌套)
struct Date birthday;//書寫格式
birthday裡面有成員month,year ,day
struct Date{int month;int day;};struct Student{char name[10];int num;struct Date birthday;};
4.先聲明結構體類型,再定義該類型的變數
聲明結構體類型
格式:struct 結構體的名字(person)
{
成員列表(屬性)
Int id;
};
定義結構體的變數
Struct 結構體名字 變數名字
5.位元組的計算
6.定義結構體變數
結構體類型和結構體變數區別
結構體變數的書寫:
struct Person{ int id; char name[10]; int age; char sex; char addr[20];} zhangsan,lisi;//在聲明結構體類型的時候,可以順便定義結構體變數
在聲明結構體類型的時候,可以順便定義結構體變數
struct Person{ int id; char name[10]; int age; char sex; char addr[20];};//聲明結構體類型struct Person zhangsan,lisi;//定義結構體的變數
先聲明結構體類型
後定義結構體的變數
7.結構體變數初始化
普通的初始化
#include<stdio.h>int main(){ struct Person { int id; char name[10]; int age; char sex; char addr[20]; }zhangsan={1001,"zhangsan",12,M,"101street"},lisi={1002,"lisi",13,M,"102street"}; //初始化 printf("%d
%s
%d
%c
%s
",zhangsan.id,zhangsan.name,zhangsan.age,zhangsan.sex,zhangsan.addr); return 0;}
聲明的時候,定義了,又初始化了
zhangsan={1001,"zhangsan",12,M,"101street"},lisi={1002,"lisi",13,M,"102street"};它是按照結構體類型成員裡面出現的順序一一對應賦值的
利用數組初始化
#include<stdio.h>int main(){ struct Person { int id; char name[10]; int age; char sex; char addr[20]; } student[2]={{1001,"zhangsan",12,M,"101street"},{1002,"lisi",13,M,"102street"}}; printf("%d
%s
%d
%c
%s
",student[0].id,student[0].name,student[0].age,student[0].sex,student[0].addr); return 0;}
注意:
§ 不能整體輸出輸入(結構體變數),只能一個一個成員的輸出輸入
§ 結構體變數可以相互賦值(同類)
§ 結構體變數中的成員可以進行運算
§ 利用scanf對變數成員初始化,但不能用&整體初始化
這是在控制台輸入的格式:1001 zhangsan 12m 1001street
#include<stdio.h>int main(){ struct Person { int id; char name[10]; int age; char sex; char addr[20]; }zhangsan,lisi; //scanf("%d%s%d%c%s",&lisi);不可以的 scanf("%d%s%d%c%s",&zhangsan.id,zhangsan.name,&zhangsan.age,&zhangsan.sex,zhangsan.addr); //數組的名字就是地址 //scanf("%s",zhangsan.addr); lisi = zhangsan;//變數之間的賦值 變數>成員 lisi.age = zhangsan.age;//成員之間的賦值 zhangsan.age = zhangsan.age+100; printf("%d %s %d %c %s ",zhangsan.id,zhangsan.name,zhangsan.age,zhangsan.sex,zhangsan.addr); //printf("%d%s%d%c%s",zhangsan); return 0;}
8.結構體指針
Struct Person *pt;
//Int *p;
P=&zhangsan;
(*p).age;
(*p)表示p指向的結構體變數(zhangsan),(*p).age表示指向的結構體變數的成員
§ printf("%d %s %d %c %s
",(*p).id,(*p).name,(*p).age,(*p).sex,(*p).addr);
§ printf("%d %s %d %c %s
",p->id,p->name,p->age,p->sex,p->addr);
這兩種是等價的,只是書寫格式不一樣而已
l printf("%d %s %d %c %s
",zhangsan.id,zhangsan.name,zhangsan.age,zhangsan.sex,zhang)這種是最原始的
(普通的結構體指針)
#include<stdio.h>int main(){ struct Person { int id; char name[10]; int age; char sex; char addr[20]; }zhangsan,lisi; struct Person *p;//定義了一個指向結構體類型的指針 scanf("%d%s%d%c%s",&zhangsan.id,zhangsan.name,&zhangsan.age,&zhangsan.sex,zhangsan.addr); p=&zhangsan; printf("%d %s %d %c %s
",zhangsan.id,zhangsan.name,zhangsan.age,zhangsan.sex,zhangsan.addr); printf("%d %s %d %c %s
",(*p).id,(*p).name,(*p).age,(*p).sex,(*p).addr); //(*p)表示p指向的結構體變數,(*p).age表示指向的結構體變數的成員 printf("%d %s %d %c %s
",p->id,p->name,p->age,p->sex,p->addr); return 0;}
(數組,指針,結構體)
#include<stdio.h>int main(){ struct Person { int id; char name[10]; int age; char sex; char addr[20]; } student[2]={{1001,"zhangsan",12,M,"101street"},{1002,"lisi",13,M,"102street"}}; struct Person *p; p=student; for(;p<student+2;p++) { //printf("%d
%s
%d
%c
%s
",student[0].id,student[0].name,student[0].age,student[0].sex,student[0].addr); printf("%d %s %d %c %s
",(*p).id,(*p).name,(*p).age,(*p).sex,(*p).addr); printf("%d %s %d %c %s
",p->id,p->name,p->age,p->sex,p->addr); } return 0;}
{
struct Person
{
int id;
char name[10];
int age;
char sex;
char addr[20];
} student[2]={{1001,"zhangsan",12,M,"101street"},{1002,"lisi",13,M,"102street"}};
struct Person *p;
p=student;
for(;p<student+2;p++)
{
//printf("%d
%s
%d
%c
%s
",student[0].id,student[0].name,student[0].age,student[0].sex,student[0].addr);
printf("%d %s %d %c %s
",(*p).id,(*p).name,(*p).age,(*p).sex,(*p).addr);
printf("%d %s %d %c %s
",p->id,p->name,p->age,p->sex,p->addr);
}
return 0;
}
結構體指針和函數
struct Person{ int id; char name[10]; int age; char sex; char addr[20];} student[2];#include<stdio.h>int main(){ void input(struct Person stu[]); struct Person *p; int i; p=student; input(p); for(i=0;i<2;i++) { printf("%d %s %d %c %s
",student[i].id,student[i].name,student[i].age,student[i].sex,student[i].addr); } return 0;}void input(struct Person stu[]) { int i; for(i=0;i<2;i++) { scanf("%d%s%d%c%s",&stu[i].id,stu[i].name,&stu[i].age,&stu[i].sex,stu[i].addr); } }
推薦閱讀:
※萬年曆三款(代碼)
※閃字代碼
※Tensorflow小練習(四):快速風格遷移(fast-style-transfer)
※字典查詢工具【代碼】
※圖片製作的方法及代碼