Структуры и функции

Последнее обновление: 06.01.2023

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

Структура как параметр функции

При передаче структуры в качестве параметра получает копию значений структуры:

#include <stdio.h>
 
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 = {.name = "Tom", .age=38 };
    print_person(tom);
    return 0;
}

В данном случае функция print_person() принимает объект структуры person и выводит значения его элементов на консоль.

Чтобы не писать тип параметра полностью - struct person, можно определить псевдоним структуры:

#include <stdio.h>
 
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 = {.name = "Tom", .age=38 };
    print_person(tom);
    return 0;
}

Указатели на структуру как параметры

При использовании структур в качестве параметров в функции следует учитывать, что при вызове функции для структуры, также как и для параметров типа int или char, выделяется память, в которую помещаются значения элементов структуры. То есть структура в функцию передается по значению, а это значит, что переданную в функцию структуру мы изменить не можем.

Если необходимо уменьшить выделение памяти (особенно если структура большая) или иметь возможность изменять изначальную структуру в функции, то можно передавать в функцию указатель на структуру:

#include <stdio.h>
 
struct person
{
    char* name;
    int age;
};

void change_person(struct person * user)
{
    user->age = user->age + 1;
} 
int main(void)
{
    struct person bob = {"Bob", 22};
    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 <stdio.h>
 
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)
{
    struct person bob = create_person("Bob", 22);
    printf("Name: %s \n", bob.name);
    printf("Age: %d \n", bob.age);
    return 0;
}

Здесь функция create_person() создает на основании полученных параметров объект структуры person и возвращает его в качестве результата.

Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850