Wstęp

Wstęp

Będziemy kontynuować tę część naszego samouczka ze złożonymi typami danych w C i porozmawiamy o strukturach. Wiele nowoczesnych języków programowania oferuje je, taki czy inny kształt, podobnie jak c. Jak zobaczysz później, struktury pozwalają łatwiej manipulować danymi, umożliwiając przechowywanie różnych zmiennych (być może) różnych typów pod jednym „dachem”.

Struktury początkowe

Chociaż chciałem odłożyć część definicji tego sub-komaptera, wygląda na to, że nie mogłem się doczekać i uwzględnić ją we wstępie. Tak, ludzie, to właśnie jest struktura, a w kaprysu zobaczysz, jak przydatne jest, kiedy pokażę ci kilka przykładów. Jedna interesująca paralela jest ta, która odnosi się do tabeli bazy danych: jeśli masz tabelę o nazwie Users (unikalna nazwa), wówczas umieścisz tę tabelę dokładne dane, które dotyczą bezpośrednio użytkowników: wiek, płeć, nazwa, adres, adres, i tak dalej. Ale to różne typy! Nie ma problemu, możesz to zrobić za pomocą stołu, tak jak możesz to zrobić ze strukturą: wiek będzie liczbą całkowitą, płeć będzie charakterem, nazwa będzie ciągiem i tak dalej. Wtedy będziesz mógł uzyskać dostęp do członkowie tabeli łatwo, odnosząc się do nazwy tabeli/członka. Ale to nie jest kurs bazy danych, więc przejdźmy dalej. Ale wcześniej przyjrzyjmy się logicznym aspekcie: jesteś zaproszony do tworzenia struktur z członkami, którzy mają coś wspólnego z logicznego punktu widzenia, jak powyższy przykład. Ułatwiaj ci i ludziom, którzy później spojrzą na Twój kod. Zobaczmy więc, w jaki sposób tabela baz danych naszych użytkowników przetłumaczyłaby się w strukturze C:

struct użytkownicy int wiek; Char Gender; nazwa char *; Adres char *; ; 

Na końcu nie zapomnij o półkolisku. Ok, więc chwaliłem się, że członkowie struktury są proste w dostępie. Oto jak, pod warunkiem, że chcesz uzyskać dostęp do wieku użytkownika:

printf („Wiek użytkownika to %d.\ n ”, użytkownicy.wiek); 

Ale aby ten druk działał, będziemy musieli najpierw zdefiniować wiek. Można to zrobić w ten sposób

struct użytkownicy int wiek;… usrs; USRS.Wiek = 25;… 

To, co tutaj zrobiliśmy instancja struktury (możesz mieć tyle instancji, ile chcesz), o nazwie „USRS”. Możesz mieć na wszystkich z nich USRS1, USRS2, USRS3 itd. Drugim sposobem na to jest ogłoszenie struktury, tak jak to zrobiliśmy po raz pierwszy (e.G. bez instancji), a następnie zadeklaruj odpowiednie instancje później w kodzie:

struct Użytkownicy USRS1, USRS2, USRS3; 

… A potem zadbaj o wiek, płeć, adres i tak dalej.

Kiedy mówimy o strukturach w połączeniu z funkcjami, najważniejszą rzeczą do rozmowy jest prawdopodobnie fakt, że struktury są uważane za całość, a nie związek wykonany z kilku elementów. Oto przykład:

void show_age (usrs i) printf („Wiek użytkownika to %d.\ n ", i.wiek); printf („Nazwa użytkownika to %s.\ n ", (& i)-> nazwa); 

To, co robi ta funkcja: wymaga argumentu numerycznego i drukuje wszystkich użytkowników, którzy mają ten konkretny wiek. Być może zauważyłeś nowego operatora w powyższym kodzie (jeśli nie, spójrz ponownie). Operator „->” robi dokładnie to, co robi operator kropki, umożliwiając dostęp do członka struktury, ze specyfikacją, że jest on używany, gdy zaangażowane są wskaźniki, podobnie jak operator kropki jest używany w przypadkach, gdy wskaźniki nie są zaangażowane. Jedna ważna uwaga tutaj. Biorąc pod uwagę następujący kod:

struct myStruct int myint; Char *MyString;  *P; 

Jak myślisz, co zrobi następujące wyrażenie?

