我这样做的方式对我来说似乎不是最佳选择。虽然我的代码工作正常,但我觉得我错过了一些我可以优化的东西,或者做了一种不同的方式,一种更简单的方法。
我的结构:
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]我以为我理解了指针,直到我进入结构,这一切都让我感到困惑。任何有关如何处理类似结构的有见地的评论,而不会挠头和第二次猜测我自己将不胜感激。
答案 0 :(得分:0)
你的代码很好。我不理解你理解指针时遇到的问题。结构只是一个具有已定义(固定)布局的内存块。因此,指向结构的指针指向具有这种固定布局的存储器块。当您访问结构的成员时,编译器只会将成员的偏移量添加到结构的基址。所以nmbr_employees位于[内存结构的开头] +20个字符(= 20个字节)+ 1个整数(= 4个字节)。
你叫什么&#34; list&#34;实际上是一个数组,所以最好给它这样一个名字。 (你用一个定义的布局分配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编译器将在&#34; ++&#34;中增加pCompany和pEmp指针的结构大小。表达式。