C之结构体初始化10种写法总结(九十)

简介: ****博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长!

优质专栏:Audio工程师进阶系列原创干货持续更新中……】????
优质专栏:多媒体系统工程师系列原创干货持续更新中……】????
优质视频课程:AAOS车载系统+AOSP14系统攻城狮入门实战课原创干货持续更新中……】????

人生格言: 人生从来没有捷径,只有行动才是治疗恐惧和懒惰的唯一良药.

更多原创,欢迎关注:Android系统攻城狮

欢迎关注Android系统攻城狮

????????????文章目录????????????

    • ????1.前言
    • ????2.C语言和C++语言在初始化结构区别
    • ????3.代码实例
      • ????.直接初始化
      • ????.指定成员初始化
      • ????.使用成员顺序初始化
      • ????.逐个赋值初始化
      • ????.使用临时结构体
      • ????.使用memset清零结构体后再赋值
      • ????.使用动态内存分配
      • ????.使用静态初始化:
      • ????.使用memcpy
      • ????.使用复合字面量

????1.前言

本篇目的:C之结构体初始化10种写法总结

????2.C语言和C++语言在初始化结构区别

  • C语言和C++语言在初始化结构体方面存在一些显著的区别,这些区别主要源于两种语言在编程范式和特性支持上的差异。下面将分别介绍C语言和C++语言在初始化结构体时的不同做法,并总结其间的差异。

  • 在C语言中,结构体的初始化主要依赖于赋值操作。由于C语言是一种过程式编程语言,它不直接支持对象的构造和析构,因此结构体通常通过赋值语句或函数调用进行初始化。例如,可以定义一个结构体变量,然后逐个为其成员赋值。这种方法虽然直接,但相对繁琐,特别是在结构体成员较多时。

  • 此外,C语言还提供了指定初始化器(designated initializer)的特性,允许开发者在初始化时直接指定结构体成员的值。这种特性在一定程度上提高了初始化的灵活性,但仍然需要显式地为每个成员赋值。

  • 相比之下,C++语言在初始化结构体方面提供了更为丰富和强大的支持。C++是一种面向对象的语言,它支持构造函数和析构函数等特性,- 使得结构体的初始化更加便捷和高效。在C++中,可以为结构体定义构造函数,通过构造函数在创建结构体对象时自动完成初始化工作。这种方式不仅减少了代码量,还提高了代码的可读性和可维护性。

  • 此外,C++还支持列表初始化(list initialization)和统一初始化语法(uniform initialization),使得结构体的初始化更加直观和简洁。通过使用花括号{}和等号=的组合,可以一次性为结构体的所有成员赋值,无需显式指定每个成员的名称。这种语法不仅适用于结构体,还适用于类、数组等其他类型。

  • 综上所述,C语言和C++语言在初始化结构体方面存在明显的区别。C语言主要通过赋值操作进行初始化,而C++则提供了更为强大和灵活的构造函数和初始化语法支持。这些差异反映了两种语言在编程范式和特性支持上的差异,也使得开发者在选择使用哪种语言时需要根据具体需求进行权衡。

????3.代码实例

????<1>.直接初始化

struct MyStruct {
    int x;
    double y;
};

struct MyStruct s1 = {10, 3.14};

????<2>.指定成员初始化

struct MyStruct {
    int x;
    double y;
};

struct MyStruct s2 = { .x = 10, .y = 3.14 };

????<3>.使用成员顺序初始化

struct MyStruct {
    int x;
    double y;
};

struct MyStruct s3 = {10, 3.14};

????<4>.逐个赋值初始化

struct MyStruct {
    int x;
    double y;
};

struct MyStruct s4;
s4.x = 10;
s4.y = 3.14;

????<5>.使用临时结构体

struct MyStruct {
    int x;
    double y;
};

struct MyStruct s5 = { .x = 10, .y = 3.14 };

????<6>.使用memset清零结构体后再赋值

struct MyStruct {
    int x;
    double y;
};

struct MyStruct s6;
memset(&s6, 0, sizeof(struct MyStruct));
s6.x = 10;
s6.y = 3.14;

????<7>.使用动态内存分配

struct MyStruct {
    int x;
    double y;
};

struct MyStruct *s7 = malloc(sizeof(struct MyStruct));
if (s7 != NULL) {
    s7->x = 10;
    s7->y = 3.14;
}

????<8>.使用静态初始化:

struct MyStruct {
    int x;
    double y;
};

struct MyStruct {
    int x;
    double y;
} s8 = {10, 3.14};

????<9>.使用memcpy

struct MyStruct {
    int x;
    double y;
};

struct MyStruct s9;
int tempX = 10;
double tempY = 3.14;
memcpy(&s9, &(struct MyStruct){tempX, tempY}, sizeof(struct MyStruct));

????<10>.使用复合字面量

struct MyStruct {
    int x;
    double y;
};

struct MyStruct s10 = (struct MyStruct){10, 3.14};
上一篇:《前端面试题》- JS基础 - call、apply、bind 的区别