指针。这是一种好的编程风格吗?

时间:2011-10-19 06:50:39

标签: c pointers

我有一个任务,我应该编程一台简单的柜员机,它需要10美元的钞票,并交换100,50,20和10美元的钞票。应退还最少的账单。

该作业重点关注指针,我开始怀疑我所做的是好的编程风格,因为我相信我把指针指向一个指针(例如&*balance

这是一个很好的方法,还是应该重写它?

这是我的main

int main(void) {
    int amount = 0; // Amount of 10 dollar bills
    int balance = 0; // Total balance (in dollars)
    int hundred = 0, fifty = 0, twenty = 0, ten = 0; // Amount of bills calculated

    // Set number of 10 dollar bills
    printf("Enter amount of 10 dollar bills: ");
    scanf("%d", &amount);

    // Set balance to user's 10 dollar bills
    valueOfBills(&balance, &amount, BILL_VALUE_TEN);

    // Calculate amount of bills for the different types
    amountOfBills(&balance, &hundred, &fifty, &twenty, &ten);
}

在我的main中,我致电amountOfBills(),这是一个计算每个账单返回数量的程序:

void amountOfBills(int *balance, int *hundred, int *fifty, int *twenty, int *ten) {
    /* To end up with the least amount of bills, we will start with bills with the largest value */

    // Calculate amount of 100 dollar bills
    amountOfBillsForBillValue(&*hundred, &*balance, BILL_VALUE_HUNDRED);

    // Calculate amount of 50 dollar bills
    amountOfBillsForBillValue(&*fifty, &*balance, BILL_VALUE_FIFTY);

    // Calculate amount of 20 dollar bills
    amountOfBillsForBillValue(&*twenty, &*balance, BILL_VALUE_TWENTY);

    // Calculate amount of 10 dollar bills
    amountOfBillsForBillValue(&*ten, &*balance, BILL_VALUE_TEN);
}

amountOfBills()我打电话给amountOfBillsForBillValue(),它会计算要返还的特定账单(例如100美元账单)的数量:

void amountOfBillsForBillValue(int *storeAmount, int *balance, int billValue) {
    /* We don't want to do anything if the balance is 0
       therefore we will just return to avoid any calculations */
    if (balance == 0) return;

    // Calculate amount
    *storeAmount = *balance / billValue;

    // Set balance
    *balance %= billValue;
}

amountOfBills()我使用&*balance。我应该采取另一种方式吗?或者这样做是否正常?

3 个答案:

答案 0 :(得分:3)

&*互相取消。只需balance即可为您提供&*balance相同的服务,并减少两个字符。另一方面,如果你只是想记住它是有意义的,那么使用&*不会造成任何伤害,并且编译器会很清楚它是一个noop。

然而,另一件事肯定是好风格。您为各种类型的笔记使用显式参数的方式。如果当你完成这个时,有人来告诉你“我们已经增加了五百美元的钞票,而且我们不会费心填写二十美元钞票”,你将不得不修改一切。你应该概括一下。有数组值和计数数组......

答案 1 :(得分:2)

如果我是你,我会将这些参数分组在一个结构中:

typedef struct
{
  int balance;
  int hundred;
  int fifty;
  int twenty;
  int ten;
} balance_t;

...

void amountOfBills(balance_t *balance);

这种方式只传递一个指向函数的指针,同样适用于另一个方法,避免函数有很多参数

答案 2 :(得分:1)

  

我相信我将指针指向指针(例如&*balance

你不是。你取消引用指针,然后取结果的地址。

换句话说,写&*balance与写balance相同。我建议你使用后者。