Я предпочитаю объявлять все мои переменные как указатели, как во втором, но я вижу первое намного чаще.
Это утверждение не имеет большого смысла -конечно, не все , с которым вы работаете, является указателем.
Код
int *num;
*num = 5;
foo( num );
имеет неправильную форму, поскольку num
ни на что не указывает (его значение равно неопределенное ).Вы пытаетесь присвоить 5
некоторому случайному адресу памяти, который может привести к segfault или повреждению других данных.Он может работать так, как задумано, без явных проблем, но это случайно, а не дизайн.
Тот факт, что функция принимает указатель в качестве параметра, не означает, что вы должны передать объект указателя в качестве этого параметра.Да, вы могли бы написать что-то вроде
int num;
int *numptr = #
*numptr = 5;
foo( numptr )
, но это ничего не изменит с вашей простотой:
int num = 5;
foo( &num );
C требует нам нужно использовать указатели в 2 случаях:
- когда функция должна обновить один из своих входных параметров;
- когда нам нужно отслеживать динамически выделенную память;
Они также пригодятся для построения динамических структур данных, таких как списки, очереди, деревья и т. Д. Но вы не должны использовать их для всего .