++p-> myint; 

Zaawansowane tematy

Jedną z rzeczy, które często widzisz w związku ze strukturami, ale nie tylko, jest to typedef Słowo kluczowe. Jak sama nazwa wskazuje, umożliwia zdefiniowanie niestandardowych danych, jak w poniższych przykładach:

typedef długość; / * Teraz długość jest synonimem int */ typedef Char * String; 

Jeśli chodzi o struktury, typedef zasadniczo eliminuje potrzebę użycia słowa „s”. Oto struktura zadeklarowana w ten sposób:

typedef struct koledzy int wiek; Char Gender;… Colls; 

W naszym następnym temacie weźmiemy pomysł znaleziony w K&R i użyjemy go do zilustrowania naszego punktu. Dlaczego? Jest dobrze przemyślany i pokazuje bardzo dobrze i w prosty sposób, co zamierzamy zilustrować. Ale zanim zaczniemy, oto pytanie: wiedząc, że C pozwala na zagnieżdżone struktury, czy uważasz, że zagnieżdżone struktury za pomocą typedef można zaakceptować? Dlaczego?

Oto następny temat: tablice struktury. Teraz, gdy wiesz, jakie są tablice, możesz łatwo odgadnąć, o co chodzi. Pozostają jednak niektóre pytania: jak wdrożyć koncepcję, a co ważniejsze, jakie może być użycie? Przykład, o którym rozmawialiśmy, wkrótce rzuci trochę światła na obie sprawy. Załóżmy, że masz program napisany w C, i chcesz policzyć liczbę wystąpień wszystkich słów kluczowych, które określa standard. Potrzebujemy dwóch tablic: jedna do przechowywania słów kluczowych, a druga do przechowywania liczby zdarzeń odpowiadających każdego słowa kluczowego. Ta implementacja może być napisana jako taka:

char *słowa kluczowe [nrkeywords]; Int wyniki [nrkeywords]; 

Patrząc na koncepcję, wkrótce zobaczysz, że wykorzystuje on koncepcję par, która jest bardziej efektywnie opisana za pomocą struktury. Tak więc, z powodu efektu końcowego, będziemy mieli tablicę, której każdy element jest strukturą. Zobaczmy.

struct słowo kluczowe char *słowa kluczowe; wyniki int;  keyWtdtbl [nrkeywords]; 

Teraz zainicjujmy tablicę słowami kluczowymi i początkową liczbą wystąpień, które oczywiście wyniesie 0.

struct słowo kluczowe char *słowa kluczowe; wyniki int;  keyWtdtbl [] = „auto”, 0, „break”, 0, „case”, 0,… „While”, 0; 

Twoim następnym i ostatnim zadaniem, ponieważ to zadanie jest nieco bardziej złożone, jest napisanie pełnego programu, który bierze się jako tekst do pracy i wydrukowanie liczby wydarzeń każdego słowa kluczowego, zgodnie z powyższą metodą.

Ostatnim przedmiotem struktur, z którymi będę się poradzić. Jeśli napisałeś program w ostatnim ćwiczeniu, być może masz już całkiem niezły pomysł, w jaki sposób można go ponownie napisać, aby zamiast tego mógł używać wskazówek w indeksach. Więc jeśli lubisz pisać kod, możesz uznać to za opcjonalne ćwiczenie. Więc nie ma tu nic wiele, tylko kilka aspektów, takich jak (bardzo ważne), musisz wprowadzić dodatkowy kod z dodatkową ostrożnością, aby podczas analizowania kodu źródłowego pliku, które skanujesz dla słów kluczowych i oczywiście funkcję wyszukiwania Musi zostać zmodyfikowany, nie utworzysz ani nie natkniesz się na nielegalny wskaźnik. Zobacz poprzednią część, aby zapoznać się z arytmetyką wskaźnika i różnic między używaniem tablic a użyciem wskaźników. Kolejnym problemem, z którym należy zachować ostrożność, jest rozmiar struktur. Nie daj się zwieść: może istnieć tylko jeden sposób, aby uzyskać drogę struktury, a to znaczy za pomocą sizeof ().

#włączać  struct test int one; int dwa; char *str; float flt; ; int main () printf („Rozmiar struktury to %d.\N", rozmiar(struct test)); powrót 0;  

