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

问题描述 投票:-7回答:1

我正在学习大学的一些学分编码,我正在学习并决定尝试用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 ++中的结构来制作一些东西,试图更好地理解它们。

我正在尝试使用一些函数来处理结构,但它们只有在我写入和声明参数之前才有效,但在课堂上我们被告知它不应该是必要的。我的代码如下。

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

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

© www.soinside.com 2019 - 2024. All rights reserved.