结构体

一 结构体 

结构体的定义

 struct student //定义结构提名 

 char name[10]; //成员列表(包括成员类型,和成员名) 

int age ;

 int num;

 float score; 

} ; //特别注意 不要漏掉次“; ”号。

 二 定义结构体变量

 方法一; 

struct student {

 char name[10];

 int age ; 

int num; 

float score;

 }student1,student2;//直接在结构体定义的结尾定义结构体变量 student1,student2. 

方法二 

struct student { 

char name[10];

 int age ;

 int num; 

float score;

} ;

 Int main() {

 struct student student1,student2;//在主函数中定义结构体变量

三 成员也可以是一个结构体(也称结构体嵌套) 

Struct date { 

Int year;

 Int month;

 Int day;

 }; 

struct student { 

char name[10];

int age ; 

int num; 

float score; 

Struct date birthday; //birthday 是一个(struct date)结构类型。

 }student1,student2;

 四 结构体变量的引用

 方法一

 结构题变量名.结构体成员名 * 不要忽略两个之间的小点* 例如:student1.num=10000; *其中的点是分量运算符* 他是所有运算符中优先级最高 的 

例如:student1.birthday.month=6; *这是对结构体嵌套成员引用的方法*

 注意 结构体变量可以像变量一样进行种运算。 也可以通过 scanf 对结构体变量赋值 例如:scanf("%d",student1.num); 

也可以是:scanf("%d%d%f",student.num,student.age,student1.birthday.year); 

五,结构体变量的初始化 

方法一:

 直接在结构体定义的过程中直接赋值 例如:

 Struct student {

 int num;

 Float score;

 Char name[10];

 }student1={10101,78.6,"malong"},student2={10110,88.6,"helu"}; 

Printf("num=%d \nscore=%f\n;name=%s\n",student1.num,student1.score,student1.name); 

方法二:

 在主函数中进行初始化;

 #include<stdio.h>

 #include<string.h>

 struct stu {

 int num;

 char name[10]; 

char sex;

 };

 int main()

 { 

struct stu stu_1,stu_2; //z 

stu_1.num=1,strcpy(stu_1.name,"malong"),stu_1.sex='m'; 

stu_2.num=2,strcpy(stu_2.name,"haohaibo"),stu_2.sex='w';

 printf("num=%d name=%s sex=%c\n",stu_1.num,stu_1.name,stu_1.sex);

return 0;

 } 

总结:在对结构体变量中字符数组成员初始化中,如果采用第二种方法 切记不能指直接 stu_2.name="malong"; 

而是利用字符串函数进行初始化 如上例所示 结构体数组 所谓结构体数组,就是 在定义结构体变量时定义的是一个结构体数组变量;

 格式 struct 结构体名 数组名【大小】 ; 下来举例说明

 #include<stdio.h>

struct date {

 int year;

 int month;

 int day;

 }; 

struct stu { int num; char name[10];

 float score; 

struct date birthday; //birthday 是一个 struct date 类型的结构体变量

 }stu[3]={{1,"malong",78.6,1998,06,01}, // 定义一个结构体变量数组,并对其初始化 

{2,"haohaibo",88.8,1990,6,3}, {3,"helu",88.9,1990,5,2}};

 int main() { 

int i;

 for(i=0;i<3;i++) 

printf("%d %s %4.2f %d %d %d\n",stu[i].num,stu[i].name,stu[i].score,stu[i].birthday.year,stu [i].birthday.month,stu[i].birthday.day); // 对结构体数组成员数组尽享输出,切记这里的 stu[i].num 不能写成 stu.num 原因是,前者是结构体变量,后者是结构里变量的地址// 

} }

 再举一例 加深理解 要求 对候选人得票统计程序。设 3 个候选人,每次输入一个候选人的名字,对应的票数加 1,最后输出每位候选人即其的票数 程序如下: #include<stdio.h> 

#include<string.h>

struct person { char name[20];

 int count;

 }

leader[3]={{"malong",0},{"haohaibo",0},{"helu",0}};

 int main() 

char name[20];

 int i,j,num; 

for(i=0;i<5;i++) {

 scanf("%s",name);

 for(j=0;j<3;j++) {

 if(strcmp(name,leader[j].name)==0) leader[j].count++; 

}

 for(i=0;i<3;i++)

 printf("%s %d\n",leader[i].name,leader[i].count); return 0; }

指向结构体类型数据的指针

1.指向结构体变量的指针

 指向结构体变量的指针 根据名字自己理解 就是 定义一个结构类型的指针,然后这个指针指向结构体变量 结构体指针的定义方法为:

 Struct 结构体名 *指针变量名; 例如:struct stenden *p;// 这就定义了一个指向结构体 student 的结构体指针

 举例说明: 再次声明 计算机程序中能采用指针则采用指针,因为运算速度快,所以要好好学习指针

 原因很简单:指针是对内存地址的操作,不采用指针的话 则每次要先取地址,再取值

 #include<stdio.h>

 struct stu {

 int num;

 float score; 

};

 int main() {

 struct stu stu_1; 

stu_1.num=1,stu_1.score=99.8;

struct stu *p;

 p=&stu_1; //切记不要忘了指针指向结构比变量的首地址

 printf("%d %4.2f\n",p->num,p->score); //引用

 return 0;

 } 

总计这里的 p->num 等价于 (*p).num 和 stu_1.num;都是结构体变量成员的引用方式

 2.指向结构体变量数组的指针。 

指向结构体变量数组的指针。 指向结构体变量数组的指针 通过名字理解:就是指定义了一个结构体变量数组,然后定义了一个结构体指针变量;

结构 体变量指针指向结构体数组。就这么简单 关键是记住定义方法 后 OK 了。

 #include<stdio.h> 

struct stu {

 int num;

 char name[10];

 float score;

 }

student[3]={{1,"malong",88.9},{2,"haohaibo",99.8},{3,"helu",88.7}}; 量数组,并对其初始化

//定义了一个结构体变

int main()

 { struct stu *p; //定义了一个结构体指针 指针指向为结构体 stu 的首地址 

p=student; // 结构体指针指向结构体变量数组的首地址

 int i;

 for(i=0;i<3;i++) 

{ printf("%d %s %4.2f\n",p->num,p->name,p->score);

 p++; 

}

 } 

关于结构体这部分的综合练习:

 #include<stdio.h>

 #include<string.h> 

struct date { int year; int month; int day; };

 struct stu {

int num; 

char name[10];

 char sex; 

struct date birthday;

 }; 

int main()

 { struct stu student[3]; 

struct stu *p;

 int i; 

p=student;

 p->num=1,strcpy(p->name,"malong"),p->sex='m';

p->birthday.year=1996,p->birthday.month =6,p->birthday.day=5; 

(p+1)->num=2,strcpy((p+1)->name,"liuxiao"),(p+1)->sex='w',(p+1)->birthday.year=1992,(p +1)->birthday.month=4,(p+1)->birthday.day=6; (p+2)->num=3,strcpy((p+2)->name,"haohaibo"),(p+2)->sex='m',(p+2)->birthday.year=1990,( p+2)->birthday.month=3,(p+2)->birthday.day=18; for(i=0;i<3;i++) printf("%-3d %-8s %c %-4d %-2d %-2d\n",(p+i)->num,(p+i)->name,(p +i)->sex,(p+i)->birthday.year,(p+i)->birthday.month,(p+i)->birthday.day); return 0; }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值