Powinno to powrócić 24, ale nie jest to gwarantowane, a K&R wyjaśnia to z powodu różnych wymagań dotyczących wyrównania. Polecam używanie sizeof, gdy masz wątpliwości i nic nie zakładam.

Związki

Powinienem był zmienić tytuł i dołączyć słowo „związki”, a może nawet „Bitfields”. Ale ze względu na znaczenie i ogólny wzór wykorzystania struktur w porównaniu z związkami i pola bitowym, zwłaszcza teraz, że sprzęt staje się tańszym towarem (niekoniecznie zdrowym myśleniem, ale i tak), wydaje mi się, że tytuł powie tylko „struktury”. Więc co to jest związek? Związek przypomina wiele struktury, to różni się sposób, w jaki kompilator radzi sobie z pamięcią (pamięcią). Krótko mówiąc, związek jest złożonym typem danych, który może przechowywać różne typy danych, ale Jeden członek na raz. Niezależnie od tego, jak duża będzie przechowywana zmienna, będzie miała swoje miejsce, ale inne nie będą dozwolone w związku. Stąd nazwa „Union”. Deklaracje i definicje związków są takie same jak struktury i gwarantuje, że związek przyjmie tyle samo pamięci, co „największy członek.

Bitfields

Jeśli chcesz użyć C w programowaniu systemów wbudowanych i/lub rzeczy na niskim poziomie to Twoja gra, ta część będzie atrakcyjna. Bitfield (niektóre piszą pola bitowe), nie ma słowa kluczowego, takiego jak enum lub union, i wymaga znaczenia swojego komputera. Pozwala przejść poza liczebne ograniczenia oparte na słowach inne języki ograniczają. Pozwala to również, a może to być formalna definicja „pakuj” więcej niż jeden obiekt w jednym słowie.

Enums

Na początek od krótkiego faktu historycznego, enums zostały wprowadzone w C, kiedy C89 wyszedł za drzwi, co oznacza, że ​​K&R brakowało tego typu. Enum pozwala programistowi utworzyć zestaw nazwanych wartości, znany również jako wyliczający, które mają ich główną cechę, że mają z nimi powiązaną wartość liczbową, albo pośrednio (0,1,2…) lub jawnie przez programista ( 1,2,4,8,16…) . To ułatwia unikanie magicznych liczb.

enum Ciśnienie pres_low, pres_medium, pres_high; enum Ciśnienie p = pres_high; 

Teraz jest to łatwiejsze, jeśli potrzebujemy pres_low, aby mieć 0, średni 1 i tak dalej, i nie będziesz musiał używać do tego #Defines. Polecam trochę czytania, jeśli jesteś zainteresowany.

Wniosek

Chociaż informacje mogą wydawać się nieco bardziej skondensowane niż wcześniej, nie martw się. Pojęcia są stosunkowo łatwe do zrozumienia, a trochę ćwiczeń będzie działać cuda. Czekamy na Ciebie na naszych forach Linux na dalszą dyskusję.

Wszystkie artykuły z tej serii:

  • I. C Opracowanie w Linux - Wprowadzenie
  • Ii. Porównanie C i innych języków programowania
  • Iii. Typy, operatorzy, zmienne
  • Iv. Kontrola przepływu
  • V. Funkcje
  • Vi. Wskaźniki i tablice
  • VII. Struktury
  • VIII. Podstawowe I/O
  • IX. Styl kodowania i zalecenia
  • X. Budowanie programu
  • Xi. Opakowanie dla Debiana i Fedory
  • XII. Uzyskanie pakietu w oficjalnych repozytoriach Debiana

Powiązane samouczki Linux:

  • Rzeczy do zainstalowania na Ubuntu 20.04
  • Wprowadzenie do automatyzacji, narzędzi i technik Linuksa
  • Rzeczy do zrobienia po zainstalowaniu Ubuntu 20.04 Focal Fossa Linux
  • Ubuntu 20.04 sztuczki i rzeczy, których możesz nie wiedzieć
  • Mastering Bash Script Loops
  • Zagnieżdżone pętle w skryptach Bash
  • Rzeczy do zainstalowania na Ubuntu 22.04
  • Mint 20: Lepsze niż Ubuntu i Microsoft Windows?
  • Jak podwójnie rozruch Kali Linux i Windows 10
  • Big Data Manipulacja dla zabawy i zysku Część 1