C 给定一个结构数组,如何将该结构的一个成员的所有值传递给函数

C 给定一个结构数组,如何将该结构的一个成员的所有值传递给函数,c,C,给定一个结构数组,有方法传递吗 emp[0].hourly_wage, emp[1].hourly_wage, emp[2].hourly_wage, emp[3].hourly_wage, emp[4].hourly_wage 将一个函数作为一个浮点数数组 是否可以传递仅包含“小时工资”成员而不包含“加班”成员的浮动数组。。。而不只是将值复制到单独的浮点数组中,然后将其传递给函数 struct employee { float hourly_wage; float OT; }

给定一个结构数组,有方法传递吗

emp[0].hourly_wage, emp[1].hourly_wage, emp[2].hourly_wage, emp[3].hourly_wage, emp[4].hourly_wage
将一个函数作为一个浮点数数组

是否可以传递仅包含“小时工资”成员而不包含“加班”成员的浮动数组。。。而不只是将值复制到单独的浮点数组中,然后将其传递给函数

struct employee
{
    float hourly_wage;
    float OT;
};

struct employee emp[5];
没有

最接近的可能是:

float a[10];
memcpy(a, emp, sizeof(a));
或:

但这可能是未定义的行为,因为它依赖于在每个
结构的末尾没有打包(在本例中可能没有打包,但不是普遍正确的-请参见),并且无论如何以错误的顺序为您提供数据。

这是不可能的

数组要求数组元素位于连续内存中(注意:成员之间可能有填充,但这与此无关)

在您的情况下,
emp
的内存布局如下:

addrX (i.e. emp)         :  float // emp[0].hourly_wage
addrX + 1 * sizeof(float):  float // emp[0].OT
addrX + 2 * sizeof(float):  float // emp[1].hourly_wage
addrX + 3 * sizeof(float):  float // emp[1].OT
addrX + 4 * sizeof(float):  float // emp[2].hourly_wage
addrX + 5 * sizeof(float):  float // emp[2].OT
...
没有办法把它变成

addrY                    :  float // emp[0].hourly_wage
addrY + 1 * sizeof(float):  float // emp[1].hourly_wage
addrY + 2 * sizeof(float):  float // emp[2].hourly_wage
...
不从第一个数组复制到另一个数组


相反,通常要做的事情是传递整个结构数组,即传递一个
struct employee
指针,并从该结构访问您需要的任何内容。

否,您只能创建指向结构数组中该成员的另一个指针数组,并将此指针数组传递给函数

struct employee
{
    float hourly_wage;
    float OT;
};

struct employee emp[5];
实施:

#include <stdio.h>
  
#define ARR_SZ 5

struct employee
{
        float hourly_wage;
        float OT;
};

void test_fun(float **arr) {
        for (int i = 0; i < ARR_SZ; ++i) {
                printf ("%f ", *arr[i]);
        }
        printf ("\n");
}

int main(void) {
        struct employee emp[ARR_SZ];

        for (int i = 0; i < ARR_SZ; ++i) {
                emp[i].hourly_wage = 2.0f;  // dummy value
                emp[i].OT = 1.0f;    // dummy value
        }

        float *hw_arr[ARR_SZ];

        for (int i = 0; i < ARR_SZ; ++i) {
                hw_arr[i] = &(emp[i].hourly_wage);
        }

        test_fun(hw_arr);

        return 0;
}
#包括
#定义ARR_SZ 5
结构雇员
{
浮动小时工资;
浮动OT;
};
无效测试(浮动**arr){
对于(int i=0;i
或者只需将结构数组传递给函数并访问该成员:

#include <stdio.h>
  
#define ARR_SZ 5

struct employee
{
        float hourly_wage;
        float OT;
};

void test_fun(struct employee *arr) {
        for (int i = 0; i < ARR_SZ; ++i) {
                printf ("%f ", arr[i].hourly_wage);
        }
        printf ("\n");
}

int main(void) {
        struct employee emp[ARR_SZ];

        for (int i = 0; i < ARR_SZ; ++i) {
                emp[i].hourly_wage = 2.0f;  // dummy value
                emp[i].OT = 1.0f;    // dummy value
        }

        test_fun(emp);

        return 0;
}
#包括
#定义ARR_SZ 5
结构雇员
{
浮动小时工资;
浮动OT;
};
无效测试(结构员工*arr){
对于(int i=0;i
您可以创建并传递数组,也可以创建一个函数,该函数接受一个
struct employee
(或指向它的指针),并以这种方式循环处理每个
小时工资的结构数组。否则,无法神奇地传递结构数组中一个成员的数组。传递指针是最有效的,不过在您的情况下,可以想象您的结构与x86_64上的指针大小相同。噢,我敢打赌您也喜欢玩俄罗斯轮盘赌
:)
前两个字符的句子就把它全部捕获了。