前言
这篇文章呢就给大家简单讲解一下什么是结构体,也让大家对结构体有一个较为清晰的了解,从而帮助同学们更好的掌握结构体。
结构体类型的声明
结构的声明
在声明结构体的类型是,先给大家拓展两个重要的关键字 typedef 和 struct.
拓展
关键字 typedef
基本概念
typedef
用于为已有数据类型创建类型别名(Type Alias),不创建新类型。
作用
1. 提高代码可读性
2. 简化复杂类型声明
3. 增强代码可维护性
用法
//关键字 typedef 的用法
//基本类型重命名
typedef unsigned int uint; // 创建uint作为unsigned int的别名
uint num = 5; // 等价于unsigned int num = 5;
//结构体简化
typedef struct {
int x;
int y;
} Point; // 创建Point作为结构体的别名
Point p1; // 无需写成struct Point p1;
//指针类型别名
typedef struct {
int x;
int y;
} Point; // 创建Point作为结构体的别名
Point p1; // 无需写成struct Point p1;
//数组类型别名
typedef int IntArray[5]; // 创建5个元素的int数组类型
IntArray arr = { 1,2,3,4,5 };
//函数指针类型
typedef void (*Callback)(int); // 定义函数指针类型
void myFunc(int x) { /*...*/ }
Callback cb = myFunc; // 使用类型别名
关键字 struct
基本概念
struct
(结构体)是用于创建复合数据类型的关键字。
用法
//定义结构体
struct Point { // 定义名为Point的结构体
// 成员变量(默认public)
int x;
int y;
// 成员函数(C++特有)
void print() {
cout << "(" << x << ", " << y << ")\n";
}
};
意义
通过合理使用struct
,可以创建高效、清晰的数据结构,平衡数据访问的便利性与安全性。理解其与class
的区别以及现代C++特性对结构体的增强,是编写高质量C++代码的重要基础。
关于数据结构体的声明呢很简单,就是通过上面介绍的两个关键字来进行声明的。
其声明如下:(描述一个学生)
//结构体声明
struct Students {
char name[20]; //名字
int age; //年龄
char gender; //性别
int Student_ID; //学号
int grade; //成绩
};
结构体变量的创建和初始化
用法如下:
#include <stdio.h>
struct Stu
{
char name[20];//名字
int age;//年龄
char sex[5];//性别
char id[20];//学号
};
int main() {
//按照结构体的顺序初始化
struct Stu s1 = { "张三",20,"男","234576892" };
printf("name:%s\n", s.name);
printf("name:%d\n", s.age);
printf("name:%s\n", s.sex);
printf("name:%s\n", s.id);
//按照指定格式初始化
struct Stu s2 = { .age=18,.name="张三",.id="234576892",.sex="女"};
printf("name:%s\n", s.name);
printf("name:%d\n", s.age);
printf("name:%s\n", s.sex);
printf("name:%s\n", s.id);
return 0;
}
结构的特殊声明
有时候,我们在声明结构的时候,可以不完全声明。但是,有时候这样声明是非法的,匿名的结构体类型如果没有对结构题类型重命名的话,基本上只能使用一次。
//匿名结构体类型
struct{
int a;
char b;
float c;
}x;
结构体的声明就暂时讲到这里,除此之外关于结构体的对齐需要大家自己去了解哈。
结构体成员访问操作符
结构体成员访问操作符有两种,点操作符和箭头操作符。
点操作符( . )
作用:用于结构体/类实例的直接访问
用法:
//点操作符(.)
struct Student {
string name;
int age;
void print() {
cout << name << ": " << age << endl;
}
};
int main() {
Student s;
s.name = "Alice"; // 访问数据成员
s.print(); // 调用成员函数
Student& rs = s;
rs.age = 20; // 通过引用访问
}
箭头操作符( -> )
作用:用于结构体/类指针的间接访问
用法:
//箭头操作符(->)
void processStudent(Student* ptr) {
if (ptr != nullptr) {
ptr->name = "Bob"; // 等价于 (*ptr).name
ptr->print(); // 调用成员函数
// 链式访问
auto len = ptr->name.length();
}
}
结构体传参
关于结构体传参这里就给大家讲一下值传递、常量引用传递、指针传递。
值传递
//值传递
struct Point { int x, y; };
void printPoint(Point p) { // 产生拷贝
cout << p.x << "," << p.y << endl;
}
int main() {
Point pt{ 10, 20 };
printPoint(pt); // 传递副本
}
常量引用传递
//常量引用传递
double calcDistance(const Point& p1, const Point& p2) {
// 无法修改p1/p2的成员
return sqrt(pow(p1.x - p2.x, 2) + pow(p1.y - p2.y, 2));
}
指针传递
//指针传递
void initPoint(Point* p) {
if (p) { // 必须检查空指针
p->x = 0;
p->y = 0;
}
}