Для getContactInfo
необходимо передать указатель на структуру:
void getContactInfo( struct ContactInfo *gcptr )
{
printf("First Name: ");
scanf("%s", gcptr->fname);
printf("\nLast Name: ");
scanf("%s", gcptr->lname);
}
Поскольку вы пытаетесь изменить содержимое gc
, вам нужно передать указатель на него в функцию. Помните, что C передает все аргументы по значению, поэтому вызываемая функция создает отдельный дубликат объекта, который получает значение параметра. Ваш код модифицирует этот дубликат объекта, который не влияет на фактический параметр.
Оператор ->
используется, когда операндом является указатель на тип struct
или union
- он неявно разыменовывает указатель перед доступом к конкретному члену. Это эквивалентно написанию (*gcptr).fname
и (*gcptr).lname
, хотя и немного проще для глаз.
Вы бы назвали эту функцию как
getContactInfo( &gc );
Для showContactInfo
вы можете оставить все как есть, поскольку вы не пытаетесь изменить параметр. Однако многим людям нравится передавать указатели на struct
s для экономии памяти (вы не создаете копию struct
в вызываемой функции). Если вы хотите использовать указатель, я бы рекомендовал использовать ключевое слово const
, например:
void showContactInfo( const struct ContactInfo *gcptr )
{
printf("* First Name: %s \n", gcptr->fname);
printf("* Last Name: %s \n", gcptr->lname);
}
Ключевое слово const
указывает компилятору на меня кричать, если я пытаюсь изменить содержимое объекта, на который указывает gcptr
в функции showContactInfo
. Как и getContactInfo
выше, вы бы назвали его
showContactInfo( &gc );
Обратите внимание, что я изменил имена аргументов на gcptr
только для того, чтобы отличить формальный аргумент в определении функции от фактического аргумента в вызове функции. Обычно я не люблю помещать какую-либо информацию о типе в имя переменной или аргумента, но вы можете использовать любое соглашение о присвоении имен, которое вам нравится.