有关结构体的应用

柔性数组。

柔性数组是定义在结构体之上的数组。其中定义的柔性数组必须放在结构体的最末尾,结构体中至少有两个成员变量。

#include <stdio.h> 
#include <stdlib.h>
typedef struct soft
{
    int a;
    int p[];
}S,*S_p;//柔性数组,*p没有占用空间。使用sizeof计算结构体空间的大小的时候,只是计算了成员a的大小。
int main(void)
{
    int len = 0;
    int i = 0;

    printf("Enter the array length.\n");
    scanf("%d",&len);
    S *p = (S*)malloc(sizeof(S) + sizeof(int)*len);

    p->a = len;
    for (i=0; i<p->a; i++)
    {
        p->p[i] = i; 
    }
    for (i=0; i<p->a; i++)
    {
        printf("p->p[%d] = %d.\n", i, p->p[i]);
    }
    free(p);
    return 0;
}

网络结构体

因为现在主流的网络协议还是IPV4协议,所以使用IPV4协议。将本地ip地址转换成网络字节序地址。

/*
/* Internet address.  */
typedef uint32_t in_addr_t;
typedef uint16_t in_port_t;    // 16的无符号short类型 
struct in_addr
  {
    in_addr_t s_addr;
  };

/* Structure describing an Internet socket address.  */
struct sockaddr_in
  {
    __SOCKADDR_COMMON (sin_);/* AF_INET IPv4 Internet protocols  指定网络地址类型*/ 

    in_port_t sin_port; /* Port number. 端口号 16位无符号short */
    struct in_addr sin_addr;/* Internet address.  具体的网址32位无符号int*/


    unsigned char sin_zero[sizeof (struct sockaddr) -
               __SOCKADDR_COMMON_SIZE -
               sizeof (in_port_t) -
               sizeof (struct in_addr)];
  };
*/
#include <stdio.h>
#include <stdlib.h>
include <features.h>
#include <stdint.h>
#include <sys/socket.h>
#include <bits/types.h>
#include <netinet/in.h>
#include <arpa/inet.h>

#define PORT 0x1234
#define ADDR 192.168.2.11

int main(void)
{
    //1、struct sockaddr_in定义这种类型的结构体变量
        struct sockaddr_in s;
        //2、填充你这个结构体各成员
        s.sin_family = AF_INET;
//      s.sin_ = AF_INET;               (错误)
        //但是已经错了,你的发送数据包,肯定找不到对方。
        //传送过去的IP/PORT都是网络字节序,大端模式:低位(字节)要放到高地址。
        s.sin_port = htons(PORT);       
//      printf("s.sin_port = 0x%x.\n", s.sin_port);

        s.sin_addr.s_addr = inet_addr(ADDR);
        //0x16011013
//      printf("网络字节序地址:0x%x.\n", s.sin_addr.s_addr);

        return 0;
}
C++ 结构体是一种用户自定义的数据类型,允许将不同类型的数据组合在一起,形成一个复合类型。结构体在程序设计中非常有用,尤其是在需要处理复杂数据结构或组织数据时。以下是 C++ 结构体的使用方法和常见应用场景: ### 1. 结构体的基本使用方法 #### 定义结构体 ```cpp struct Student { std::string name; int age; std::string gender; }; ``` #### 声明结构体变量 ```cpp Student stu1; ``` #### 初始化结构体成员 可以通过逐个赋值或使用初始化列表的方式初始化结构体成员: ```cpp stu1.name = "zhangsan"; stu1.age = 18; stu1.gender = "男"; ``` 也可以在声明时直接初始化: ```cpp Student stu2 = {"lisi", 19, "女"}; ``` #### 使用结构体数组 结构体可以与数组结合使用,用于存储多个相同类型的结构体对象: ```cpp Student stuArray[3]; stuArray[0] = {"zhangsan", 18, "男"}; stuArray[1] = {"lisi", 19, "女"}; stuArray[2] = {"wangwu", 20, "男"}; ``` #### 使用结构体指针 结构体指针可以提高程序的效率,尤其是在处理大型结构体时: ```cpp Student* pStu = &stu1; std::cout << pStu->name << std::endl; ``` ### 2. 结构体应用场景 #### 数据组织 结构体非常适合用于组织相关的数据。例如,在学生管理系统中,可以使用结构体来存储学生的姓名、年龄、性别等信息,这样可以使数据更加清晰和易于管理[^4]。 #### 复杂数据结构的构建 结构体可以与其他数据结构(如链表、树等)结合使用,用于构建更复杂的数据结构。例如,定义一个包含指针成员的结构体来实现链表: ```cpp struct Node { int data; Node* next; }; Node* head = nullptr; ``` 通过这种方式,结构体可以作为链表节点的基础,帮助开发者实现链表的操作,如插入、删除等[^3]。 #### 函数参数传递 结构体可以作为函数的参数传递,简化函数调用的复杂性。当需要传递多个相关联的参数时,使用结构体可以减少函数调用的参数数量,使代码更加简洁和易读。 #### 深拷贝与浅拷贝 结构体支持直接赋值操作,但需要注意深拷贝与浅拷贝的区别。对于包含指针成员的结构体,直接赋值可能会导致浅拷贝问题,因此需要手动实现深拷贝逻辑[^1]。 ### 3. 结构体的优化与最佳实践 - **内存对齐**:为了提高程序的性能,编译器会对结构体成员进行内存对齐。开发者可以通过调整结构体成员的顺序来优化内存占用。 - **避免不必要的拷贝**:在传递结构体参数时,尽量使用引用或指针,以避免不必要的拷贝操作。 - **使用构造函数**:C++ 中可以为结构体定义构造函数,以便在创建结构体对象时自动初始化成员变量。 ### 4. 结构体与类的区别 虽然结构体和类在 C++ 中有很多相似之处,但它们也有一些重要的区别。结构体的默认访问权限是 `public`,而类的默认访问权限是 `private`。此外,类通常用于面向对象编程,支持封装、继承和多态等特性,而结构体更多用于简单的数据组合。 ### 5. 结构体与函数的结合使用 结构体可以作为函数的返回值,也可以作为函数的参数传递。这种灵活性使得结构体在处理复杂数据时非常有用。例如,可以编写一个函数来更新结构体成员的值: ```cpp void updateStudent(Student& stu, const std::string& newName, int newAge, const std::string& newGender) { stu.name = newName; stu.age = newAge; stu.gender = newGender; } ``` ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值