我要解决的方法似乎对我来说不是最佳的。尽管我的代码可以正常工作,但我仍然感觉缺少一些可以优化或以其他方式(一种更简单的方式)进行优化的东西。
我的结构:
typedef struct {
char nom[30];
char prenom[30];
double salary;
double taxes;
} employee;
typedef struct {
char nom[20];
employee *employee_list;
unsigned int nmbr_employees;
} company;
我的代码的重要部分:
int main()
{
unsigned int nmbr_companies, nmbr_emps, i,j;
scanf("%u", &nmbr_companies);
company *company_list = malloc(sizeof(company) * nmbr_companies);
for(i=0; i <nmbr_companies; i++){
scanf("%u", &nmbr_emps);
company_list[i].employee_list = malloc(sizeof(employee) * nmbr_emps);
for(j=0; j < nmbr_emps; j++){
calc_netsalary(&company_list[i].employee_list[j]); // [1]
}
}
}
double calc_netsalary(employe *emp_list) // [2]
{
double salary;
if(emp_list->salary > 75000){
emp_list->taxes = 750;
salary=something;
}
return salary;
}
[1]我想知道是否存在将类似的嵌套结构传递给函数的最佳方法,以及在按自己的方式进行操作时应注意的陷阱。
[2]我以为我会理解指针,直到接触到结构为止,这一切再次让我感到困惑。对于将来如何处理类似结构而又不伤脑筋和第二个猜测自己的任何有见地的评论,我们将不胜感激。
最佳答案
您的代码很好。我不了解您在理解指针时遇到的问题。结构只是具有已定义(固定)布局的内存块。因此,指向结构的指针指向具有这种固定布局的内存块。当您访问结构的成员时,编译器只会将成员的偏移量添加到结构的基本地址中。因此,nmbr_employees位于[内存结构的开头] + 20个字符(= 20字节)+1个整数(= 4字节)。
您所谓的“列表”实际上是一个数组,因此最好给它起一个这样的名字。 (您将nmbr_emps分配给具有定义布局的一个内存块,一个接一个地整齐地进行布局。)由于它们一个接一个地整齐地进行布局,因此可以使用数组表示法来解决它们。
要优化访问,可以使用指针并编写:
company *pCompany= company_list;
for(i=0; i <nmbr_companies; i++, pCompany++){
scanf("%u", &nmbr_emps);
pCompany->employee_list = malloc(sizeof(employee) * nmbr_emps);
employee *pEmp= pCompany->employee_list;
for(j=0; j < nmbr_emps; j++, pEmp++){
// you should now first read-in the emp's data
calc_netsalary(pEmp); // [1]
}
}
C编译器将使用“ ++”表达式中的pstruct和pEmp指针增加其结构的大小。