Dokumentacja C
Zwięzła dokumentacja C oparta na przykładach. Przeczytaj o zagadnieniu, zobacz kod i przećwicz go na ścieżce Coddy.
Zacznij ścieżkę C z przewodnikiemGetting Started
- Czym jest CC to mały, szybki, kompilowany język z 1972 roku, na którym wciąż działają systemy operacyjne, bazy danych i niemal każde urządzenie wbudowane. Zobacz, czym jest, gdzie działa i dlaczego warto się go uczyć w 2026 roku.
- Instalacja C (GCC)Zainstaluj działający kompilator C w dowolnym systemie: MinGW-w64 na Windows, clang od Apple na macOS i gcc na Linuksie, a potem sprawdź instalację i skompiluj pierwszy plik.
- Kompilacja i uruchamianieZamień plik .c w działający program: polecenie gcc, co naprawdę robią preprocesowanie, kompilacja i linkowanie, flagi, których warto używać od pierwszego dnia, i jak czytać błędy, gdy coś pójdzie nie tak.
- Składnia CKażdy program w C ma ten sam szkielet: dyrektywy include, funkcję main, instrukcje zakończone średnikiem i bloki w nawiasach klamrowych. Oto, co robi każda część i jakie reguły kompilator naprawdę egzekwuje.
- KomentarzeC ma dwa style komentarzy (jednoliniowe // i wieloliniowe /* */) o różnej historii i z jedną pułapką zagnieżdżania. Zobacz, jak używać obu i co warto komentować, a czego nie.
Variables & Types
- ZmienneJak zadeklarować zmienną w C, czym deklaracja różni się od inicjalizacji, zasady nazewnictwa, deklarowanie kilku zmiennych naraz i dlaczego niezainicjowana zmienna to najczęstszy błąd początkujących.
- Typy danychKażda zmienna w C ma typ, który ustala jej rozmiar i to, co może przechowywać. Oto wszystkie podstawowe typy, ich rzeczywiste rozmiary, typy ze znakiem i bez znaku, sizeof, limits.h i to, co dzieje się przy przepełnieniu.
- StałeTrzy sposoby na nazwanie wartości, która w C nigdy się nie zmienia: słowo kluczowe const, makra #define i stałe enum. Czym każdy z nich naprawdę jest i po który sięgać w danej sytuacji.
- OperatoryWszystkie operatory C, które warto znać: arytmetyczne, przypisania, porównania, logiczne i inkrementacji, a do tego pułapka dzielenia całkowitego, zachowanie modulo dla liczb ujemnych i tabela priorytetów, której można ufać.
- Wartości logiczneC nie miało typu logicznego aż do C99. Zero to fałsz, wszystko inne to prawda, porównania zwracają int, a stdbool.h dokłada bool, true i false. Do tego klasyczny błąd = zamiast ==, na który ten projekt pozwala.
- Rzutowanie typówC bez przerwy konwertuje wartości między typami: czasem dlatego, że prosisz o to rzutowaniem, a częściej samo z siebie. Oto zasady promocji, składnia jawnego rzutowania i konwersje, które po cichu gubią dane.
Control Flow
- if / elseJak C podejmuje decyzje: instrukcja if, else, łańcuchy else if, zagnieżdżanie i operator trójargumentowy, a do tego reguła prawdziwości (0 to fałsz, wszystko inne to prawda) i błąd `=` zamiast `==`, który po cichu psuje warunki.
- switchJak instrukcja switch w C wybiera jedną gałąź z listy stałych: etykiety case, dlaczego break ma znaczenie, celowe i przypadkowe przechodzenie dalej (fall-through), default, switch na znakach i enumach oraz kiedy switch wygrywa z łańcuchem else if.
- Pętla forJak powtarzać kod pętlą for w C: trzyczęściowy nagłówek, liczenie w górę i w dół, przechodzenie po tablicach z trikiem sizeof, pętle zagnieżdżone, pętle nieskończone oraz błędy o jeden i błędy z typami bez znaku, na które trafia każdy.
- Pętla whileJak pętla while w C powtarza kod, dopóki warunek się nie zmieni: zasada sprawdzania warunku na początku, pętle z wartownikiem, czytanie wejścia do EOF, while(1) i zamiana między for a while.
- Pętla do-whilePętla w C, która najpierw wykonuje ciało: jak do-while gwarantuje jeden obieg przed sprawdzeniem warunku, dlaczego kończy się średnikiem, wzorce menu i ponawiania, do których ją stworzono, i czym różni się od zwykłej pętli while.
- break i continuebreak opuszcza pętlę albo switch; continue przechodzi do następnego obiegu. Jak każde z nich zachowuje się w for, while i do-while, jak wyjść z zagnieżdżonych pętli za pomocą flagi albo goto i jakie nadużycia sprawiają, że pętle stają się trudne do śledzenia.
Functions
- FunkcjeJak definiować i wywoływać funkcje w C: typ zwracany, parametry, wartości zwracane, funkcje void, dlaczego podział na funkcje ma znaczenie i pełny przykład zbudowany z małych, nazwanych kawałków.
- Parametry funkcjiC przekazuje wszystko przez wartość: funkcje dostają kopie, nigdy oryginały. Co to znaczy w praktyce, jak wskaźniki symulują przekazywanie przez referencję, dlaczego tablice zachowują się inaczej i jak zwrócić kilka wyników.
- Prototypy funkcjiDlaczego C musi znać kształt funkcji, zanim ją wywołasz: pisanie prototypów, naprawianie błędów niejawnej deklaracji, prototypy w plikach nagłówkowych i prawdziwa różnica między f(void) a f().
- RekurencjaJak funkcja w C wywołuje samą siebie: przypadek bazowy, który ją zatrzymuje, silnia i Fibonacci krok po kroku, dlaczego naiwny Fibonacci jest katastrofalnie wolny, czym naprawdę jest przepełnienie stosu i kiedy pętla jest lepszym wyborem.
- ZasięgGdzie zmienna w C jest widoczna i jak długo żyje: zasięg blokowy, parametry funkcji, zmienne globalne o zasięgu pliku, statyczne zmienne lokalne, które przetrwają między wywołaniami, funkcje static, przesłanianie i dlaczego zmienne globalne sprawiają kłopoty.
Pointers
- WskaźnikiWskaźnik to zmienna, która przechowuje adres w pamięci. Ta strona buduje tę ideę od podstaw: operatory & i *, deklarowanie i wyłuskiwanie wskaźników, dlaczego typy wskaźników mają znaczenie i funkcja swap(), która pokazuje, po co w ogóle istnieją wskaźniki.
- Arytmetyka wskaźnikówDodanie 1 do wskaźnika nie dodaje 1 bajtu, tylko przesuwa go do następnego obiektu danego typu. Ta strona omawia ptr+1, inkrementację i dekrementację, różnicę wskaźników, porównania, przechodzenie tablicy wskaźnikiem i regułę pozycji tuż za końcem.
- Wskaźniki i tabliceW C nazwa tablicy prawie wszędzie, gdzie jej użyjesz, zamienia się we wskaźnik na pierwszy element. Ta strona wyjaśnia tę degradację, dlaczego arr[i] to dosłownie *(arr+i), dlaczego rozmiar tablicy musi trafiać do funkcji osobno i czym wskaźnik na tablicę różni się od tablicy wskaźników.
- Wskaźniki na funkcjeFunkcje też mają adresy, a wskaźnik na funkcję przechowuje taki adres. Ta strona rozszyfrowuje składnię deklaracji, pokazuje, jak typedef poprawia czytelność, i dochodzi do callbacków, qsort z własnym komparatorem i tablic dyspozycyjnych.
- Wskaźniki NULLNULL to adres, który przechowuje wskaźnik, gdy nie wskazuje na nic. Ta strona wyjaśnia, czym naprawdę jest NULL, dlaczego jego wyłuskanie kończy się awarią, czym różni się od 0 i od niezainicjalizowanego wskaźnika, oraz pokazuje wzorce obronne, które trzymają błędy NULL z dala od kodu.
Arrays & Strings
- TabliceJak zadeklarować i zainicjalizować tablicę w C, indeksować ją od zera, obliczyć długość przez sizeof, przejść pętlą po elementach i dlaczego odczyt za końcem tablicy to niezdefiniowane zachowanie, a nie komunikat o błędzie.
- Tablice wielowymiaroweJak zadeklarować, zainicjalizować i przejść pętlą tablicę dwuwymiarową w C, co naprawdę oznacza układ wierszowy w pamięci, dlaczego przekazanie tablicy 2D do funkcji wymaga liczby kolumn, i przykład z macierzami.
- NapisyC nie ma typu string: napis to tablica char zakończona bajtem '\0'. Ta strona buduje ten model myślowy, a potem omawia literały, wypisywanie, przechodzenie po znakach i dlaczego nie da się skopiować napisu przez =.
- Funkcje napisowePraktyczny przegląd <string.h>: mierzenie przez strlen, kopiowanie przez strcpy i strncpy, łączenie przez strcat, porównywanie przez strcmp, wyszukiwanie przez strchr i strstr oraz dobieranie rozmiaru buforów tak, by żadna z tych funkcji ich nie przepełniła.
- Konwersja napisówKonwersja między tekstem a liczbami w C: dlaczego atoi nie potrafi zgłosić błędu, jak poprawnie używać strtol i strtod z endptr i errno, zamiana liczb na napisy przez snprintf i sztuczki z '0' dla pojedynczych cyfr.
Dynamic Memory
- Pamięć dynamicznaPo co istnieje sterta, jak malloc daje ci pamięć, której rozmiar ustala się w czasie działania, idiom p = malloc(n * sizeof *p), sprawdzanie NULL, zwalnianie dokładnie raz i dynamiczna tablica omówiona od początku do końca.
- calloc i realloccalloc daje wyzerowaną pamięć i bezpiecznie mnoży rozmiar; realloc powiększa blok, który jest już wypełniony. Ta strona omawia obie funkcje, idiom z tymczasowym wskaźnikiem, który chroni przed wyciekiem po nieudanym realloc, oraz to, kiedy calloc wygrywa z malloc plus memset.
- Wycieki pamięciCzym naprawdę jest wyciek, trzy sposoby, w jakie powstaje w programach w C, dyscyplina własności, która im zapobiega, i jak znaleźć resztę przez valgrind i -fsanitize=address. Na koniec program z wyciekami naprawiony krok po kroku.
- Stos a stertaGdzie naprawdę mieszkają twoje dane: pamięć automatyczna na stosie, pamięć dynamiczna na stercie i pamięć statyczna jako trzeci obszar. Do tego klasyczny błąd wiszącego wskaźnika po zwróceniu zmiennej lokalnej i zasada wyboru.
Structs, Unions & Enums
- StrukturyJak zgrupować powiązane wartości w jeden typ za pomocą struct w C: deklaracja, dostęp do pól operatorem kropki, inicjalizatory desygnowane, tablice struktur, zagnieżdżanie i zasada kopiowania przy przekazywaniu, która zaskakuje każdego.
- Struktury i wskaźnikiJak wskazywać na strukturę w C: operator strzałki, dlaczego (*p).x potrzebuje nawiasów, przekazywanie struktur przez wskaźnik, by je zmieniać lub uniknąć kopii, alokacja struktury przez malloc i budowa węzła listy wiązanej.
- typedefJak typedef nadaje istniejącemu typowi w C nową nazwę: idiom typedef struct z etykietą i bez niej, typedef dla wskaźników na funkcje i tablic oraz jedyny przypadek, w którym typedef szkodzi: ukrywanie wskaźnika.
- UnieJak unia w C przechowuje kilka typów w tych samych bajtach: dlaczego jej rozmiar to rozmiar największego pola, dlaczego trzeba czytać pole zapisane jako ostatnie i jak unia z etykietą (enum plus union) czyni ją bezpieczną.
- enumyJak zdefiniować enum w C: automatyczna numeracja, jawne wartości, enumy w switch, dzięki którym kompilator wyłapie brakujące przypadki, zamiana enuma na string i konwencje nazewnictwa, które zapewniają czytelność.
Input & Output
- printfJak naprawdę działa printf w C: model łańcucha formatującego, specyfikatory używane na co dzień, szerokość i precyzja do wyrównanych wyników, rozsądne wypisywanie liczb float, wartość zwracana i dlaczego printf(user_input) to dziura w bezpieczeństwie.
- scanfJak wczytywać dane przez scanf w C: dlaczego & jest wymagane, jak traktowane są białe znaki, przepełnienie bufora przy %s i jego naprawa szerokością, sprawdzanie wartości zwracanej, błąd z pozostawionym znakiem nowej linii i fgets jako solidna alternatywa.
- Specyfikatory formatuWszystkie specyfikatory formatu w C w jednym miejscu: co znaczą %d, %s, %c, %f, %p i reszta, modyfikatory długości l, ll, h i z, szerokość, precyzja i flagi oraz to, czym printf różni się od scanf.
- Obsługa plikówJak czytać i zapisywać pliki w C: tabela trybów fopen, sprawdzanie NULL, zapis przez fprintf i fputc, odczyt przez fgets, fscanf i fgetc, kanoniczna pętla linia po linii i kiedy używać trybu binarnego.
- Argumenty wiersza poleceńJak program w C odczytuje swój wiersz poleceń: budowa argc i argv, przechodzenie po argumentach, co zawiera argv[0], zamiana liczb przez strtol zamiast atoi i mały kalkulator, który łączy to wszystko.
The Preprocessor
- PreprocesorPreprocesor edytuje tekst źródłowy, zanim kompilator w ogóle go zobaczy: wkleja pliki nagłówkowe, podstawia makra i włącza lub wyłącza fragmenty kodu. Oto cała rodzina dyrektyw i sposób na podejrzenie ich wyniku.
- MakraMakra obiektowe i funkcyjne z #define: dlaczego każdy argument i całe ciało potrzebują nawiasów, pułapka wielokrotnego obliczania, makra wieloliniowe z do-while(0) i kiedy lepszym narzędziem jest funkcja albo const.
- Pliki nagłówkoweJak podzielić program w C na pliki: co należy do .h, co do .c, include guardy chroniące przed podwójnym dołączeniem, kompilowanie kilku plików razem i współdzielenie zmiennych globalnych przez extern.
- Kompilacja warunkowaKompiluj różny kod dla różnych buildów za pomocą #ifdef, #ifndef, #if, #elif i #else: przełączniki debugowania, gałęzie dla platform, definiowanie makr z wiersza poleceń przez -D i wyłączanie kodu przez #if 0.
Standard Library
- Funkcje matematycznePrzegląd math.h: sqrt, pow, fabs, floor i ceil, round, fmod, rodziny funkcji trygonometrycznych i logarytmów, INFINITY i NAN, a do tego flaga linkera -lm, przez którą pojawia się klasyczny błąd undefined reference.
- Liczby losoweJak generować liczby losowe w C za pomocą rand() i RAND_MAX, dlaczego ziarno ustawia się przez srand(time(NULL)) dokładnie raz, jak zawęzić wynik do zakresu przez % i jakie drobne obciążenie to wprowadza, losowe liczby double i powtarzalne sekwencje.
- Biblioteka standardowaCo daje każdy nagłówek standardowy: stdio.h, stdlib.h, string.h, math.h, time.h, ctype.h, limits.h, stdbool.h, stdint.h i assert.h, z krótkim działającym przykładem dla każdego.
Errors & Debugging
- Segmentation faultSegfault oznacza, że program dotknął pamięci, która do niego nie należy. Oto pięć przyczyn odpowiadających za niemal wszystkie przypadki, każda z minimalnym przykładem i poprawką, oraz sposób na znalezienie dokładnej linii przez gdb i AddressSanitizer.
- Częste błędyBłędy, które każdy programista C popełnia przynajmniej raz: brakujący średnik, = zamiast ==, niejawne deklaracje, scanf bez &, porównywanie stringów przez ==, dzielenie całkowite, niezainicjalizowane zmienne i błąd o jeden. Każdy opisany jako objaw, przyczyna i rozwiązanie.
- Niezdefiniowane zachowanieNiezdefiniowane zachowanie to kod, na który standard C nie nakłada żadnych wymagań, więc może się stać cokolwiek, łącznie z tym, że optymalizator usunie twoje sprawdzenia. Zobacz, co je powoduje, dlaczego "u mnie działa" niczego nie dowodzi i jakie flagi je wyłapują.