標籤:

c語言基礎知識(十三) 結構體

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)
字典查詢工具【代碼】
圖片製作的方法及代碼

TAG:編程 | 代碼 | CC |