Передача структур по значению
Часть раздела 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 может быть неэффективным с точки зрения памяти и производительности.
Задание
ЛегкоСоздайте программу на языке C, которая демонстрирует передачу структур в функции по значению. Ваша программа должна:
- Определить
structс именемRectangleсо следующими полями:- Целое число
widthдля хранения ширины прямоугольника - Целое число
heightдля хранения высоты прямоугольника - Символьный массив
colorразмером 15 для хранения цвета прямоугольника
- Целое число
- Написать функцию с именем
displayRectangle, которая:- Принимает структуру
Rectangleв качестве параметра (передача по значению) - Выводит информацию о прямоугольнике в точно таком же формате:
Rectangle Details:Width: [width]Height: [height]Color: [color]Area: [area]
- Вычисляет и выводит площадь (width × height)
- Принимает структуру
- Написать функцию с именем
modifyRectangle, которая:- Принимает структуру
Rectangleв качестве параметра (передача по значению) - Удваивает и ширину, и высоту прямоугольника
- Меняет цвет на "Modified"
- Выводит
Inside modifyRectangle function: - Вызывает
displayRectangle, чтобы показать измененный прямоугольник
- Принимает структуру
- В функции main:
- Создать переменную типа
Rectangleс именемrect - Считать ширину, высоту и цвет из входных данных и присвоить их полям структуры
- Вывести
Original rectangle: - Вызвать
displayRectangle, чтобы показать исходный прямоугольник - Вызвать
modifyRectangle, передав структуру - Вывести
After modifyRectangle call: - Снова вызвать
displayRectangle, чтобы показать, что исходный прямоугольник не изменился
- Создать переменную типа
Эта задача демонстрирует ключевую концепцию передачи структур по значению: когда вы передаете структуру в функцию, функция получает полную копию структуры. Любые изменения, внесенные внутри функции, влияют только на копию, а не на оригинальную структуру в вызывающей функции.
Попробуйте сами
#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;
}В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Logic & Flow
1Основы указателей
Что такое указатель?Объявление указателейОператор взятия адреса (&)Оператор разыменования (*)Указатели NULLИтоги: Основы указателей4Проект: Простая текстовая утилита
Обзор проектаПодсчет символов2Указатели и массивы
Имена массивов как указателиЭлементы массива — указателиАрифметика указателейСравнение указателейИтоги: Обход массива через указатели5Указатели и функции
Передача по значениюПередача указателей в функцииИзменение переменных через указателиКлассический пример: SwapПередача массивов в функцииИтоги: указатели как аргументы функций8Структуры и указатели
Указатели на структурыОператор «стрелка» (->)Передача структур по значениюПередача указателей на структурыДинамическое выделение памяти для структурИтоги: Изменение структур через указатели11Итоговые задачи на повторение
Повторение: динамическая конкатенация строкПовторение: массив структурПовторение: счетчик частоты слов3Символьные массивы и строки
Строки как массивы charНуль-терминаторВвод строк с помощью scanfИспользование strlen()Использование strcpy()Использование strcat()Использование strcmp()Итоги: основные строковые функции