我正在学习大学的一些学分编码,我正在学习并决定尝试用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 ++。
答案 0 :(得分:3)
当您使用void foo(struct bar x)
声明一个函数并使用foo(y)
调用它时,编译器会复制y
并将该副本分配给x
。然后更改函数内的副本x
对原始y
没有影响。
当您使用void foo(struct bar *x)
声明一个函数并使用foo(&y)
调用它时,编译器将获取y
的地址并将该值分配给x
。然后x
是地址的副本,但您在函数内使用*x
或x->member
,这些引用地址处的对象。由于地址指向原始对象y
,因此更改*x
和x->member
会更改原始对象y
。
当您使用void foo(struct bar &x)
声明一个函数并使用foo(y)
调用它时,编译器将获取y
的地址并将其传递给该函数。编译函数时,编译器知道x
应该是引用,而不是指向原始对象的指针或副本。因此,无论函数中使用x
,编译器都会使用传递的地址来引用原始对象。因此,对函数中x
的更改是对原始对象的更改。在编写x.member = something;
的位置,编译器使用为x
传递的地址来更改原始对象member
中y
的值。此功能仅适用于C ++;它不在C中。
第一个叫做pass by value。
第三个被称为通过引用传递。
第二个相当于通过引用传递,除了它是手动而不是自动;您明确传递指针,必须手动写出*x
或x->member
而不是x
或x.member
。
关于struct empresa empresa;
中main
的说明。您的struct empresa
定义为struct employee employee[];
。这是一个灵活的数组成员,以这种方式定义该类型的对象不会为该数组的元素分配任何存储。使用它的正确方法是为基础结构(sizeof(struct empresa)
)分配存储以及任意数量的元素(+ empleados * sizeof(struct employee)
)。为此,您必须使用malloc
或相关功能。
灵活数组成员是某些C ++实现支持的扩展。它们不是该语言的标准部分。