学习记录——大一上学期期末复习C语言——结构体

    第一次写博客,在有些方面的见解可能还有些欠缺,还望各路大佬在评论区纠正!但愿能给大家带来帮助!

    结构体。何为结构体?其实就是现在现成的数据类型(int、char、float……)不太够用,需要多类型更加便捷地混合使用时会使用的一种自定义的“数据类型”。

1.书写格式:

struct            (自定义结构体结构名){

           结构体包含的内容(包含哪些类型的变量,把变量名和变量类型写在这里,写完一个用分号结尾,看不明白可以看看下面的例子)

};(结尾的分号千万不能省略!!!它表示了定义的结束)

2.如何使用:

例①:创建一个生日结构体,内部成员有年月日。

#include <stdio.h>  //引入头文件
struct Birthday{
int year;
int month;
int day;
};  
/* 这个声明可以放在所有函数的外部(如本例所示),
该声明后的所有函数都能使用它的标记;也可以放在一个函数定义内部,
但这样的话这个结构声明的标记就只限于该函数内部使用 */
int main()    //基本结构不能错!
 {
  struct Birthday b;
  b.year=2000;
  b.month=11;
  b.day=11; 
  printf("%d-%d-%d",b.year,b.month,b.day);
  return 0;
}

生日的年月日都是整数,就定义成int类型!

其中:

 struct Birthday b;
  b.year=2000;
  b.month=11;
  b.day=11; 

为第一种赋值方法,此处的struct不可以省略,强调了变量类型B的类型,否则会出错!此处为定义了一个结构体变量B.

注意:此处也不可以写成:

struct Birthday b;
b={2000,11,11};

此处虽然符合下文会提及的第二种赋值方式,但这种方式不可取!为什么呢?

让我们来回顾一下数组,这里和数组是不是不能说十分,至少也有九分的相似?像不像数组b的初始化?进而程序运行时也会把b当成数组(发生混淆)而出错。

那怎么改正呢?

强制类型转换!

struct Bithday b;
b=(struct Birthday){2000,11,11};

结构体之间是可以相互调用的(结构体的嵌套)

例②:创建一个结构体,包含学生的名字,学号,成绩,生日

#include <stdio.h>  //引入头文件
struct Birthday{
int year;
int month;
int day;
};  
struct Student {
	char name [30];//学生的姓名
	int number;//学生的学号,为了方便演示,先把学号设定为一个数字的啦~
	double grade;//学生的成绩 
	struct Birthday birthday;/*学生的生日,嵌套前一个结构体*/ 
};
int main()    //基本结构不能错!
 {
  struct Student mike={"Mike",2,97.5,(struct Birthday){2000,11,11}};//强制类型转化
  printf("姓名:%s,学号:%d,成绩:%f,生日:%d-%d-%d",mike.name,mike.number,mike.grade,mike.birthday.year,mike.birthday.month,mike.birthday.day);
  return 0;
}

 此处用了第二种赋值方法,先声明一个结构体变量,再用大括号将要赋予的值写上,注意一定要按顺序来! 遇到要给嵌套的结构体赋值时,先强制类型转化,用括号将声明结构体的语句写在括号里,如这里的

struct Student mike={"Mike",2,97.5,(struct Birthday){2000,11,11}};

其中的

(struct Birthday){2000,11,11}}

先写个括号,再在括号里把声明部分的语句赋值进去,这里的声明语句为

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

这段代码的首句:

struct Birthday

在例②中的输出语句中:

printf("姓名:%s,学号:%d,成绩:%f,生日:%d-%d-%d",mike.name,mike.number,mike.grade,mike.birthday.year,mike.birthday.month,mike.birthday.day);

要向Birthday结构体包含的成员赋值,应该层层递进,mike.birthday.year为例,先找到mike结构体,再找到mike结构体中的birthday成员,而birthday成员又是Birthday结构体的成员,故借此找到Birhthday结构体,最后找到Birthday结构体中的year成员,并对其进行赋值。

补充:一、这里我们定义name是个有30个元素的数组,我们向name数组赋的值是“Mike",那么name[4]到name[29]分别是什么值?name[30]存在吗?

①:name[4]到name[29]其实都是0,数组中剩余的未被赋值的数组元素的值均为0

②:不存在name[30],数组下标越界,不可用

总结:

声明结构体时相当于创建一个类似于int的自定义变量类型,在main()函数里使用是类似于int,应该先声明结构体类型的变量,再对变量进行赋值

赋值方法有两种:

第一种:(例①)

 struct Birthday b;
  b.year=2000;
  b.month=11;
  b.day=11; 

第二种:(例②)

 struct Student mike={"Mike",2,97.5,(struct Birthday){2000,11,11}};//强制类型转化

第二种常常涉及到强制类型转化

结构体嵌套时,要对嵌套的结构体中的变量赋值,要层层递进!

第一次编写博客,如有不足欢迎在评论区指正,不足肯定很多,后期会根据后续的学习和评论区的指正统一对本文做补充的!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值