注册 登录
编程论坛 C语言论坛

大佬们,怎么用循环遍历结构体成员呀?成员类型不一致

memcpy 发布于 2021-01-01 10:29, 3131 次点击
大佬们,怎么用循环遍历结构体成员呀?成员类型不一致
成员太多,用 . 一个一个访问有点麻烦。用指针和循环可以实现吗?
3 回复
#2
rjsp2021-01-01 20:42
没办法
#3
do8do8do82021-01-02 11:18
1.麻烦?机器都不喊麻烦(不过机器一喊那就是当了)
2. 可以用其它数据结构啊(难道你想单恋一枝花)
#4
knightfyx2021-01-04 22:29
理论上只要结构体处于一个连续的内存空间内就可以设置指针通过强制类型转换访问,但是非常地麻烦。建议你还是像楼上回答的使用其他数据结构。我这里给你列举了一个简单的应用示例,如果你能够把相同的变量放在一起就会更简便一些(不需要用switch),毕竟程序很难自动确认你现在所使用的变量类型。
程序代码:

#define _CRT_SECURE_NO_DEPRECATE
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int main()
{
    struct Mix
    {
        int a;
        char b[20];
        int c;
        float d;
        char e[10];
    };
    Mix*mx1 = (Mix*)malloc(sizeof(Mix));
    (*mx1).a = 2021;
    (*mx1).c = 104;
    (*mx1).d = 22.09;
    strcpy((*mx1).b, "congratul\0");
    strcpy((*mx1).e, "lations\0");
    int loop_a = 0;
    void*_tmp_p1 = (void*)mx1;
    int*_tmp_d = NULL;
    float*_tmp_f = NULL;
    char*_tmp_s = NULL;
    for (; loop_a <= 4; loop_a++)
    {
        switch (loop_a)
        {
        case 0: {
                    _tmp_d = (int*)_tmp_p1;
                    printf("%d %d\n", loop_a, *_tmp_d);
                    _tmp_d++;
                    _tmp_p1 = (void*)_tmp_d;
                }
                continue;
        case 1: {
                    _tmp_s = (char*)_tmp_p1;
                    printf("%d %s\n", loop_a, _tmp_s);
                    _tmp_s+=20;
                    _tmp_p1 = (void*)_tmp_s;
                }
                continue;
        case 2: {
                    _tmp_d = (int*)_tmp_p1;
                    printf("%d %d\n", loop_a, *_tmp_d);
                    _tmp_d++;
                    _tmp_p1 = (void*)_tmp_d;
                }
                continue;
        case 3: {
                    _tmp_f = (float*)_tmp_p1;
                    printf("%d %f\n", loop_a, *_tmp_f);
                    _tmp_f++;
                    _tmp_p1 = (void*)_tmp_f;
                }
                continue;
        case 4: {
                    _tmp_s = (char*)_tmp_p1;
                    printf("%d %s\n", loop_a, _tmp_s);
                }
                continue;
        }
        system("pause");
        return 0;
    }

}

我这里可以正常运行出结果的
1