Przekazywanie struktur przez wartość
Część sekcji Logika i sterowanie przepływem ścieżki C w Coddy. Lekcja 46 z 63.
Skoro wiesz już, jak pracować ze strukturami i wskaźnikami do struktur, czas nauczyć się przekazywać całe struktury do funkcji. Gdy przekazujesz strukturę do funkcji jako parametr, C stosuje przekazywanie przez wartość, co oznacza, że funkcja otrzymuje pełną kopię struktury.
Oto składnia funkcji, która przyjmuje parametr typu struct:
void functionName(struct StructureName parameterName) {
// Ciało funkcji
}Posługując się znaną nam strukturą Point jako przykładem:
void printPoint(struct Point p) {
printf("Point coordinates: (%d, %d)\n", p.x, p.y);
}Kluczową kwestią, którą należy zrozumieć, jest to, że wszelkie zmiany wprowadzone w strukturze wewnątrz funkcji nie wpłyną na oryginalną strukturę w funkcji wywołującej. Dzieje się tak, ponieważ funkcja pracuje na własnej kopii danych.
To podejście jest przydatne, gdy chcesz odczytywać lub wyświetlać dane struktury bez ryzyka przypadkowego zmodyfikowania oryginału. Pamiętaj jednak, że kopiowanie dużych struktur może być nieefektywne pod względem pamięci i wydajności.
Wyzwanie
ŁatwyUtwórz program w C, który demonstruje przekazywanie struktur do funkcji przez wartość. Twój program powinien:
- Zdefiniować
structo nazwieRectanglez następującymi składowymi:- Liczbę całkowitą
widthdo przechowywania szerokości prostokąta - Liczbę całkowitą
heightdo przechowywania wysokości prostokąta - Tablicę znaków
coloro rozmiarze 15 do przechowywania koloru prostokąta
- Liczbę całkowitą
- Napisać funkcję o nazwie
displayRectangle, która:- Przyjmuje strukturę
Rectanglejako parametr (przekazywanie przez wartość) - Wypisuje informacje o prostokącie w dokładnie takim formacie:
Rectangle Details:Width: [width]Height: [height]Color: [color]Area: [area]
- Oblicza i wypisuje pole (szerokość × wysokość)
- Przyjmuje strukturę
- Napisać funkcję o nazwie
modifyRectangle, która:- Przyjmuje strukturę
Rectanglejako parametr (przekazywanie przez wartość) - Podwaja szerokość i wysokość prostokąta
- Zmienia kolor na "Modified"
- Wypisuje
Inside modifyRectangle function: - Wywołuje
displayRectangle, aby wyświetlić zmodyfikowany prostokąt
- Przyjmuje strukturę
- W funkcji main:
- Utworzyć zmienną typu
Rectangleo nazwierect - Odczytać szerokość, wysokość i kolor z wejścia oraz przypisać je do składowych struktury
- Wypisać
Original rectangle: - Wywołać
displayRectangle, aby wyświetlić oryginalny prostokąt - Wywołać
modifyRectanglez prostokątem - Wypisać
After modifyRectangle call: - Ponownie wywołać
displayRectangle, aby pokazać, że oryginalny prostokąt pozostał bez zmian
- Utworzyć zmienną typu
To wyzwanie pokazuje kluczową koncepcję przekazywania struktur przez wartość: gdy przekazujesz strukturę do funkcji, funkcja otrzymuje jej pełną kopię. Wszelkie modyfikacje wprowadzone wewnątrz funkcji dotyczą wyłącznie kopii, a nie oryginalnej struktury w funkcji wywołującej.
Spróbuj swoich sił
#include <stdio.h>
#include <string.h>
// TODO: Zdefiniuj tutaj strukturę Rectangle
// TODO: Napisz tutaj funkcję displayRectangle
// TODO: Napisz tutaj funkcję modifyRectangle
int main() {
// Wczytaj dane wejściowe
int width, height;
char color[15];
scanf("%d", &width);
scanf("%d", &height);
scanf("%s", color);
// TODO: Utwórz zmienną typu Rectangle i przypisz jej wartości z danych wejściowych
// TODO: Wypisz "Original rectangle:" i wywołaj displayRectangle
// TODO: Wywołaj modifyRectangle
// TODO: Wypisz "After modifyRectangle call:" i ponownie wywołaj displayRectangle
return 0;
}Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.
Wszystkie lekcje w sekcji Logika i sterowanie przepływem
1Podstawy wskaźników
Czym jest wskaźnik?Deklarowanie wskaźnikówOperator pobrania adresu (&)Operator dereferencji (*)Wskaźniki NULLPodsumowanie: podstawy wskaźników4Projekt: Proste narzędzie tekstowe
Przegląd projektuLiczenie znaków2Wskaźniki i tablice
Nazwy tablic jako wskaźnikiElementy tablic — wskaźnikiArytmetyka wskaźnikówPorównywanie wskaźnikówPodsumowanie: przechodzenie po tablicy za pomocą wskaźników5Wskaźniki i funkcje
Przekazywanie przez wartośćPrzekazywanie wskaźników do funkcjiModyfikowanie zmiennych za pomocą wskaźnikówKlasyczny przykład: zamianaPrzekazywanie tablic do funkcjiPowtórka: argumenty wskaźnikowe funkcji8Struktury i wskaźniki
Wskaźniki do strukturOperator strzałki (->)Przekazywanie struktur przez wartośćPrzekazywanie wskaźników do strukturDynamiczna alokacja strukturPodsumowanie: modyfikowanie struktury — wskaźnik11Końcowe zadania powtórkowe
Powtórka: dynamiczne łączenie ciągów znakówPowtórka: tablica strukturPowtórka: licznik częstotliwości słów3Tablice znaków i ciągi znaków
Ciągi znaków jako tablice charZnak końca ciąguWczytywanie ciągu za pomocą scanfUżywanie strlen()Używanie strcpy()Używanie strcat()Używanie strcmp()Podsumowanie: podstawowe funkcje do obsługi ciągów znakówPoćwicz samodzielnie: Kompilator C online