结构体和联合体的区别和能否在声明过程当中缺省名字以及结构体是否可以包含函数

结构体:

结构体是另一种用户自定义的可用的数据类型,它允许存储不同类型的数据项

结构体的声明,定义和初始化

#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);
    }
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值