让有一个名为 Employee 的结构:
struct Employee
{
int basicsalary;
int bonus;
int netsalary;
};
设函数原型(prototype)如下:
int calc_NetSalary(struct Employee**,int);
让结构体数组的变量在 main 函数中声明如下:
struct Employee emp[100];
让该函数在 main 中调用,如下所示:
for (i = 0; i < n; i++)
{
emp[i].netsalary = calc_NetSalary(emp[i],n); // Warning is here
}
让函数定义如下:
int calc_NetSalary(struct Employee** emp,int n)
{
int i;
for(i = 0; i < n; i++)
{
emp[i]->netsalary = emp[i]->basicsalary + emp[i]->bonus;
}
return emp[i]->netsalary;
}
我不知道将什么作为参数传递给需要带有两个星号的参数(代替上面的 emp
)的函数。我收到一条警告,因为从不兼容的指针类型传递“calc_NetSalary”的参数 1
。我知道这一定是我犯的一个愚蠢的错误,或者我不清楚指针的概念。请帮忙!
最佳答案
扩展我的评论:
calc_netSalary
函数期望 emp
中的数据布局如下:
+---+ +-------------+-------+-----------+
emp: | | emp[0] -------> | basicsalary | bonus | netsalary |
+---+ +-------------+-------+-----------+
| | emp[1] ----+
+---+ | +-------------+-------+-----------+
| | emp[2] -+ +--> | basicsalary | bonus | netsalary |
+---+ | +-------------+-------+-----------+
... |
| +-------------+-------+-----------+
+-----> | basicsalary | bonus | netsalary |
+-------------+-------+-----------+
也就是说,每个emp[i]
都是一个指向struct Employee
实例的指针。
但是,main
中的 emp
声明如下所示:
+-------------+-------+-----------+
emp: | basicsalary | bonus | netsalary | emp[0]
+-------------+-------+-----------+
| basicsalary | bonus | netsalary | emp[1]
+-------------+-------+-----------+
| basicsalary | bonus | netsalary | emp[2]
+-------------+-------+-----------+
...
也就是说,每个emp[i]
都是struct Employee
的实例。
要么是main
中emp
的声明错误,要么是calc_netSalary
的定义错误;它们不能一起工作。为了使 main
中的 emp
与 calc_netSalary
所期望的相匹配,需要通过以下方式之一将其声明为初始化:
struct Employee **emp = malloc( sizeof *emp * 100 );
if ( emp )
for ( size_t i = 0; i < 100; i++ )
emp[i] = malloc( sizeof *emp[i] );
或
struct Employee *emp[100];
for ( size_t i = 0; i < 100; i++ )
emp[i] = malloc( sizeof *emp[i] );
如果emp
确实应该被声明为struct Employee
数组,那么calc_netSalary
函数需要更改如下:
int calc_netSalary(struct Employee* emp,int n)
{
int i;
for(i = 0; i < n; i++)
{
emp[i].netsalary = emp[i].basicsalary + emp[i].bonus;
}
return emp[i].netsalary;
}
如果您被告知将 emp
声明为 struct Employee
数组,并找到一种将其传递给 calc_netSalary
的方法,这样它将被视为指向 struct Employee
的指针数组,那么您将面临一项不可能完成的任务。任务中存在严重错误。
编辑
实际上,还有第三种方法可以解决这个问题,但它涉及在 main
中声明第二个数组并将那个作为参数传递:
struct Employee emp[100];
struct Employee *emp2[100];
for ( size_t i = 0; i < 100; i++ )
emp2[i] = &emp[i];
...
calc_netSalary( emp2, 100 );
但我假设作业要求您使用emp
。
关于c - 如何将结构传递给参数类型有两个星号的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45303031/