2010-07-21 3 views
4

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

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

+0

Это C или C++? – Nikko

+0

Он должен быть чистым C. – Markus

+0

Нет ничего, что указывало бы, что это дистанционно связано с C++, поэтому я удалил тег C++. –

ответ

9

Написать

*sum += j; 

Что вы делаете увеличивающиеся указатель (возможно, не то, что вы хотели)

+0

Также должен быть объявлен «j». – onurbaysan

3

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

*sum += j; 

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

17

То, что вы правильно для этой линии, за исключением:

sum += j; 

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

*sum += j; 

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

+0

+1, да, должно быть определено j j. –

2

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

 *sum += j

-1

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

Как вы уже возвращаете int. Таким образом, еще один способ, чтобы просто изменить подпись

Int loop_function (интермедиат сумма)

и в момент вызова

INT сумма = 0;

...

sum = loop_function (sum);

+0

ОП пытается вернуть две вещи из одной функции: счетчик циклов и сумму. В C это обычно означает передачу указателя и изменение того, на что он указывает. –

+0

Ах, правда! Я просто посмотрел на определение только в OP, который нигде не сохраняет возвращаемое значение, но теперь я вижу вашу точку. Благодаря ! – DeltaRogue

1

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

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

0

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

 
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; 
    } 
}