C语言学习—结构体的定义与使用


前言

在C语言中,结构体类型属于一种构造类型(其他的构造类型还有:数组类型,联合类型)。本文主要介绍关于结构体以下几部分。
在这里插入图片描述


一、结构体的概念

1.结构体是什么?

在实际的应用中,往往变量的类型复杂多变,我们仅仅使用C语言内置的类型无法准确的去定义变量,所以引出了结构体这个概念。也就是说,为了描述复杂类型的个体,只用C语言基础的内置类型不能完整的表述,而结构体就可以很好的解决这个问题。
结构体本质上还是一种数据类型,但它可以包括若干个“成员”,每个成员的类型可以相同也可以不同,也可以是基本数据类型或者又是一个构造类型。

2.如何定义一个结构体?

如何定义一个结构体,一般定义的形式如下所示:

//结构体的定义
struct + 结构体名称
{
	成员列表;
};

【注】在定义结构体的时候,大括号最后一定不要忘记分号:‘;’
我们举个简单的例子:我们定义一个名为Student的结构体,该结构体的成员包括:姓名,学号,性别,年龄,总成绩等。

//struct是一个
struct Student   //定义一个名为Student的结构体
{
	char name[20];  //姓名
	int id;  //学号
	char sex;  //性别(1:男  0:女)
	int age;  //年龄
	int score;  //总成绩
};

结构体是一种集合,它里面包含了多个变量或数组,它们的类型可以相同,也可以不同,每个这样的变量或数组都称为结构体的成员。在上面的例子中,Student为结构体名,它包含了5个成员,分别是:name,id,sex,age,score。特别注意,结构体成员的定义方式与变量和数组的定义方式相同,只是不能初始化

3.结构体变量

既然结构体是一种数据类型,那它就像C语言基础的内置类型一样,可以去定义变量,下面就举个简单的例子:
(1)结构体变量的定义可以放在结构体的声明之后:

struct Student   //定义一个名为Student的结构体
{
	char name[20];  //姓名
	int id;  //学号
	char sex;  //性别(1:男  0:女)
	int age;  //年龄
	int score;  //总成绩
};
struct Student stu;  //定义一个结构体变量

(2)结构体变量的定义也可以在结构体声明的同时定义,这样就简化了代码:

struct Student   //定义一个名为Student的结构体
{
	char name[20];  //姓名
	int id;  //学号
	char sex;  //性别(1:男  0:女)
	int age;  //年龄
	int score;  //总成绩
}stu;  //在结构体声明的同时定义一个结构体变量stu

在实际的定义中,往往使用第二种方法

struct Student stu1; //C语言中,利用结构体去定义变量的时候,必须加上struct,不能省略
Student stu2; //C++中,利用结构体去定义变量的时候,可以省略struct,可直接使用结构体名去定义

(3)还可以使用匿名结构体来定义结构体变量

struct   //没有结构体名
{
	char name[20];  //姓名
	int id;  //学号
	char sex;  //性别(1:男  0:女)
	int age;  //年龄
	int score;  //总成绩
}stu;  //使用匿名结构体来定义一个结构体变量stu

但要注意的是这样的方式虽然简单,但不能再次定义新的结构体变量了,也就是说,这种定义方式只能定义一次,不能重新再去定义别的变量。在使用的时候,要尤其注意。

4.结构体变量的初始化

4.1结构体成员的访问

虽然结构类似一个数组,只是数组元素的数据类型是相同的,而结构中元素的数据类型是可以不同的。但结构不能像数组那样使用下标去访问其中的各个元素,而应该用结构成员运算符点(.)。即访问成员的一般形式是:
结构体变量名.成员名
举个简单的例子:

struct Student stu; //定义一个结构体变量stu
stu.name; //通过stu.去访问结构体中的成员name,表示学生stu的姓名name
stu.age; //通过stu.去访问结构体中的成员age,表示学生stu的年龄age

我们可以通过运算符(.)去访问结构体成员,例如:
在这里插入图片描述
当我们使用结构体变量去访问成员的时候,输入运算符.其后面就会出现结构体成员列表,我们选择要访问的成员即可。这也说明我们定义的结构体变量是正确的。

4.2结构体变量的初始化

接上面结构体Student的例子,这里我们对其结构体变量stu1初始化:

struct Student stu1 = { “张飞”, 001, 1, 20, 400 }; //姓名:张飞,学号:001,性别:男(1表示男,0表示女),年龄:20,总成绩:400

struct Student stu1;  //若不给结构体初始值,则里面的值均为【随机值】
struct Student stu2 = { "Feizhang" };  //若给结构体只赋值一部分,则后面的全部赋为0
struct Student* stup = &stu1;  //定义一个结构体类型的指针stup,指向stu1
struct Student* stuq;  //理论上stuq为随机值,但在这里指向0Xcccccccc(Debug模式下会优化为cccccccc)
struct Student Stu_arr[10];  //定义一个结构体数组,若不给初始值,则为随机值

二、结构体的使用

1.如何去使用结构体?

1.1结构体的普通变量如如何访问结构体成员

结构体普通变量如何访问其成员:C语言规定,结构体的普通成员可以通过运算符“点.”去访问其成员,例如:

struct Student stu1 = { "Bulv", 20, 1001, 1, 90 };  //定义结构体变量stu1并初始化
struct Student stu2 = { "Feizhang", 22, 1002, 1, 95 };  //定义结构体变量stu2并初始化
stu1.id = 1003;  //通过结构体变量stu1去访问成员id,并将其值修改为1003
printf("%s\n", stu1.name);  //打印学生stu1的姓名
printf("%d\n", stu1.age);  //打印学生stu1的年龄
strcpy_s(stu1.name, 10, "caopi");  //修改stu1的第一个变量name的值(char类型不能直接赋值)
1.2结构体的指针变量如何访问其成员

