
Autor: 12.05.2023
Struktury w języku C
Struktury (Structs) to świetny sposób na grupowanie powiązanych ze sobą informacji. Jeśli w kodzie masz zestaw zmiennych przechowujących logicznie powiązane dane, to rozważ połączenie ich w jeden element - czyli Strukturę. W tym artykule poznasz najważniejsze techniki użycia Struktur w języku C.
Definicja prostej struktury
Od razu przejdziemy do prostego przykładu. Popatrz na kod:
#include
struct Car {
char *mark;
int productionYear
int maxSpeed;
};
int main() {
return 0;
}
Zwróć uwagę na słowo kluczowe struct. Nasze zmienne opisujące pojazd mechaniczny (czyli Car) powinny być objęte nawiasami klamrowymi a cała struktura powinna być zakończona średnikiem. We wnętrzu struktury znajdują się zmienne różnego typu: typy całkowite (int) oraz wskaźnik do char. To będzie taka bardzo podstawowa struktura, grupująca informacje na temat samochodu.
Dostęp do elementów struktury
Musisz sobie wyobrazić, że struktura to tak naprawdę nowy typ danych. W poniższym przykładzie pokażemy Ci jak definiować typy dla struktur oraz jak ustawiać elementy struktury:
#include
struct Car {
int productionYear;
int maxSpeed;
};
int main() {
struct Car audi;
audi.productionYear = 2017;
audi.maxSpeed = 200;
printf("audi production year: %d \n", audi.productionYear);
printf("audi max speed: %d \n", audi.maxSpeed);
return 0;
}
Efekt działania programu:
audi production year: 2017
audi max speed: 200
Przeanalizujmy co takiego wydarzyło się w funkcji main(). Na samym początku definiujemy zmienną audi, która jest typu struct Car. Mając zmienną audi możemy jej użyć do modyfikacji elementów struktury. Aby uzyskać dostęp do elementu struktury używamy operatora kropki:
audi.productionYear = 2017;
Czyli mamy taki prosty schemat:
[ nazwa zmiennej strukturalnej ] [ . ] [ nazwa pola struktury ] = [ wartość ] [ ; ]
Jak widzisz, nie ma tu nic trudnego. Struktura jest to po prostu zestaw powiązanych danych. Dostęp do pola w strukturze można uzyskać za pomocą kropki.
Struktury i funkcje
Teraz czas na bardziej złożoną technikę. Czasami zajdzie potrzeba przekazania struktury do funkcji. Przekazywanie struktury do funkcji polega na jej skopiowaniu i przekazaniu jej w formie argumentu. Oto fragment kodu:
#include
#include
struct Person {
char name[20];
int age;
};
void displayPerson(struct Person person) {
printf("Name: %s\n", person.name);
printf("Age: %d\n", person.age);
}
int main() {
struct Person p1;
strcpy(p1.name, "John");
p1.age = 30;
displayPerson(p1);
return 0;
}
W tym przykładzie struktura Person jest przekazywana do funkcji displayPerson() jako argument przez wartość, co oznacza, że jest kopiowana do lokalnej zmiennej person (parametr funkcji). W funkcji można odczytywać jej pola name i age posługując się operatorem “.”. Pamiętaj, że w przypadku dużych struktur, przekazywanie ich przez wartość może być nieefektywne pod względem zużycia pamięci i czasu. W takim przypadku najlepiej stosować wskaźniki.
Rezultat działania naszego programu jest następujący:
Name: John
Age: 30
Znasz już więc kolejną przydatną technikę pracy ze strukturami. Czas na następny przykład. Nasza poprzednia funkcja posiadała możliwość wypisywania informacji ze struktury. Oczywiście nic nie stoi na przeszkodzie, aby zwrócić strukturę z funkcji. Oto przykład, który prezentuje takie zachowanie:
#include
#include
struct Person {
char name[20];
int age;
};
struct Person updatePerson(struct Person person) {
strcpy(person.name, "Bob");
person.age = 30;
return person;
}
int main() {
struct Person p1;
strcpy(p1.name, "Alice");
p1.age = 25;
struct Person p2 = updatePerson(p1);
printf("Name: %s\n", p2.name);
printf("Age: %d\n", p2.age);
return 0;
}
W tym przykładzie funkcja updatePerson() przyjmuje strukturę Person jako argument person (przez wartość), dokonuje modyfikacji jej pól, a następnie zwraca zmodyfikowaną strukturę jako wartość zwracaną. W funkcji main() inicjalizujemy strukturę p1, a następnie wywołujemy funkcję updatePerson() przekazując p1 jako argument. Po wywołaniu funkcji odczytujemy pola zwróconej struktury p2 i wyświetlamy je na ekranie.
Rezultat jest następujący:
Name: Bob
Age: 30
Te przykłady dobrze ilustrują potencjał, który tkwi w użyciu struktur oraz funkcji. Jak widzisz, struktury mogą być przekazywane jako argument i mogą być też zwracane przez funkcję.
Struktury oraz wskaźniki
Wskaźniki to istotna część języka C. Można ich używać również do pracy ze strukturami. Popatrz na przykład:
#include
struct Point {
int x;
int y;
};
int main() {
struct Point point;
struct Point* pointer = &point;
pointer->x = 5;
pointer->y = 7;
printf("x = %d, y = %d \n", pointer->x, pointer->y);
return 0;
}
Rezultat działania programu jest następujący:
x = 5, y = 7
W powyższym kodzie mamy kluczowy zapis. Do wskaźnika pointer zostaje przypisany adres obiektu point:
struct Point* pointer = &point;
Po takim przypisaniu, posługując się wskaźnikiem pointer, możemy odwoływać się do pól struktury używając operatora “->”:
pointer->x = 5;
Podsumowanie
Za pomocą struktur możesz łatwo grupować powiązane dane. Można je przekazywać jako parametry do funkcji, można je zwracać z funkcji, można tworzyć wskaźniki do struktur i nie tylko. Dzięki strukturom możesz uzyskać czytelny i przejrzysty kod, w którym dane są logicznie ze sobą pogrupowane.
Jeśli chcesz dobrze opanować struktury i wiele innych, praktycznych technik pracy z językiem C, to rozpocznijŚcieżkę Kariery C Developer. Z tą ścieżką poznasz język C od postaw do poziomu średniozaawansowanego. Ścieżka kończy się Egzaminem, który uprawnia cię do posługiwania się Certyfikatem Specjalisty.