Передача структур по значению
Часть раздела 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, чтобы показать, что исходный прямоугольник не изменился
- Создать переменную типа
Эта задача демонстрирует ключевую концепцию передачи структур по значению: когда вы передаете структуру в функцию, функция получает полную копию структуры. Любые изменения, внесенные внутри функции, влияют только на копию, а не на оригинальную структуру в вызывающей функции.
Шпаргалка
При передаче структур в функции 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;
}В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Logic & Flow
1Основы указателей
Что такое указатель?Объявление указателейОператор взятия адреса (&)Оператор разыменования (*)Указатели NULLИтоги: Основы указателей4Проект: Простая текстовая утилита
Обзор проектаПодсчет символов2Указатели и массивы
Имена массивов как указателиЭлементы массива — указателиАрифметика указателейСравнение указателейИтоги: Обход массива через указатели5Указатели и функции
Передача по значениюПередача указателей в функцииИзменение переменных через указателиКлассический пример: SwapПередача массивов в функцииИтоги: указатели как аргументы функций8Структуры и указатели
Указатели на структурыОператор «стрелка» (->)Передача структур по значениюПередача указателей на структурыДинамическое выделение памяти для структурИтоги: Изменение структур через указатели11Итоговые задачи на повторение
Повторение: динамическая конкатенация строкПовторение: массив структурПовторение: счетчик частоты слов3Символьные массивы и строки
Строки как массивы charНуль-терминаторВвод строк с помощью scanfИспользование strlen()Использование strcpy()Использование strcat()Использование strcmp()Итоги: основные строковые функции