精华内容
下载资源
问答
  • c++遍历结构体成员
    万次阅读 多人点赞
    2019-01-08 20:00:36

    在C语言中遍历结构中成员;
    当结构成员的类型相同(或者是所占的字节相同,如uint32和int32)时,如下所示:

    typedef struct
    {
        int mem0;
        int mem1;
        int mem2;
        int mem3;
        int mem4;
        int mem5;
        int mem6;
        int mem7;
        int mem8;
        int mem9;
    }mem_t;

    一般如果想要对结构体进行赋值或取值,需要如下操作:

    mem_t mem = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; //初始化赋值操作
    mem.mem0 = 100; //单一成员赋值操作
    printf("struct mem's mem0 is %d\n", mem.mem0); //结构体取值;

    但是在很多情况下,我们需要批量、简洁地进行赋、取值操作,比如打印所有成员的值或将数组中的值依次赋值给结构中;

    例如:现在要将1,2,3……10分别赋给结构体的mem0到mem9,如果选择常规操作:
     

    mem.mem0 = 1
    mem.mem1 = 2
    mem.mem2 = 3
    mem.mem3 = 4
    mem.mem4 = 5
    mem.mem5 = 6
    mem.mem6 = 7
    mem.mem7 = 8
    mem.mem8 = 9
    mem.mem9 = 10

    这种方式很不方便,代码冗余;可读性强但是不美观,并且可拓展性差;如果现在添加了mem10,就需要重新调整代码;
    因而,有了如下的方式:
     

    mem_t mem;
    int *p = &mem;
    int i;
    for(i=0; i<sizeof(mem_t)/sizeof(int); i++)
    {
        (*p++) = i+1;
    }

    p初始化指向mem的第一个成员,sizeof(mem_t)/sizeof(int)能够得出struct结构体中有多少个成员,如果增删新成员也不需要进行改动,只修改结构体定义即可;

    但此方法仅适用于结构体中成员变量所占字符数相同的情况下,如果结构体中有char、int、short就不能采用此方法,需要采用进阶方法;

     

    无耻打广告

    字节跳动长期招聘,欢迎投递

    内推后可查进度
    字节跳动内推链接:https://job.bytedance.com/referral/pc/autumn-referral?category=&location=&token=MzsxNjAzOTUzMDMxMzY3OzY4MjAwNjY4ODc4ODg1MzcxMDI7MA

    欢迎投递加入~

     

     

    更多相关内容
  • C++遍历结构体数组并赋值

    万次阅读 2018-08-29 09:29:56
    main.cpp #include ...2.utils.cpp为工具类,getArrayLen为C++通用的获取数组长度方法。 3.#define random(x) (rand()%x) 位宏定义 获取0~x范围内的随机数。 4.Sex枚举类型感觉比java简单。

    main.cpp

    #include <iostream>
    
    using namespace std;
    
    #include "student.h"
    
    int main() {
        Student zhangsan = {"张三", 1001, man, 25};
        Student lisi = {"李四", 1002, wuman, 26};
        cout << zhangsan.name << "," << zhangsan.age << "," << zhangsan.num << "," << zhangsan.sex
             << endl;
        cout << lisi.name << "," << lisi.age << "," << lisi.num << "," << lisi.sex << endl;
        interMsg();
        getMsg();
        return 0;
    }
    
    

    student.cpp

    //
    // Created by Administrator on 2018/8/29.
    //
    
    #include <algorithm>
    #include <iostream>
    #include "student.h"
    #include "utils.cpp"
    
    using namespace std;
    #define random(x) (rand()%x)
    
    Student students[100];
    
    void interMsg() {
        size_t size = getArrayLen(students);
        cout << "size:" << size << endl;
    //这种循环不能修改stu的num值
    //    for (int i = 0; i <size ; ++i) {
    //        Student item =students[i];
    //        string &basic_string = item.getName();
    //        const char *name = basic_string.c_str();
    //        //cout << "item.name:" << name << endl;
    //        size_t num = random(size);
    //        cout << "item.num:" << num << endl;
    //        item.num = num;
    //    }
    //使用指针接收 &students[i]即可
    //    for (int i = 0; i <size ; ++i) {
    //        Student *item = &students[i];
    //        size_t num = random(size);
    //        //下面这两种方式一样的
    //        item->num = num;
    //        (*item).num = num;
    //    }
    //这种最简单
    //这个item 加上&就是去地址 即指针变量 *item即这个变量本身。
            for (auto &item : students) {
            size_t num = random(size);
            item.sex = man;
            cout << "item.num:" << num << endl;
            item.num = num;
        }
    }
    
    void getMsg() {
        for (auto item : students) {
            string &basic_string = item.getName();
            const char *name = basic_string.c_str();
            cout << item.name << "," << item.age << "," << item.num << "," << item.sex << endl;
        }
    }

    student.h

    //
    // Created by Administrator on 2018/8/29.
    //
    
    #ifndef CADDMORE_STUDENT_H
    #define CADDMORE_STUDENT_H
    using namespace std;
    
    void interMsg();
    
    void getMsg();
    
    enum Sex {
        man = 1,
        wuman = 0
    };
    
    struct Student {
        string name;
        int num;
        Sex sex;
        int age;
    
        string &getName() {
            return name;
        }
    
        Sex getSex() const {
            return sex;
        }
    };
    
    
    #endif //CADDMORE_STUDENT_H
    

    utils.cpp

    //
    // Created by Administrator on 2018/8/29.
    //
    #include <iostream>
    
    using namespace std;
    
    template<class T>
    int getArrayLen(T &array)  /*使用模板定义一个函数getArrayLen,该函数将返回数组array的长度*/ {
        return (sizeof(array) / sizeof(array[0]));
    }

    总结:
    1.for (auto &item : students) 中 &item为取指针,方便修改stu的参数。
    2.utils.cpp为工具类,getArrayLen为C++通用的获取数组长度方法。
    3.#define random(x) (rand()%x) 位宏定义 获取0~x范围内的随机数。
    4.Sex枚举类型感觉比java简单。

    展开全文
  • foreach (FieldInfo field in typeof(Cpicturexif.Metadata).GetFields(BindingFlags.Instance | BindingFlags.NonPublic | ...//遍历结构体里面含结构体的所有成员及值,里面重点是metaTest = (Cpicturexif.Metada...
    foreach (FieldInfo field in typeof(Cpicturexif.Metadata).GetFields(BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public))
         
    //遍历结构体里面含结构体的所有成员及值,里面重点是metaTest = (Cpicturexif.MetadataDetail)field.GetValue(m);GetValue()是得到的结构体对象m里面嵌套结构体,@Jski17761263313
    
    
       {
     
                     
                    foreach (FieldInfo field2 in typeof(Cpicturexif.MetadataDetail).GetFields(BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public))
                    {
                        Cpicturexif.MetadataDetail metaTest = new Cpicturexif.MetadataDetail() ;
                        metaTest = (Cpicturexif.MetadataDetail)field.GetValue(m);
                                           
                    }
       }
    
    展开全文
  • 在大多数情况下,我们一般这样定义结构体:struct student{unsigned int sex;unsigned int age;};对于一般的应用,这已经能很充分地实现数据了的“封装”。但是,在实际工程中,往往碰到这样的情况:那就是要用一个...

    在大多数情况下,我们一般这样定义结构体:

    struct student

    {

    unsigned int sex;

    unsigned int age;

    };

    对于一般的应用,这已经能很充分地实现数据了的“封装”。

    但是,在实际工程中,往往碰到这样的情况:那就是要用一个基本类型变量中的不同的位表示不同的含义。譬如一个cpu内部的标志寄存器,假设为16

    bit,而每个bit都可以表达不同的含义,有的表示结果是否为0,有的表示是否越界等等。这个时候我们用什么数据结构来表达这个寄存器呢?

    答案还是结构体!

    为达到此目的,我们要用到结构体的高级特性,那就是在基本成员变量的后面添加:

    :数据位数

    组成新的结构体:

    struct xxx

    {

    成员1类型成员1 : 成员1位数;

    成员2类型成员2 : 成员2位数;

    成员3类型成员3 : 成员3位数;

    };

    基本的成员变量就会被拆分!这个语法在初级编程中很少用到,但是在高级程序设计中不断地被用到!

    例如:

    struct student

    {

    unsigned int sex : 1;

    unsigned int age : 15;

    };

    上述结构体中的两个成员sex和age加起来只占用了一个unsigned int的空间(假设unsigned

    int为16位)。

    基本成员变量被拆分后,访问的方法仍然和访问没有拆分的情况是一样的,例如:

    struct student sweek;

    sweek.sex = MALE;

    sweek.age = 20;

    虽然拆分基本成员变量在语法上是得到支持的,但是并不等于我们想怎么分就怎么分,例如下面的拆分显然是不合理的:

    struct student

    {

    unsigned int sex : 1;

    unsigned int age : 12;

    };

    这是因为1+12 = 13,不能再组合成一个基本成员,不能组合成char、int或任何类型,这显然是不能“自圆其说”的。

    在拆分基本成员变量的情况下,我们要特别注意数据的存放顺序,这还与CPU是Big endian还是Little

    endian来决定。Little endian和Big endian是CPU存放数据的两种不同顺序。对于整型、长整型等数据类型,Big

    endian认为第一个字节是最高位字节(按照从低地址到高地址的顺序存放数据的高位字节到低位字节);而Little

    endian则相反,它认为第一个字节是最低位字节(按照从低地址到高地址的顺序存放数据的低位字节到高位字节)。

    我们定义IP包头结构体为:

    struct iphdr {

    #if defined(__LITTLE_ENDIAN_BITFIELD)

    __u8 ihl:4,

    version:4;

    #elif defined (__BIG_ENDIAN_BITFIELD)

    __u8 version:4,

    ihl:4;

    #else

    #error "Please fix "

    #endif

    __u8 tos;

    __u16 tot_len;

    __u16 id;

    __u16 frag_off;

    __u8 ttl;

    __u8 protocol;

    __u16 check;

    __u32 saddr;

    __u32 daddr;

    };

    在Little endian模式下,iphdr中定义:

    __u8 ihl:4,

    version:4;

    其存放方式为:

    第1字节低4位 ihl

    第1字节高4位 version (IP的版本号)

    若在Big endian模式下还这样定义,则存放方式为:

    第1字节低4位 version (IP的版本号)

    第1字节高4位 ihl

    这与实际的IP协议是不匹配的,所以在Linux内核源代码中,IP包头结构体的定义利用了宏:

    #if defined(__LITTLE_ENDIAN_BITFIELD)

    #elif defined (__BIG_ENDIAN_BITFIELD)

    #endif

    来区分两种不同的情况。

    由此我们总结全文的主要观点:

    (1) C/C++语言的结构体支持对其中的基本成员变量按位拆分;

    (2) 拆分的位数应该是合乎逻辑的,应仍然可以组合为基本成员变量;

    要特别注意拆分后的数据的存放顺序,这一点要结合具体的CPU的结构。

    分析:

    struct bit

    {

    int a:3;

    int b:2;

    int

    c:3;

    };

    int main()

    {

    bit s;

    char *c=(char*)&s;

    cout<

    *c=0x99;

    cout

    << s.a

    <

    <

    int a=-1;

    printf("%x",a);

    return 0;

    }

    输出为什么是

    4

    1

    -1

    -4

    ffffffff

    因为0x99在内存中表示为 100 11 001 , a = 001, b = 11, c = 100。当c为有符合数时, c

    = 100, 最高1为表示c为负数,负数在计算机用补码表示,所以c = -4;同理 b = -1;当c为有符合数时, c =

    100,即 c = 4,同理 b = 3。

    在拆分基本成员变量的情况下,我们要特别注意数据的存放顺序,这还与CPU是Big endian还是Little

    endian来决定。Little endian和Big endian是CPU存放数据的两种不同顺序。对于整型、长整型等数据类型,Big

    endian认为第一个字节是最高位字节(按照从低地址到高地址的顺序存放数据的高位字节到低位字节);而Little

    endian则相反,它认为第一个字节是最低位字节(按照从低地址到高地址的顺序存放数据的低位字节到高位字节)。

    位域 :

    有些信息在存储时,并不需要占用一个完整的字节, 而只需占几个或一个二进制位。例如在存放一个开关量时,只有0和1 两种状态,

    用一位二进位即可。为了节省存储空间,并使处理简便,C语言又提供了一种数据结构,称为“位域”或“位段”。所谓“位域”是把一个字节中的二进位划分为几个不同的区域,并说明每个区域的位数。每个域有一个域名,允许在程序中按域名进行操作。

    这样就可以把几个不同的对象用一个字节的二进制位域来表示。一、位域的定义和位域变量的说明位域定义与结构定义相仿,其形式为:

    struct 位域结构名 { 位域列表 }; 其中位域列表的形式为: 类型说明符

    位域名:位域长度

    例如: struct bs { int a:8; int b:2; int c:6; };

    位域变量的说明与结构变量说明的方式相同。

    可采用先定义后说明,同时定义说明或者直接说明这三种方式。例如: struct bs { int a:8; int b:2; int c:6; }data;

    说明data为bs变量,共占两个字节。其中位域a占8位,位域b占2位,位域c占6位。对于位域的定义尚有以下几点说明:

    一个位域必须存储在同一个字节中,不能跨两个字节。如一个字节所剩空间不够存放另一位域时,应从下一单元起存放该位域。也可以有意使某位域从下一单元开始。例如: struct bs { unsigned a:4 unsigned :0  unsigned b:4

    unsigned c:4 }

    在这个位域定义中,a占第一字节的4位,后4位填0表示不使用,b从第二字节开始,占用4位,c占用4位。

    由于位域不允许跨两个字节,因此位域的长度不能大于一个字节的长度,也就是说不能超过8位二进位。

    位域可以无位域名,这时它只用来作填充或调整位置。无名的位域是不能使用的。例如:

    struct k { int a:1 int :2  int b:3 int c:2 };

    从以上分析可以看出,位域在本质上就是一种结构类型, 不过其成员是按二进位分配的。

    展开全文
  • C语言遍历结构体

    2021-05-21 01:34:49
    假设结构体为:typedefstruct{unsignedcharucType;charcProgramID[32];charcRegionGroupID[32];unsignedcharucPlayStatus;unsignedcharucMonitorStatus;...求一段用循环遍历结构体的c代码。解决方案6你是要遍历...
  • VC++结构体成员变量和方法,实现结构体成员调用
  • 遍历结构体里的数组元素的三种方法 //设计一个描述商品的结构体,存放一个商品信息,并显示 #include<stdio.h> struct goods { char name[10];//10 int date;//4 char quality[10];//10 float price;//4 ...
  • C语言-结构体成员遍历

    千次阅读 2021-08-24 15:59:38
    C语言-结构体成员遍历 此方法试用的前提:结构体成员的数据类型相同 。话不多说,直接上手。 “结构体成员遍历”进阶版:当结构体里的成员数据类型不一样,可以计算出每个结构体成员的偏移量,并将偏移量放到一个...
  • C++ vector存放/遍历结构体变量

    千次阅读 2019-03-04 15:18:49
    #include #include using namespace std; typedef struct playback_track_metadata { public: int usage; int content_type; float gain;... //获取vector结构体数据 for(int i = 0; i (); i++) cout  
  • 1#include 2void main(){3 typedef struct {4 int int_field;5 char char_field;6 } my_struct;7 my_struct my_s;8my_s.int_field=3; //结构运算符访问结构成员9 my_struct *s;10 s=...
  • C++结构体

    2021-07-14 14:51:52
    语法:struct 结构体名 { 结构体成员列表 }; 通过结构体创建变量的方式有三种: A:struct 结构体名 变量名 B:struct 结构体名 变量名 = { 成员1值,成员2值....} C:定义结构体时顺便创建变量 二、结构体...
  • 遍历结构体里的数组元素的两种方法 //设计一个描述商品的结构体,存放一个商品信息,并显示 #include<stdio.h> struct goods { char name[10];//10 int date;//4 char quality[10];//10 float price;//4 }...
  • C++结构体完全攻略(超详细)

    千次阅读 2020-12-24 23:37:57
    一旦结构体类型被声明并且其数据成员被标识,即可创建该类型的多个变量,就像可以为同一个类创建多个对象一样。虽然今天结构体较少使用,但知道它们是什么,以及如何使用它们仍然很重要,这并不仅仅是因为可以在较老...
  • } //输出 张三 100 李四 99 王五 80 初学c++遇到难点,在这做个笔记 数组本身就是地址,所以不需要加取址符&。 指针指向的是数组的第一个地址。 每个地址由两部分组成:名字和分数。各占4个字节。每个地址占8个字节...
  • 结构体数组和结构体指针遍历

    千次阅读 2020-12-11 21:44:19
    在工作过程中会遇到结构体,可能会忘记如何遍历结构体数组,这是一个简单的例子: void structArrayPtr() { // 定义一个结构体数组 struct Student studentArray[2] = { {"William", 18}, {"Mark", 20} }; ...
  • 获得一个结构体变量成员在此结构体中的偏移量 linux下开发经常会碰到这2个宏,总结下: 1 #define offsetof(TYPE, MEMBER) ((size_t) & ((TYPE *)0)->MEMBER ) 宏功能:获得一个结构体变量成员在此...
  • 容器内含结构体遍历方式1.可以用整型量进行寻址2.迭代器寻址 以vector为例 1.可以用整型量进行寻址 这种直接采用for循环即可。 struct point { int x=0; int y=0; }; vector<point> v1; point p1; point ...
  • C++:结构体

    千次阅读 多人点赞 2020-09-20 18:32:52
    语法:struct 结构体名 {结构体成员列表} 通过结构体创建变量有三种方式: struct结构体名 变量名 struct结构体名 变量名 = {成员1值,成员2值,。。。} 定义结构体时顺便创建变量 #include <iostream> ...
  • 简单的 C++ 结构体字段反射

    千次阅读 2019-10-16 19:18:53
    本文不讨论完整的 C++ 反射技术,只讨论结构体(struct)的字段(field)反射,及其在序列化/反序列化代码生成上的应用。正文开始于§ 静态反射部...
  • c++ 结构体知识点集合 结构体定义 结构体和数组 结构体和函数 结构体和指针 const修饰
  • 已知一个结构体的指针,结构体内部的成员比较复杂,有int,char,union,struct等各种类型,现欲将其所有成员都打印出来,该如何处理?求编程牛人指点?
  • C++结构体

    2022-04-16 12:54:59
    C++结构体
  • [C++] 结构体Struct类型和变量定义

    千次阅读 2020-09-08 18:12:32
    一:struct 和typedef struct的区别 1.首先介绍一下C语言的用法: ...注意:这里不能省略struct (C++可以),可以采用下面重定义的方式省略struct //定义一个结构体类型 //定义一个数据类型,固定大小内存块的别名,.
  • 函数原型如下: int stat(const char *file_name, struct stat *buf) 通过readdir()函数读取到的文件名存储在结构体dirent的d_name成员中,stat()的作用就是获取文件名为d_name的文件的详细信息,存储在stat结构体...
  • 通过案例完成对结构的巩固:巩固结构体和数组,结构体赋值,地址传递用数组接收;巩固随机数的产生。
  • C++ 结构体专项

    2021-07-19 17:28:14
    语法:struct 结构体名 { 结构体成员列表 }; 通过结构体创建变量的方式有三种: struct 结构体名 变量名 struct 结构体名 变量名 = { 成员1值 , 成员2值…} 定义结构体时顺便创建变量 示例: //结构体定义 ...
  • C++结构体大小的计算方式

    千次阅读 2020-05-01 17:05:02
    说起来C++还真是一门神奇的语言,就像你的GirlFriend一样晦涩难懂,你永远不知道下一秒她的心情会是什么样的,不过好在C++它终究还是一门编程语言,工具毕竟是死的,既然是死的那就好办了,总有方法来对付它。...
  • C++ 使用结构体数组

    千次阅读 2019-08-01 17:02:20
    1、结构体数组的使用 #include<iostream> using namespace std;... //成员列表 string name; int age; int score; }; int main() { //结构体数组:将自定义的结构体放入到数组中维护 ...
  • c++ 遍历文件夹中的文件

    万次阅读 多人点赞 2018-01-12 15:14:50
    _finddata_t 结构体 struct _finddata_t 是用来存储文件各种信息的结构体。 定义如下: struct _finddata_t { unsigned attrib; time_t time_create; time_t time_access; time_t time_write; _fsize_t size; ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 15,148
精华内容 6,059
关键字:

c++遍历结构体成员

c++ 订阅
友情链接: mcgs_geshiwenben.zip