Перейти к содержимому

Как передать структуру в функцию c

  • автор:

Передача всей структуры в функцию

Когда структура используется как аргумент функции, передается вся структура с помощью стандартной передачи по значению. Это означает, что любые изменения, внесенные в содержимое структуры внутри функции, не повлияют на структуру, используемую в качестве аргумента.

Когда структура используется как параметр, самое важное — это запомнить, что тип аргумента должен соответствовать типу параметра. Лучший способ сделать это — определить структуру глобально, а затем использовать ее ярлык для объявления необходимых структурных переменных и параметров. Например:

/* объявление типа структуры */
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 ();
>

=================

Вот приблизительно такой код можно использовать для передачи динамической структуры в функцию.

  • Чтобы создать динамическую структуру нужно объявить её как указатель
  • Чтобы передать структуру в функцию, внутри функции достаточно указать принимаемый параметр как указатель на эту структуру.
  • Теперь при необходимости вызова функции, внутри скобок структуру достаточно указывать как обычную переменную.

В функцию я передавал два параметра. Счетчик цикла и структуру. Я полагаюсь на то что если вы дошли до структур, то знакомы с работой функций и подробного объяснения это тут не требует

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *