结构体_1

什么叫结构体

把一些基本类型数据组合在一起形成的一个新的复合数据类型,这个叫做结构体。


为什么需要结构体

为了表示一些复杂的事物,而普通的基本类型无法满足实际要求。


下面举一个例子

例1:

# include <stdio.h>

struct Student  //3行
{
	int age;
	float score;
	char sex;
};             //8行

int main(void)
{
	struct Student st = {80, 66.6, 'M'};	//12行
/*	int age;
	float score;
	char sex;
	int age2;
	float score2;
	char sex2;
*/
	return 0;
}

比如说,如果想统计一百个学生的年龄(age)、成绩(score,分数),性别(sex),先说年龄,那就需要定义变量age1、age2、age3等等,共一百个变量,这样显然很麻烦,我们可以使用结构体来略去一些重复性操作,这也是结构体的作用——为了表示一些复杂的事物,而普通的基本类型无法满足实际要求。


怎么使用结构体变量

赋值和初始化

定义的同时可以整体赋初值

如果定义完之后,则只能单个的赋初值


例1的3-8行是定义了一个结构体变量类型Student,12行是定义了一个 struct Student类型的变量 st,并对它进行了初始化(所谓初始化就是在定义变量的同时给它赋值)


如何定义结构体,再举一个例子

例2:

# include <stdio.h>

//第一种方式
struct Student
{
	int age;
	float score;
	char sex;
};

//第二种方式
struct Student2
{
	int age;
	float score;
	char sex;
} st2;

//第三种方式
struct
{
	int age;
	float score;
	char sex;
} st3;

int main(void)
{
	struct Student st = {80, 66.6, 'M'}; //初始化  定义的同时赋初值
	struct Student st4;
//	struct Student st5 = {.age = 21, .sex = 'M'}; 
	st4.age = 10;
	st4.score = 88;
	st4.sex = 'M';

	printf("%d %f %c\n", st.age, st.score, st.sex);     
	printf("%d %f %c\n", st4.age, st4.score, st4.sex);  

	return 0;
}

输出结果为:



由上可以看到,定义结构体有三种方式,但推荐使用第一种

第31行代码,其实是可以执行的,但不知什么原因,我在dev c++(gcc4.8.1)和c-free5.0下都会报错,提示是不支持简单的指定初始化,而我使用LINUX下的gcc(4.6.3)时,有没有报错,原因不清楚,若日后得知,定在此说明

35行和36行中的st.age这样的字符表示结构体变量st指向该结构体中的变量,

这两句都是将结构体中的成员输出


如何取出结构体变量中的每一个成员【重点】

1、结构体变量名.成员名

2、指针变量名—>成员名 (第二种方式更常用)

指针变量名—>成员名  在计算机内部会被转化成 (*指针变量名).成员名的方式来执行

所以说这两种方式是等价的


再举个例子

例3:

# include <stdio.h>

struct Student
{
	int age;
	float score;
	char sex;
};

int main(void)
{
	struct Student st;
	struct Student * pst = &st;  //&st不能改成st
	
	pst->age = 88;//第二种方式  15行
	st.score = 66.6f; //第一种方式   16行 
	printf("%d %f\n", st.age, pst->score);	   //17行
	printf("%d %f\n", pst->age, st.score);   //18行
	
	return 0;
}

输出结果为:


13行是定义了一个struct Student类型的指针变量


16行,66.6在C语言中默认是double类型,如果希望一个实数是float类型,则必须在末尾加f或F, 因此66.6是double, 66.6f或66.6F是float

而66.6的结果输出为66.599998,这是因为浮点数(float和double)不能保证其每个数字都准确存储,像66.6这样的就不能准确存储,这是因为其编码本身就不能准确存储浮点数


第15行和第16行分别用这两种方式对Student结构体中的两个成员进行赋值,而在最终输出时,通过17行和18行的对比,又说明了这两种取值方式效果相同,当然,第二种方式更常用


【所有代码均在windows系统下VC++6.0下运行通过】

(如有错误,敬请指正)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值