#c #function #struct
#c #функция #структура
Вопрос:
У меня есть пример фрагмента кода, и у меня возник вопрос по этому поводу. Вот код. Мои вопросы относятся к комментариям в нижней части кода, и мне было интересно, может ли кто-нибудь помочь. Здесь возникает путаница.
#include <stdio.h>
#include <string.h>
struct car {
char make[30];
char model[30];
int year;
};
struct car f(struct car c);
int main(void)
{
struct car c1 = {"Ford", "Mustang", 2014}, c2;
c2 = c1;
printf("%s, %s, %dn", c1.make, c1.model, c1.year);
c2 = f(c1);
printf("%s, %s, %dn", c2.make, c2.model, c2.year);
}
struct car f(struct car c) /* Is car here referring to the structure at the very top
of the program, so it knows what structure to put it? */
{
struct car temp = c; /* What exactly is c in this function and why copy it? */
strcpy(temp.model, "Explorer");
temp.year = 5;
return temp;
}
Код печатает:
Ford, Mustang, 2014
Ford, Explorer, 2019
Комментарии:
1.
struct car c
inf()
является копиейc1
изmain()
.c1
не изменяетсяf(c1)
.2. Спасибо. значит, c в функции f является c1 в виде строки? могу ли я просто распечатать это с помощью printf(«%s», c)??
3. Нет.
c
является копией структуры.c
это структура, а не строка.4.
struct car temp = c;
бессмысленно, вы могли бы просто поработать надc
в функции и вернутьc
5. передача структуры по значению — очень плохая идея, поскольку это приводит к постоянному выделению части оперативной памяти, достаточно большой, чтобы вместить структуру, и копированию структуры в нее. Гораздо лучше передать ptr в структуру, которая будет передана в стек
Ответ №1:
struct car
это тип, который определен в верхней части вашей программы. Итак, struct car f(struct car c)
это функция с именем f
, которая принимает struct car
named c
в качестве параметра и возвращает другое struct car
.
Причина создания копии c
заключается в том, что вы можете изменить одну из них, не затрагивая другую. Поскольку в данном случае вы передавали c
по значению, это не имеет особого значения; вы могли бы отредактировать c
, а затем вернуть его. Но если бы вы передали его по ссылке (т. Е. передали указатель на него), то его изменение изменило бы копию вызывающего объекта, что может быть не тем, что вы хотите.
Ответ №2:
При вызове f()
структура копируется, а затем передается в функцию. Любые изменения, внесенные в функцию, будут отброшены при выходе. Однако вы передаете структуру, которую затем сохраняете и печатаете. Итак, чтобы ответить на ваш вопрос, struct car
в функции является временной переменной, которая напрямую не ссылается ни на что внешнее по отношению к функции.
Если вы хотите напрямую изменить переменную вне функции, то вместо этого вам нужно будет передать указатель и разыменовать этот указатель внутри функции.
Ответ №3:
struct car f(struct car c) /*is car here refering to the structure at the very top
of the program, so it knows what structure to put it?/*
struct car
вот type 'struct car' defining X
. struct car
Вверху определяет глобальный тип struct car
. X
ссылается на функцию f
, которая обеспечивает возврат типа struct car
и c
аргумент, который ожидает ссылку на тип struct car
(независимо от того, какое имя у нее есть). Структура car вверху имеет глобальную область видимости, функция выше ожидает, что такой инструмент, как c1
или c2
, объявленный в main().