结构体总结

  1. 结构体

1.1结构体类型的定义

1.2结构体变量的定义和引用

1.3结构体变量的赋值

1.4结构体变量内存分配问题透析

1.5简化结构体类型名

1.6结构体数组

1.1结构体类型的定义

什么是结构类型?

把不同或相同类型数据项组织成一个整体这就是结构类型。

结构体类型的格式是什么?

代码示例:

struct Student_Info{

char no[9]; //学号

char name[20]; //姓名

char sex; //性别

unsigned int age; //年龄

unsigned int classno; //班级

float grade; //成绩

};//这里定义了一个结构类型 struct Student_Info,其中struct一个结构类型,Student_Info是结构名

结构体定义注意事项:

struct不能省略;最后以;结尾;结构体本身不占用内存,只有用它来定义变量时,系统才会为该变量分配内存。就像int不占内存,int a;中变量a占内存。

1.2结构体变量的定义和引用

如何进行结构体变量的定义?

有两种方法:间接定义法和直接定义法

间接定义法:先定义结构体类型,再定义结构体变量

代码示例:

struct Student_Info{

char no[9]; //学号

char name[20]; //姓名

char sex; //性别

unsigned int age; //年龄

unsigned int classno; //班级

float grade; //成绩

};

struct Student_Info student1;

注意事项:不能省略关键字,如Student_Info student1;

    不能没有结构名,如struct student1;

  先定义类型后定义变量

直接定义法:定义完类型后直接跟上变量名

代码示例:

struct Student_Info{

char no[9]; //学号

char name[20]; //姓名

char sex; //性别

unsigned int age; //年龄

unsigned int classno; //班级

float grade; //成绩

};student1;

如何进行结构体变量的引用?

结构体变量名.成员名

结构体指针->成员名 或 (*结构体指针).成员名

其中.和->是结构体成员引用运算符,->之间不能有空格。

代码示例:

struct Student_Info stu;

struct Student_Info * pstu;pstu=&stu; //指针 pstu指向 stu

strcpy(stu. name, "zhangMing"); //将"zhangMing"复制到 stu 的 name成员中

stu. grade=80; //对 stu 的成员 grade赋值为 80

pstu-> grade+=10; //将 stu 的成员 grade 的值增加 10

printf("%s %f", stu. name,(*pstu). grade); //输出 stu 的成员 name 和 grade 的值

如果结构体成员本身就是结构体类型,则多级分量运算至最低级子成员名

结构体变量名.成员名.子成员名. ... .最低级子成员名

代码示例:

struct Stu_Info stu;

struct Stu_Info * pstu=&stu;

stu. birthday. year=1986; //对 stu的结构体类型成员 birthday 的成员 year赋值

stu. birthday. month=10; //对 stu的结构类型成员 birthday 的成员 month 赋值

pstu-> birthday. day=12; //对 stu的结构类型成员 birthday 的成员 day赋值

几点说明:

(1)结构体变量不能整体引用,只能引用其变量成员。

(2)可以将一个结构体变量赋值给另一个结构体变量,例如,stu1 = stu2;是合法的。

(3)既可以引用结构体成员的地址,也可以引用结构体变量的地址

代码示例:

&stu1;  //表示结构体变量stu1所占内存单元的首地址

&stu1.grade  //表示结构体变量stu1的成员grade所占内存单元的地址

1.3结构体变量的赋值

如何对结构体变量初始化赋值?

  1. .先定义结构体类型,再定义结构体变量时赋初始值。格式如下:

注意:赋值时成员的顺序必须和定义结构体类型时成员名的顺序相同。

如果是结构体嵌套,则初始化赋值时在该特定位置时嵌套一个{}。

  1. 定义结构体类型的同时,定义结构体变量并赋初始值。格式如下:

代码示例:

struct date{

Int year,month,day;

}birthday = {2005,02,16};

如何让结构体变量在程序中赋值?

如果在定义结构体变量时并未对其赋初始值,那么在程序中要对他赋值的话,就只能一个一个地对其成员逐一赋值,获知用已赋值的同类型的结构体变量对它赋值。

代码示例:

struct Student_Info stu; //只定义了结构体变量 stu,并未对其赋初始值

