当交易发生时,需要打印收据。
void print_receipt(Transaction trans )
{
printf(“%s\n”,trans.product);
printf(“%d @ %2.f \
total %2.f\n”,trans.quantity,trans.unit_price,trans.total_amount)
};
如果current_trans是一个Transaction结构,我们可以像下面这样调用函数;
print_receipt(current_trans);
说明:
该方法能产生正确的结果,但它的效率很低,因为C语言的参数传值调用方式要求把参数的一份拷贝传给函数。如果PRODUCT_SIZE为20,而且在我们使用的机器上整型和浮点型都占4个字节,那么这个结构将占据32个字节的空间。要把它作为参数进行传递,必须把32个字节复制到堆栈中,以后再丢弃。
方法二:
void print_receipt(Transaction *trans )
{
printf(“%s\n”,trans.product);
printf(“%d @ %2.f \
total %2.f\n”,trans.quantity,trans.unit_price,trans.total_amount)
};
该函数可以用下面方法进行调用:
print_receipt(¤t_trans);
说明:
这次传递给函数的是一个指向结构的指针。指针比整个结构要小得多,所以把它压到堆栈上效率能提高很多。传递指针另外需要付出的代价是必须在函数中使用间接访问来访问结构的成员。结构越大,把指向它的指针传递给函数的效率就越高
向函数传递指针的缺陷在于函数现在可以对调用程序的结构变量进行修改。如果不希望如此,可以在函数中使用const关键字来防止这类修改。现在通过如下方式进行调用:
void print_receipt(Transaction const *trans);
2.对交易进行处理:计算应该支付的总额。你希望函数comput_total_amount能够修改结构的total_amount成员。要完成这项任务有三种方法.
1>方法1:
Transaction compute_total_amount(Transaction trans)
{
trans.total_amount = trans.quantity*trans.unit_price;
return trans;
}
可以使用下面形式进行调用:
current_trans = compute_total_amount(current_trans);
结构的一份拷贝作为参数传递给函数并被修改。然后一份修改后的结构拷贝从函数返回,所以这个结构被复制了两次。
2>方法2:
该方法是只返回修改后的值,而不是整个结构
float compute_total_amount(Transaction trans)
{
return trans.quantity * trans.unit_price;
}
但是,这个函数必须以下面这种方式进行调用:
current_trans.total_amount
=compute_total_amount(current_trans);
此方案比返回整个结构的那个方案强,但这个技巧只适用于计算单个值的情况。如果要求函数修改结构的两个或更多成员,这样方法就无能为力了。另外,它仍然存在把整个结构作为参数进行传递这个开销。
3>方法3:
传递一个指针,该方案要好的多
Void compute_toatl_amount(Transaction *trans)
{
trans->total_amount =trans->quantity *trans->unit_price;
}
这个函数按照下面的方式进行调用:
compute_total_amount(¤t_trans);
说明:
在程序中结构字段total_amount被直接修改,它并不需要把整个结构作为参数传递给函数,也不需要把整个修改过的结构作为返回值返回。