结构体:
结构体是另一种用户自定义的可用的数据类型,它允许存储不同类型的数据项
结构体的声明,定义和初始化
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
//结构体声明
typedef struct Student {
int age;
float score;
char sno[10];
}student;
int main()
{
//变量的定义
int a = 100;
int b;
//结构体的定义
struct Student s = {19,78.5,"220702140"};//初始化
//访问成员
s.age = 19;
s.score = 78.5;
struct Student st;
st.sno[10] = "230802567";
return 0;
}
结构体字节要对齐
1.保证最长字节对齐 2.保证整数倍地址对齐
结构体定义的原则:必须保证结构体的字节对齐
typedef struct Student {
int age; //4
float score; //4
char sno[10]; //10
}student;
int main()
{
printf("%d",sizeof(student));//20
return 0;
}
结构体数组和结构体指针
typedef struct student {
int num;
int age;
}stu;
int main()
{
int arry[100];
int* ptar[100];
char buff[100];
//结构体数组 包含了5个student类型的元素,每个元素含有num和age两个成员
stu ss[5] = { {1,12},{2,13},{3,14} };
ss[0].age++;//访问和修改数组中第一个结构体元素的age,age+1
//结构体指针
stu* p = ss;//p是一个指向student类的指针,并且指向了结构体数组ss的首元素
printf("%d\n", (*p).age);//13
printf("%d\n",p->age);//13
//(*p).age等价于p->age
//只要是通过指针来访问结构体成员,通常都优先使用"->"操作符
//当直接操作一个结构体变量时,使用"."操作符
return 0;
}
联合体:
共用体也称联合是一种特殊的数据类型,允许您在相同的内存位置存储不同的数据类型。您可以定
义一个带有多成员的共用体,但是任何时候只能有一个成员带有值。共用体提供了一种使用相同的
内存位置的有效方式
typedef union Teacher {
int a;
char c;
}un;
int main()
{
un u;
u.c = 1;
printf("%d\n",sizeof(un));//4
printf("%d\n",u.a);//随机值
return 0;
}
结构体和联合体的区别:
1.定义和存储方式
结构体(struct):结构体是一种用户自定义的数据类型,它可以将不同类型的数据成员组合在一
起。每个数据成员都有自己独立的存储单元,在内存中是依次存放的。例如,定义一个包含学生姓
名和成绩的结构体:在内存中,name数组占据一段连续的内存空间,score也占据自己独立的内存
空间,紧跟在name之后(假设没有内存对齐等其他因素影响)
struct Student {
char name[20];
int score;
};
联合体(union):联合体也是一种用户自定义的数据类型,但它的所有成员共享同一段内存空
间。联合体的大小等于它最大成员的大小。例如,定义一个联合体:当使用union Data类型的变量
时,i和f共享同一块内存。如果先给i赋值,然后访问f,f的值将是根据i的值在内存中的存储方式重
新解释得到的。
union Data {
int i;
float f;
};
2.用途
结构体:适用于将相关的数据组合在一起,这些数据在逻辑上是相互关联的,但在存储上是相互独
立的。比如表示一个复杂的对象,像图形中的一个点结构体可以包含横坐标和纵坐标两个成员。
联合体:通常用于在不同时刻存储不同类型的数据,但同一时刻只能使用其中一个成员。例如,在
处理通信协议时,一个数据包可能有多种格式,根据不同的协议类型,数据包的内容有不同的解
释。可以用联合体来表示这种情况。
在声明过程中能否缺省名字?
结构体:在 C 语言中,声明结构体类型时可以不给出结构体标签(名字),这种匿名结构体主要
用于一次性的结构体定义,例如作为函数参数或者局部变量的类型定义。但在 C++ 中,这种匿名
结构体的使用受到更多限制。
这里定义了一个没有名字的结构体类型,同时创建了一个该类型的变量myVar。这种结构体类型不
能在其他地方再次使用来定义新的变量,因为它没有名字。
struct {
int a;
char b;
} myVar;
联合体:与结构体类似,联合体也可以在声明过程中缺省名字,同样主要用于一次性的定义。
这里定义了一个匿名联合体,同时创建了一个该类型的变量u。在 C++ 中,匿名联合体的使用规则
与 C 语言略有不同,在 C++ 中,匿名联合体的成员可以直接访问,就像它们是外层作用域的成员
一样。
#include <iostream>
using namespace std;
int main()
{
union {
int num;
double decimal;
};
num = 10;
cout << "num: " << num << endl;//10
decimal = 3.14;
cout << "decimal: " << decimal << endl;//3.14
// 注意:同一时刻只能使用联合体中的一个成员,这里再次使用 num 时,其值可能已被修改
cout << "num after using decimal: " << num << endl;//随机值
return 0;
}
结构体可以包含函数吗?在 C 和 C++ 中有何不同?
结构体可以包含函数分为两种情况
1.在C中,结构体不能直接包含函数 结构体只是数据的集合,函数通常是在结构体外部定义,并且
通过结构体指针或结构体变量来操作结构体中的数据。
struct function {
double r;
double i;
};
double fun(struct function c) {
return sqrt(c.r*c.r + c.i*c.i);
}
2.在C++中,可以在结构体内部定义成员函数 结构体和类非常相似,结构体可以包含函数成员,这
些函数可以直接访问结构体的其他成员。这种函数被称为成员函数。这里fun函数是function结构体
的成员函数,它可以直接访问r和i成员。
struct function {
double r;
double i;
double fun() {
return sqrt(r*r + i*i);
}
};