Основной вопрос указателя C - PullRequest
4 голосов
/ 21 июля 2010

Прошло много времени с тех пор, как я последний раз программировал C, кажется, я все забыл А пока ... У меня очень простой вопрос. Предполагая, что у меня есть функция, которая вычисляет сумму итерации цикла Не только эта функция вернуть счетчик цикла, а также сумму, которую он вычислил. Так как я могу просто вернуть один Значение, которое я предполагаю, лучшее, что я мог бы сделать для суммы, это объявить указатель. Могу ли я сделать это так:

   int loop_function(int* sum)
   {
    int len = 10; 

    for(j = 0; j < len; j++) 
    {
      sum += j;
    }

   return(j);
   }   

   ....


   int sum = 0;
   loop_function(&sum);
   printf("Sum is: %d", sum);

Или мне нужно определить дополнительную переменную, которая указывает на сумму, которую я затем передаю функции?

Большое спасибо, Marcus

Ответы [ 7 ]

17 голосов
/ 21 июля 2010

Что у вас правильно, кроме этой строки:

sum += j;

Поскольку sum является указателем, это увеличивает адрес, содержащийся в указателе , на j, что не то, что вам нужно. Вы хотите увеличить значение , на которое указывает указатель , на j, что выполняется путем применения оператора разыменования * к указателю вначале, например:

*sum += j;

Кроме того, вам нужно определить j где-то там, но я думаю, вы это знаете, и это просто упущение.

9 голосов
/ 21 июля 2010

Запись

*sum += j;

То, что вы делаете, это увеличение указателя (вероятно, не то, что вы хотели)

3 голосов
/ 21 июля 2010

Это должно быть:

*sum += j;

, поэтому вы увеличиваете значение , указанное на вместо локальной переменной указателя.

2 голосов
/ 21 июля 2010

Вам не нужно создавать дополнительную переменную, но в цикле вам нужно сделать

*sum += j
1 голос
/ 22 июля 2010

Вы должны написать * sum + = j;

Этого достаточно

0 голосов
/ 22 июля 2010

Вы также можете объявить простую структуру для хранения двух значений, а затем передать указатель на экземпляр этой структуры.Таким образом, вы можете манипулировать обеими переменными, и они сохранят свои значения после возврата из функции.

struct loop_sum_struct {
    int loop_ctr;
    int sum;
} loop_sum;

loop_function(&loop_sum);

void loop_function(loop_sum_struct *s) {
    int len = 10;
    for(s->loop_ctr = 0; s->loop_ctr loop_ctr++) {
        s->sum += s->loop_ctr;
    }
}
0 голосов
/ 21 июля 2010

Как насчет этого?

Поскольку вы уже возвращаете int.Таким образом, другой способ - просто изменить подпись на

int loop_function (int sum)

и во время вызова

int sum = 0;

...

sum = loop_function (sum);

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...