//以下通过语句对 stu 的各个成员逐一赋值

strcpy(stu. no, "20020306");

strcpy(stu. name, "ZhangMing");

stu. sex='M';

stu. age=18;

stu. classno=1;

stu. grade=90;

//如果再定义一个结构体变量 stul,那么也可以将上面赋值后的stu赋值给 stul。

struct Student_Info stul;

stul=stu;

//执行后的结果将是把 stu 的各个成员的值复制给 stul 对应的成员,相当于执行下列语句:

strcpy(stul. no, stu. no);

strcpy(stul. name, stu. name);

stul. sex=stu. sex;

stul. age=stu. age;

stul. classno=stu. classno;

stul. grade=stu. grade;

//当然也可以用 memcpy函数来替代,其具体写法为:

//memcpy(&stul, &stu, sizeof(struct Student_Info));

注意:(1)对结构体变量不可以整体赋值。

          (2)不同结构体类型(成员及顺序不同)的结构体变量之间不能赋值。

1.4结构体变量内存分配问题透析

1.5 简化结构体类型名

用typedef语句,格式如下:

typedef  类型名 类型名的别名

注意: ·类型名必须是已经定义的数据类型名或C语言提供的基本类型名。

·类型名的别名必须是合法的标识符,通常用大写字母来表示。

·typedef 语句要以分号结尾。

·可以用类型名的别名代替类型名来定义变量。

代码示例:

typedef int INTEGER; //INTEGER是别名

typede f ch ar * STRING //STRING 是别名

struct teacher_info

{

char name[20], char sex, unit[30];

unsigned int age, workyears;

float salary;

};

typede f struct teacher_info TEACHER; //TEACHER是别名

INTEGER a; //相当于 int a;

STRING str; //相当于 char * str;

TEACHER t; //相当于 struct teacher_info t;

//如果要为数组取别名,必须在typedef语句中将数组的大小写在别名的后面。例如:

typede f char ARRAY[81]; //ARRAY 是别名

ARRAY str; //相当于 char str[81];

1.6结构体数组

什么是结构体数组?

如果数组元素时结构体类型的数据(本来一般是int 或者char类型的数据),那么这种数组就是结构体数组。结构体数组的每一个元素都是具有相同结构体类型的下表结构变量

name

sex

age

classno

grade

...

...

...

...

...

...

...

...

...

...

...

...

...

...

...

表格的框架相当于结构体类型,每一列相当于成员,每一行的信息对应该结构体数组元素各成员的具体值,行数对应的是数组长度

结构体数组如何初始化?

格式如下:


代码示例:

struct Student_Info stu[3]={{"20020306", "ZhangMing", 'M', 18, 1, 90},

{"20020307", "WangHai", 'M', 17, 1, 85},

{"20020308", "LiHong", 'F', 18, 2, 95}};

//又如:

struct Man_Info     //Man_Info也可省略

{

char name[20];

struct Date {int year, int month, int day} birthday;

} man[]={ {"ZhangXiang", {1986, 10, 29}},{"WangFei", {1987, 12, 10}} };

结构体数组如何引用?

格式如下:

结构体数组名[下标].成员名;

代码示例:

struct Student_Info stu[3];

strcpy(stu[0]. name, "WangFei");    //对数组元素 stu[0]中的成员 name赋值

stu[1]. grade++;                 //对数组元素 stu[l]中的成员 grade 增1

printf("%s", stu[0]. name);        //显示数组元素 stu[0]中的成员 name的值

结构体数组应用的代码示例:

统计候选人选票。

 #include <stdio. h>

#include < string. h>

struct person

{

char name[20];

int count;

} leader[3] =("Li", 0, "Zhang", 0 , "Wang",0};

int main( ){

int i,j;

char leader_name[20];

while(1) //统计候选人得票数

scanf("%s", leader_name) ;//输入候选人姓名

if(strcmp(leader_name, "0") ==0) //输入为"0"结束

break;

for(j =0; j<3;j++) //比较是否为合法候选人

if(strcmp(leader _name, leader [ i ].name) ==0) //合法

leader[ j ]. count++ //得票数加1

for(i=0;i<3; i++) //显示候选人得票数

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

return 0;}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值