一招解决结构体问题

引文

我们首先要了解一下结构体的作用是干什么的?有什么用处?我们都知道,在记录每一个学生的时候都是需要知道他的名字、学号、成绩、年龄等一系列信息。那么我们在程序里面记录这些东西,那么就需要用到很多的变量,变量一多,我们就觉得烦,想着能不能简化一下,这时候结构体就诞生了,结构体就是用来存放这样一组数据的集合。

1.结构体概述

结构体由许多组织在一起的数据项组成,这些数据项不需要属于同一类型,
结构体可以容纳需要的任意多数据项。

2. 结构体声明和定义

声明一个结构体需要关键字(struct) 结构体类型名 { 变量 }; 在这里struct表示结构体的开始。比如下面我们定义一个student的结构体。

struct student_t   //这里的_t是表示这是个结构体
{
	int ID;
	char name[20];
	int age;
	float scort;
};

这是声明一个结构体,结构体类型声明形成了创建结构体变量的模板,声明模板时若没有定义变量是没有开辟内存空间的,结构体中的变量称为结构体元素或结构体成员。
然后我们如何定义呢?有三种方法,一种我们直接定义它:struct+结构体类型名+变量名;例如:struct student_t student; 另一种是在声明的时候直接定义了,就是在分号的前面,例如:

struct student_t   //这里的_t是表示这是个结构体
{
	int ID;
	char name[20];
	int age;
	float scort;
}student1, student2;

最后一种是在声明的时候加个typedef,表示定义一个数据类型,在分号的前面要加一个名称(一般大写)。

typedef struct student_t   //这里的_t是表示这是个结构体
{
	int ID;
	char name[20];
	int age;
	float scort;
}STU;

定义的话就变得简单一些:STU student1;

3. 结构体初始化:

初始化一个结构体,和初始化一个数组类型,都是要有{ }。而且初始化也可以部分初始化。下面看几个例子。

STU student1={1001, “xiaoming”, 13, 100}//全部赋值
STU student1={1001, “xiaoming”, }//部分赋值,相对应的其他会变成0(如果是字符数组会变成‘\0’)

4. 结构体内存的计算

结构体的内存和其他的变量不一样,它有一个内存对齐的问题,比如上面的student这个结构体,ID占4个字节,name这个数组占20个字节,age占4个字节,scort占4个字节,加起来就是36个字节,这是简单的计算,如果结构变成:

struct student_t   
{
	int ID;
	char name[17];  //17个字节?
	int age;
	float scort;
};

这个结构体的内存不会是33个字节而是36个字节,其中name开辟的空间不是17个字节,而是20个字节。再来:

struct student_t   
{
	int ID;
	char name;  
	double scort;  //8个字节
};

这个结构体,在内存中会开辟16个字节,不会是24个,因为int和char这两个内存比较小,在存储的时候会连接在一起了。再来:

struct student_t   
{
	int ID; 
	double scort;
	char name;
};

这个结构体,在内存中会开辟24个字节,不会是16个,因为int和char在存储的时候没有连接在一起。

5. 结构体成员的访问

变量名+点运算符+元素名
例如,访问一号学生的名字和成绩:
等到了指针的时候,这个访问会有区别改成箭头。这个以后会说。

printf(%s, %f”, student1.name, student1.scort);

6. 赋值和拷贝

结构体和数组不同的是,我们数组是不可以直接赋值的,而我们结构体确是可以:student2=student1; 另外我们还可以用一个函数来拷贝内存,memcpy(&student2, &student1, sizeof(STU));
第一个参数是目标地址,第二个参数是源地址,第三个参数是要拷贝的内存大小。
我们在对结构体中的字符串数组修改的时候可以用strcpy这个函数来帮我们实现,简化代码。

7. 结构体的应用

结构体可以作为函数的参数,函数的返回值,结构体也可以是一个数组,这叫结构体数组。在作为函数的参数的时候这是按值传递的,如果是结构体数组那么就是按地址传递的(因为不同变量的话就是按值传递,而数组的话,因为数组名是地址,所以是按地址传递)。结构体中可以嵌套结构体,不过不能嵌套自己,如果嵌套自己的指针的话那么是可以的,因为指针是地址,他的空间是知道的(4个字节),而嵌套自己的话就不知道内存空间是多少了,所以会有问题。

以上就是结构体有关的知识点,下次给大家分享一下指针的初级应用。

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值