Хорошо, во-первых. Теперь с кодом, который находится сейчас, вы не сможете использовать int a
в любом месте, кроме функции main
, так как это локальная переменная для этой функции.
Либо передайте его как аргумент, либо объявите его глобальным (и extern, если на то пошло). В любом случае, я выбрал бы, чтобы передать его в качестве аргумента, если a
будет изменено функцией explore
, вы можете сделать 1 из 2 вещей:
int explore(int val)
{
//do stuff
return new_val;
}
//call:
a = explore(a);//assigns return int to a
Или, если Возвращаемый целочисленный сигнализирует о состоянии некоторых kind, передать указатель на a
. Это может быть, если вы новичок в указатели, кажется, как верный способ переусердствовать усложнять вещи, но это очень часто, и очень полезно (добавлено примечание о том, почему это полезно внизу):
int explore(int *val)
{
*val += 123;//add 123 to val's value
//this is NOT the same as val += 123, because that's shifting the pointer!
return 0;
}
//call:
int return_val = explore(&a);//pass &[address-of]a
Теперь, связывание двух исходных файлов легко, но вы говорите, что используете заголовочный файл, все хорошо и хорошо, но вы, кажется, не включаете его нигде, и не показываете, как оно выглядит. Я подозреваю, что у вас проблемы с компиляцией кода ... если да, покажите нам, что вы пробовали (как вы компилируете код), и какие ошибки вы получаете.
Если вам нужен простой пример того, как вручную связать 2 исходные файлы: Here's a previous answer of mine that shows, step by step, how to link 2 files
Почему указатели ?:
Много причин, на самом деле.Вот только некоторые из них: использование памяти
- предела: Если вы передаете большие структур по значению повсюду (то есть, копируя те же данные снова и снова), ваш код будет медленным, и вашим стек может быть загроможден с тем же значением. (переполнение стека, вызванное рекурсией)
- C может выделять кучную память, к которой можно обращаться только через указатели, вы не можете превратить переменную указателя в не указатель.
- Возвращаемые значения часто являются способами уведомления об ошибке, которая могла произойти.
Последний вопрос имеет решающее значение. Если вы пройдете a
до explore
для некоторого сложного вычисления, изменив значение a
по пути. Если, наполовину вниз функция, что-то идет грушевидно, как вы уведомляете вызывающего, что значение a
более не надежно? Простой:
int complex_function(int *val)
{
_Bool negative = *val > 0 ? false : true;
//do all sorts of magic stuff
//val wasn't negative, but is now, possible maxed int?
if (negative == false && *val < 0) return -1;//notify using -1
return 0;//usually, 0 means everything went well ok
}
//call like so:
if ((complex_function(&a)) != 0) exit(EXIT_FAILURE);//it's all gone wrong
//else, continue
Теперь вот где указатели очень полезны. Это не требует, чтобы вы возились со слишком многими временными переменными, создавая копии ценностей повсюду и сравнивая их, чтобы получить тот же вывод.
Являются ли эти действительно программы или просто два отдельных исходных файлов? – Bathsheba
Передать 'a' как параметр' исследовать'. Это ваша первая программа? – lurker