结构体的指针变量如何访问其成员:可以通过箭头符号的方式去访问其成员:

(*p).name == p -> name //左右两种访问方式等价

举个简单的例子:

struct Student stu = { "刘备", 20, 1001, 1, 90 };  //定义结构体变量stu1并初始化
struct Student *p = &stu;  //定义一个结构体指针p去指向结构体变量stu
(*p).age = 23; //等价于p -> age = 23;   //将年龄修改为23
strcpy_s((*p).name, "张飞");//注意点和星号的优先级

【注】结构体成员如果是字符串,不能直接通过赋值号“=”去修改值,可以通过C语言中的拷贝函数strcpy去修改值。

2.结构体数组

在上面的例子中,我们都只是定义一个结构体变量,但在实际中,结构体变量不止一个,所以就需要一个数组来去存储。对比一般数组的定义,结构体数组也可以用相同的方式去定义、使用。下面举个例子:

struct Student  //定义一个名为Student结构体
{
	char name[20];  //姓名
	int age;  //年龄
	int id;  //学号
}stu[5];  //定义一个结构体数组stu[5],其长度是5,相当于要记录5个学生的信息

如何去使用结构体数组呢?如何访问结构体数组呢?我们看个简单的例子:
在这里插入图片描述

【更正】:上述 stu[3] 是定义了一个结构体数组,其长度是 3,不是 5(笔者手误);


总结

总结:以上是对结构体的定义以及如何使用做了简单的介绍,C语言中,我们实际要求的变量类型不能仅仅只通过C语言基础内置类型来定义,所以就引出了结构体,利用结构体来定义我们的变量,可以满足我们的要求,但是要注意的几点就是:
1.结构体如何定义,在定义的时候可以同时定义一个结构体变量,末尾必须以分好结尾;
2.结构体变量如何去访问其成员,可以通过运算符"."去访问;结构体指针变量如何去访问成员,可以通过箭头的形式去访问,例如:(*p).name == p -> name //左右两种访问方式等价。

  • 165
    点赞
  • 833
    收藏
    觉得还不错? 一键收藏
  • 11
    评论
### 回答1: 可以使用以下代码定义一个三维向量的结构体: ``` typedef struct { float x; float y; float z; } Vector3; ``` 这里使用了 `typedef` 关键字来定义一个新的类型名 `Vector3`,用于表示一个包含三个 `float` 类型成员的结构体。成员 `x`、`y` 和 `z` 分别表示向量在三个方向上的分量。可以使用以下代码来创建和初始化一个三维向量: ``` Vector3 vec = {1.0f, 2.0f, 3.0f}; ``` 这将创建一个 `Vector3` 类型的变量 `vec`,其分量分别为 1.0f、2.0f 和 3.0f。可以通过以下代码访问向量的分量: ``` float x = vec.x; float y = vec.y; float z = vec.z; ``` 也可以通过以下代码设置向量的分量: ``` vec.x = 4.0f; vec.y = 5.0f; vec.z = 6.0f; ``` ### 回答2: 在C语言中,可以使用结构体定义三维向量。结构体可以将多个不同类型的变量组合在一起,形成一个新的数据类型。 首先,我们需要定义一个结构体来表示三维向量,这个结构体可以包含三个浮点数类型的成员,分别代表向量的三个分量,如下所示: ```c struct Vector3D { float x; // 第一个分量 float y; // 第二个分量 float z; // 第三个分量 }; ``` 上述代码定义了一个名为`Vector3D`的结构体,其中包含了三个`float`类型的成员。 接下来,我们可以使用结构体来创建三维向量的变量。例如,我们可以定义一个名为`v`的变量,代表一个具体的三维向量: ```c struct Vector3D v; ``` 然后,我们可以通过点运算符来访问和修改这个变量的成员。例如,我们可以将向量的各个分量赋值为具体的数值: ```c v.x = 1.0; v.y = 2.0; v.z = 3.0; ``` 此时,`v`代表的三维向量的三个分量分别为1.0、2.0和3.0。 通过结构体定义和操作三维向量,可以更方便地进行向量运算。例如,我们可以定义一个函数来计算两个三维向量的点积: ```c float dotProduct(struct Vector3D a, struct Vector3D b) { return a.x * b.x + a.y * b.y + a.z * b.z; } ``` 在上述函数中,`a`和`b`是两个参数,分别为`Vector3D`类型的结构体变量。函数将返回两个向量的点积结果。 总结来说,通过使用结构体定义三维向量,可以更清晰地表示和操作向量的三个分量,提高代码的可读性和可维护性。 ### 回答3: C语言中可以使用结构体定义三维向量。结构体是一种自定义的数据类型,可以将多个不同类型的变量封装在一起,形成一个新的数据类型。 定义一个三维向量的结构体可以如下所示: ``` typedef struct { float x; // x轴上的分量 float y; // y轴上的分量 float z; // z轴上的分量 } Vector3D; ``` 以上代码定义了一个名为Vector3D的结构体,其中包含了三个浮点型成员变量x、y和z,分别表示向量在x轴、y轴和z轴上的分量。 通过该结构体,我们可以方便地创建三维向量的实例,进行向量的运算等操作。例如,可以定义一个Vector3D类型的变量并初始化: ``` Vector3D v; v.x = 1.0; v.y = 2.0; v.z = 3.0; ``` 通过结构体的成员运算符`.`,可以分别对向量的各个分量进行访问和赋值。 结构体还可以作为函数的参数或返回值,方便地传递和使用三维向量的信息。 总之,C语言使用结构体可以方便地定义和操作三维向量,使得程序的代码更加模块化和可读性更高。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值