Menu
Coddy logo textTech

Передача структур по значению

Часть раздела Logic & Flow путешествия по C на Coddy — урок 46 из 63.

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

Вот синтаксис функции, которая принимает структуру в качестве параметра:

void functionName(struct StructureName parameterName) {
    // Тело функции
}

Используя нашу знакомую структуру Point в качестве примера:

void printPoint(struct Point p) {
    printf("Point coordinates: (%d, %d)\n", p.x, p.y);
}

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

Этот подход полезен, когда вы хотите прочитать или отобразить данные struct без риска случайного изменения оригинала. Однако имейте в виду, что копирование больших struct может быть неэффективным с точки зрения памяти и производительности.

challenge icon

Задание

Легко

Создайте программу на языке C, которая демонстрирует передачу структур в функции по значению. Ваша программа должна:

  1. Определить struct с именем Rectangle со следующими полями:
    • Целое число width для хранения ширины прямоугольника
    • Целое число height для хранения высоты прямоугольника
    • Символьный массив color размером 15 для хранения цвета прямоугольника
  2. Написать функцию с именем displayRectangle, которая:
    • Принимает структуру Rectangle в качестве параметра (передача по значению)
    • Выводит информацию о прямоугольнике в точно таком же формате:
      • Rectangle Details:
      • Width: [width]
      • Height: [height]
      • Color: [color]
      • Area: [area]
    • Вычисляет и выводит площадь (width × height)
  3. Написать функцию с именем modifyRectangle, которая:
    • Принимает структуру Rectangle в качестве параметра (передача по значению)
    • Удваивает и ширину, и высоту прямоугольника
    • Меняет цвет на "Modified"
    • Выводит Inside modifyRectangle function:
    • Вызывает displayRectangle, чтобы показать измененный прямоугольник
  4. В функции main:
    • Создать переменную типа Rectangle с именем rect
    • Считать ширину, высоту и цвет из входных данных и присвоить их полям структуры
    • Вывести Original rectangle:
    • Вызвать displayRectangle, чтобы показать исходный прямоугольник
    • Вызвать modifyRectangle, передав структуру
    • Вывести After modifyRectangle call:
    • Снова вызвать displayRectangle, чтобы показать, что исходный прямоугольник не изменился

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

Шпаргалка

При передаче структур в функции C использует передачу по значению, что означает, что функция получает полную копию структуры.

Синтаксис функции для принятия параметра-структуры:

void functionName(struct StructureName parameterName) {
    // Тело функции
}

Пример со структурой Point:

void printPoint(struct Point p) {
    printf("Point coordinates: (%d, %d)\n", p.x, p.y);
}

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

Этот подход полезен для чтения или отображения данных структуры без риска изменения оригинала, но копирование больших структур может быть неэффективным.

Попробуйте сами

#include <stdio.h>
#include <string.h>

// TODO: Определите структуру Rectangle здесь

// TODO: Напишите функцию displayRectangle здесь

// TODO: Напишите функцию modifyRectangle здесь

int main() {
    // Считать входные данные
    int width, height;
    char color[15];
    
    scanf("%d", &width);
    scanf("%d", &height);
    scanf("%s", color);
    
    // TODO: Создайте переменную Rectangle и присвойте ей входные значения
    
    // TODO: Выведите "Original rectangle:" и вызовите displayRectangle
    
    // TODO: Вызовите modifyRectangle
    
    // TODO: Выведите "After modifyRectangle call:" и снова вызовите displayRectangle
    
    return 0;
}
quiz iconПроверьте себя

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

Все уроки раздела Logic & Flow