为什么我的函数只在我用&传递它时更新结构?符号?

时间:2017-12-15 11:48:27

标签: c++ struct

我正在学习大学的一些学分编码,我正在学习并决定尝试用C ++中的结构创建一些东西来试图更好地理解它们。

我正在尝试使用一些函数来处理结构,但它们只有在我编写&在宣布论证之前,但在课堂上我们被告知它不应该是必要的。我的代码如下。

struct employee{
   int ID;
   char name;
   double salary;
};

struct empresa{
   char name;
   struct employee employee[];
};


void iterate_trough_employees(struct empresa &empresa, int number_employees){
    for ( int i = 0; i < number_employees; i++){
       empresa.employee[i].ID = i+1;
       printf("\n\n EL ID del empleado es:\t %d \n",empresa.employee[i].ID);
       empresa.employee[i].salary = rand() % 50;
       printf("El salario del empleado es: %.1lf \n", empresa.employee[i].salary);
       }
}

void sort_this(struct empresa &empresa, int number_employees){
   int list_of_ID[number_employees];
   list_of_ID[0]= empresa.employee[4].ID;
   printf("\n%d", empresa.employee[4].ID);
   printf("\n%d", list_of_ID[0]);
   printf("\n%.0lf\n", empresa.employee[6].salary);
}

int main(){
   struct empresa empresa;

   int empleados = 10;
   int orden_salarios[10];
   iterate_trough_employees(empresa, empleados);
   printf("%d", empresa.employee[6].ID);
   sort_this(empresa, empleados);

   return 0;
}

我最感兴趣的是sort_this函数,它只在我写K时在屏幕上显示正确的值(函数中的代码与标题无关,因为我一直试图计算把错误变成一个更容易的功能)。

对于那些要求,我们已经被教会使用一些C ++元素(例如C ++或cin / cout中的引用传递)来使用C代码来使其更容易,因此在您看来代码是不是C也不是C ++。 我正在学习大学的一些学分编码,我正在学习并决定尝试用C ++中的结构来制作一些东西以试图更好地理解它们。

我正在尝试使用一些函数来处理结构,但它们只有在我编写&amp;在宣布论证之前,但在课堂上我们被告知它不应该是必要的。我的代码如下。

struct employee{
   int ID;
   char name;
   double salary;
};

struct empresa{
   char name;
   struct employee employee[];
};


void iterate_trough_employees(struct empresa &empresa, int number_employees){
    for ( int i = 0; i < number_employees; i++){
       empresa.employee[i].ID = i+1;
       printf("\n\n EL ID del empleado es:\t %d \n",empresa.employee[i].ID);
       empresa.employee[i].salary = rand() % 50;
       printf("El salario del empleado es: %.1lf \n", empresa.employee[i].salary);
       }
}

void sort_this(struct empresa &empresa, int number_employees){
   int list_of_ID[number_employees];
   list_of_ID[0]= empresa.employee[4].ID;
   printf("\n%d", empresa.employee[4].ID);
   printf("\n%d", list_of_ID[0]);
   printf("\n%.0lf\n", empresa.employee[6].salary);
}

int main(){
   struct empresa empresa;

   int empleados = 10;
   int orden_salarios[10];
   iterate_trough_employees(empresa, empleados);
   printf("%d", empresa.employee[6].ID);
   sort_this(empresa, empleados);

   return 0;
}

我最感兴趣的是sort_this函数,它只在我写K时在屏幕上显示正确的值(函数中的代码与标题无关,因为我一直试图计算把错误变成一个更容易的功能)。

对于那些要求,我们已经被教会使用一些C ++元素(例如C ++或cin / cout中的引用传递)来使用C代码来使其更容易,因此在您看来代码是不是C也不是C ++。

1 个答案:

答案 0 :(得分:3)

当您使用void foo(struct bar x)声明一个函数并使用foo(y)调用它时,编译器会复制y并将该副本分配给x。然后更改函数内的副本x对原始y没有影响。

当您使用void foo(struct bar *x)声明一个函数并使用foo(&y)调用它时,编译器将获取y的地址并将该值分配给x。然后x是地址的副本,但您在函数内使用*xx->member,这些引用地址处的对象。由于地址指向原始对象y,因此更改*xx->member会更改原始对象y

当您使用void foo(struct bar &x)声明一个函数并使用foo(y)调用它时,编译器将获取y的地址并将其传递给该函数。编译函数时,编译器知道x应该是引用,而不是指向原始对象的指针或副本。因此,无论函数中使用x,编译器都会使用传递的地址来引用原始对象。因此,对函数中x的更改是对原始对象的更改。在编写x.member = something;的位置,编译器使用为x传递的地址来更改原始对象membery的值。此功能仅适用于C ++;它不在C中。

第一个叫做pass by value。

第三个被称为通过引用传递。

第二个相当于通过引用传递,除了它是手动而不是自动;您明确传递指针,必须手动写出*xx->member而不是xx.member

关于struct empresa empresa;main的说明。您的struct empresa定义为struct employee employee[];。这是一个灵活的数组成员,以这种方式定义该类型的对象不会为该数组的元素分配任何存储。使用它的正确方法是为基础结构(sizeof(struct empresa))分配存储以及任意数量的元素(+ empleados * sizeof(struct employee))。为此,您必须使用malloc或相关功能。

灵活数组成员是某些C ++实现支持的扩展。它们不是该语言的标准部分。