Передача всей структуры в функцию
Когда структура используется как аргумент функции, передается вся структура с помощью стандартной передачи по значению. Это означает, что любые изменения, внесенные в содержимое структуры внутри функции, не повлияют на структуру, используемую в качестве аргумента.
Когда структура используется как параметр, самое важное — это запомнить, что тип аргумента должен соответствовать типу параметра. Лучший способ сделать это — определить структуру глобально, а затем использовать ее ярлык для объявления необходимых структурных переменных и параметров. Например:
/* объявление типа структуры */
struct struct_type int a, b;
char ch;
>;
void f1(struct struct_type parm);
int main(void)
struct struct_type arg; /* объявление arg */
arg.a = 1000;
f1(arg);
return 0;
>
void f1(struct struct_type parm) printf(«%d», parm.a);
>
Данная программа выводит число 1000 на экран. Можно видеть, что как arg, так и parm объявлены как структуры типа struct_type.
Как передать структуру в функцию c
Как и любой другой объект, структура может использоваться в качестве параметра функции и также может быть возвращаемым объектом функции.
Структура как параметр функции
При передаче структуры в качестве параметра получает копию значений структуры:
#include struct person < char* name; int age; >; void print_person(struct person user) < printf("Name: %s \n", user.name); printf("Age: %d \n", user.age); >int main(void) < struct person tom = ; print_person(tom); return 0; >
В данном случае функция print_person() принимает объект структуры person и выводит значения его элементов на консоль.
Чтобы не писать тип параметра полностью — struct person , можно определить псевдоним структуры:
#include typedef struct < char* name; int age; >person; void print_person(person user) < printf("Name: %s \n", user.name); printf("Age: %d \n", user.age); >int main(void) < person tom = ; print_person(tom); return 0; >
Указатели на структуру как параметры
При использовании структур в качестве параметров в функции следует учитывать, что при вызове функции для структуры, также как и для параметров типа int или char, выделяется память, в которую помещаются значения элементов структуры. То есть структура в функцию передается по значению, а это значит, что переданную в функцию структуру мы изменить не можем.
Если необходимо уменьшить выделение памяти (особенно если структура большая) или иметь возможность изменять изначальную структуру в функции, то можно передавать в функцию указатель на структуру:
#include struct person < char* name; int age; >; void change_person(struct person * user) < user->age = user->age + 1; > int main(void) < struct person bob = ; printf("Before change. %s : %d \n", bob.name, bob.age); change_person(&bob); printf("After change. %s : %d \n", bob.name, bob.age); return 0; >
В этом примере функция change_person принимает указатель на структуру person и увеличивает на единицу значение элемента age.
Для проверки в функции main выводим данные объекта person на консоль до и после вызова функции change_person.
Before change. Bob : 22 After change. Bob : 23
Структура как результат функции
Также функция может возвращать объект структуры:
#include struct person < char* name; int age; >; struct person create_person(char* name, int age) < struct person user; user.name = name; user.age = age; return user; >int main(void)
Здесь функция create_person() создает на основании полученных параметров объект структуры person и возвращает его в качестве результата.
Передача членов структур в функции
При передаче членов структур в функции фактически передается значение члена. Следовательно, передается обычная переменная. Рассмотрим для примера следующую структуру:
struct fred char x;
int y;
float z;
char s[10];
> mike;
Ниже приведены примеры передачи каждого члена в функцию:
func(mike.х); /* передача символьного значения х */
func2(mike.у); /* передача целочисленного значения у */
func3(mike.z); /* передача вещественного значения z */
func4(mike.s); /* передача адреса строки s */
func(mike.s[2]); /* передача символьного значения s [2] */
Тем не менее, если необходимо передать адрес отдельного члена структуры, следует поместить оператор & перед именем структуры. Например, для передачи адреса элементов структуры mike следует написать:
func(&mxke.x) ; /* передача адреса символа x */
func2(&mike.у); /* передача адреса целого у */
func3(&mike.z); /* передача адреса вещественного z */
func4(mike.s) ; /* передача адреса строки s */
func(&mike.s [2]); /* передача адреса символа s[2] */
Обратим внимание, что оператор & стоит перед именем структуры, а не перед именем члена. Помимо этого, массив s сам по себе является адресом, поэтому не требуется оператора &. Тем не менее, когда осуществляется доступ к отдельному символу строки s, как показано в последнем примере, оператор & необходим.
Структуры. Передать динамическую структуру в функцию
Я заметил нехорошую тенденцию. Есть материалы, которые я схватываю быстро и легко, но я как-то начинаю пропускать эти моменты и не описывать читателю. Это не радует. Один из таких моментов: Передача динамической структуры в функцию. Динамическая структура – это такая структура, размер которой заранее не известен и в зависимости от работы программы под структуру выделяется указанный размер памяти . Во время написания ваших первых программ ваш код будет увеличиваться в размерах и если все городить в один огород, то самому быстро станет ничего непонятно. Чтобы как-то разбить весь код на разные удобочитаемые участки используют функции. Вот и может встать вопрос у незнающего: “А как передать динамическую структуру в функцию”
В принципе структуры – это почти классы и все что есть у классов, все есть у структур. Но есть такие пользователи, которые классов побаиваются.
Код С++ Передача динамической структуры в функцию
=====================
#include
#include
int n ; //Переменная для числа элементов структуры
//Некоторая структура
struct MyStruct
char Name [ 20 ];
int age ;
>;
//Чтоб под объекты структуры можно было выделить память, указываем их как указатели
MyStruct * X ; //Указатель X на структуру MyStruct
/*ФУНКЦИЯ ВВОДА ЭЛЕМЕНТОВ В ДИНАМИЧЕСКУЮ СТРУКТУРУ*/
void input (int i , MyStruct * X )
cout cin . getline ( X [ i ]. Name , 20 ); //Записываем данные в структуру
cout cin >> X [ i ]. age ; //Записываем данные в структуру
cin . ignore ();
cout >
/*ФУНКЦИЯ ВЫВОДА СТРУКТУРЫ НА ЭКРАН*/
void output (int i , MyStruct * X )
cout //Выводим все поля структуры X
>
//===============
void main ()
system ( “CLS” ); //Очистка экрана
cout > n ; //Вводим число структур
X =new MyStruct [ n ]; //Выделяем память под указанное число структур
for (int i = 0 ; i < n ; i ++) input ( i , X ); С помощью цикла заполняем структуру
for ( i = 0 ; i < n ; i ++) output ( i , X ); С помощью цикла выводим поля структуры на экран
delete [] X ; //Освобождаем память
cin . get ();
>
=================
Вот приблизительно такой код можно использовать для передачи динамической структуры в функцию.
- Чтобы создать динамическую структуру нужно объявить её как указатель
- Чтобы передать структуру в функцию, внутри функции достаточно указать принимаемый параметр как указатель на эту структуру.
- Теперь при необходимости вызова функции, внутри скобок структуру достаточно указывать как обычную переменную.
В функцию я передавал два параметра. Счетчик цикла и структуру. Я полагаюсь на то что если вы дошли до структур, то знакомы с работой функций и подробного объяснения это тут не требует