{"id":1345,"date":"2026-04-19T14:51:20","date_gmt":"2026-04-19T12:51:20","guid":{"rendered":"https:\/\/trzykody.pl\/?p=1345"},"modified":"2026-04-19T14:51:22","modified_gmt":"2026-04-19T12:51:22","slug":"program-c","status":"publish","type":"post","link":"https:\/\/trzykody.pl\/index.php\/2026\/04\/19\/program-c\/","title":{"rendered":"Program C"},"content":{"rendered":"\n<p>Programowanie w j\u0119zyku C uczy my\u015blenia o komputerze na poziomie bli\u017cszym sprz\u0119towi ni\u017c wi\u0119kszo\u015b\u0107 nowoczesnych j\u0119zyk\u00f3w. Wida\u0107 tutaj pami\u0119\u0107, wska\u017aniki, spos\u00f3b dzia\u0142ania funkcji, koszt operacji i konsekwencje b\u0142\u0119d\u00f3w. To w\u0142a\u015bnie dlatego C jest cz\u0119sto pierwszym j\u0119zykiem na studiach technicznych oraz podstaw\u0105 wielu system\u00f3w operacyjnych, sterownik\u00f3w i oprogramowania wbudowanego. Dobrym punktem startu do zrozumienia kompilacji, pami\u0119ci i kontroli nad wykonaniem pozostaje <strong>Program C<\/strong>.<\/p>\n\n\n\n<div class=\"wp-block-rank-math-toc-block\" id=\"rank-math-toc\"><h2>Spis Tre\u015bci<\/h2><nav><ol><li><a href=\"#dlaczego-program-c-nadal-jest-podstawa-nauki-algorytmiki-systemow-operacyjnych-i-programowania-niskopoziomowego\">Dlaczego Program C nadal jest podstaw\u0105 nauki algorytmiki, system\u00f3w operacyjnych i programowania niskopoziomowego<\/a><ol><li><a href=\"#podstawowe-elementy-skladni-i-ich-znaczenie\">Podstawowe elementy sk\u0142adni i ich znaczenie<\/a><\/li><li><a href=\"#typy-danych-i-ich-realne-znaczenie\">Typy danych i ich realne znaczenie<\/a><\/li><\/ol><\/li><li><a href=\"#jak-poprawnie-zbudowac-pierwszy-program-c-i-zrozumiec-kazdy-etap-od-kodu-zrodlowego-do-pliku-wykonywalnego\">Jak poprawnie zbudowa\u0107 pierwszy Program C i zrozumie\u0107 ka\u017cdy etap od kodu \u017ar\u00f3d\u0142owego do pliku wykonywalnego<\/a><ol><li><a href=\"#przyklad-podstawowy-w-kilku-jezykach-dla-porownania\">Przyk\u0142ad podstawowy w kilku j\u0119zykach dla por\u00f3wnania<\/a><\/li><li><a href=\"#kompilacja-i-etapy-dzialania\">Kompilacja i etapy dzia\u0142ania<\/a><\/li><li><a href=\"#instrukcje-warunkowe-i-petle\">Instrukcje warunkowe i p\u0119tle<\/a><\/li><li><a href=\"#funkcje-i-przekazywanie-argumentow\">Funkcje i przekazywanie argument\u00f3w<\/a><\/li><\/ol><\/li><li><a href=\"#wskazniki-tablice-i-pamiec-dynamiczna-jako-miejsce-w-ktorym-program-c-przestaje-byc-prosty\">Wska\u017aniki, tablice i pami\u0119\u0107 dynamiczna jako miejsce, w kt\u00f3rym Program C przestaje by\u0107 prosty<\/a><ol><li><a href=\"#czym-naprawde-jest-wskaznik\">Czym naprawd\u0119 jest wska\u017anik<\/a><\/li><li><a href=\"#tablica-nie-jest-zwykla-lista\">Tablica nie jest zwyk\u0142\u0105 list\u0105<\/a><\/li><li><a href=\"#pamiec-dynamiczna-i-odpowiedzialnosc-za-malloc\">Pami\u0119\u0107 dynamiczna i odpowiedzialno\u015b\u0107 za malloc<\/a><\/li><li><a href=\"#przydatne-wzory-zwiazane-z-pamiecia-i-indeksowaniem\">Przydatne wzory zwi\u0105zane z pami\u0119ci\u0105 i indeksowaniem<\/a><\/li><\/ol><\/li><li><a href=\"#najczestsze-bledy-ktore-psuja-program-c-jeszcze-zanim-pojawi-sie-wiekszy-projekt\">Najcz\u0119stsze b\u0142\u0119dy kt\u00f3re psuj\u0105 Program C jeszcze zanim pojawi si\u0119 wi\u0119kszy projekt<\/a><ol><li><a href=\"#typowe-pulapki\">Typowe pu\u0142apki<\/a><\/li><\/ol><\/li><li><a href=\"#faq-dotyczace-nauki-jezyka-c-i-pracy-z-pierwszymi-projektami\">FAQ dotycz\u0105ce nauki j\u0119zyka C i pracy z pierwszymi projektami<\/a><ol><li><a href=\"#czy-warto-zaczynac-nauke-programowania-wlasnie-od-c\">Czy warto zaczyna\u0107 nauk\u0119 programowania w\u0142a\u015bnie od C<\/a><\/li><li><a href=\"#dlaczego-program-kompiluje-sie-ale-dziala-zle\">Dlaczego program kompiluje si\u0119, ale dzia\u0142a \u017ale<\/a><\/li><li><a href=\"#czy-wskazniki-sa-naprawde-tak-trudne\">Czy wska\u017aniki s\u0105 naprawd\u0119 tak trudne<\/a><\/li><li><a href=\"#czy-c-zastepuje-c-calkowicie\">Czy C++ zast\u0119puje C ca\u0142kowicie<\/a><\/li><li><a href=\"#jaki-kompilator-wybrac-na-poczatek\">Jaki kompilator wybra\u0107 na pocz\u0105tek<\/a><\/li><\/ol><\/li><\/ol><\/nav><\/div>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"dlaczego-program-c-nadal-jest-podstawa-nauki-algorytmiki-systemow-operacyjnych-i-programowania-niskopoziomowego\">Dlaczego Program C nadal jest podstaw\u0105 nauki algorytmiki, system\u00f3w operacyjnych i programowania niskopoziomowego<\/h2>\n\n\n\n<p>J\u0119zyk C powsta\u0142 na pocz\u0105tku lat 70. i mimo wieku nadal jest u\u017cywany tam, gdzie liczy si\u0119 przewidywalno\u015b\u0107 dzia\u0142ania, szybko\u015b\u0107 oraz bezpo\u015bredni dost\u0119p do pami\u0119ci. Kernel systemu Linux, du\u017ca cz\u0119\u015b\u0107 bibliotek systemowych, firmware urz\u0105dze\u0144 i wiele sterownik\u00f3w powstaje w\u0142a\u015bnie w C.<\/p>\n\n\n\n<p>Najwa\u017cniejsza r\u00f3\u017cnica mi\u0119dzy C a j\u0119zykami wysokiego poziomu polega na odpowiedzialno\u015bci programisty. W Pythonie interpreter ukrywa wiele mechanizm\u00f3w. W C trzeba samodzielnie pilnowa\u0107 typ\u00f3w danych, rozmiaru pami\u0119ci, zakresu tablic i poprawnego zwalniania zasob\u00f3w.<\/p>\n\n\n\n<p>To nie jest wada. To w\u0142a\u015bnie dzi\u0119ki temu student zaczyna rozumie\u0107:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>czym naprawd\u0119 jest zmienna,<\/li>\n\n\n\n<li>gdzie znajduje si\u0119 tablica w pami\u0119ci,<\/li>\n\n\n\n<li>dlaczego przepe\u0142nienie bufora jest gro\u017ane,<\/li>\n\n\n\n<li>jak dzia\u0142a stos wywo\u0142a\u0144,<\/li>\n\n\n\n<li>dlaczego niekt\u00f3re operacje kosztuj\u0105 wi\u0119cej czasu.<\/li>\n<\/ul>\n\n\n\n<p>Bez tego trudno p\u00f3\u017aniej dobrze pisa\u0107 nawet w Java, Pythonie czy PHP, bo b\u0142\u0119dy logiczne s\u0105 te same \u2014 tylko lepiej ukryte.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"podstawowe-elementy-skladni-i-ich-znaczenie\">Podstawowe elementy sk\u0142adni i ich znaczenie<\/h3>\n\n\n\n<p>Program w C sk\u0142ada si\u0119 z funkcji. Punktem startowym jest <code>main()<\/code>. Kompilator zamienia kod \u017ar\u00f3d\u0142owy na kod maszynowy wykonywany przez procesor.<\/p>\n\n\n\n<p>Tabela poni\u017cej pokazuje najwa\u017cniejsze elementy.<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Element<\/th><th>Znaczenie<\/th><th>Przyk\u0142ad<\/th><\/tr><\/thead><tbody><tr><td><code>#include<\/code><\/td><td>do\u0142\u0105czenie bibliotek nag\u0142\u00f3wkowych<\/td><td><code>#include &lt;stdio.h&gt;<\/code><\/td><\/tr><tr><td><code>int main()<\/code><\/td><td>funkcja startowa programu<\/td><td><code>int main()<\/code><\/td><\/tr><tr><td><code>printf()<\/code><\/td><td>wypisanie tekstu na ekran<\/td><td><code>printf(\"Hello\");<\/code><\/td><\/tr><tr><td><code>return 0;<\/code><\/td><td>zako\u0144czenie programu kodem sukcesu<\/td><td><code>return 0;<\/code><\/td><\/tr><tr><td><code>;<\/code><\/td><td>zako\u0144czenie instrukcji<\/td><td><code>int x = 5;<\/code><\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"typy-danych-i-ich-realne-znaczenie\">Typy danych i ich realne znaczenie<\/h3>\n\n\n\n<p>Typ danych nie jest tylko formalno\u015bci\u0105. To informacja o ilo\u015bci pami\u0119ci i zakresie warto\u015bci.<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Typ<\/th><th>Typowy rozmiar<\/th><th>Przyk\u0142adowy zakres<\/th><\/tr><\/thead><tbody><tr><td><code>char<\/code><\/td><td>1 bajt<\/td><td>-128 do 127<\/td><\/tr><tr><td><code>int<\/code><\/td><td>4 bajty<\/td><td>oko\u0142o \u00b12 miliardy<\/td><\/tr><tr><td><code>float<\/code><\/td><td>4 bajty<\/td><td>liczby zmiennoprzecinkowe<\/td><\/tr><tr><td><code>double<\/code><\/td><td>8 bajt\u00f3w<\/td><td>wi\u0119ksza precyzja<\/td><\/tr><tr><td><code>long long<\/code><\/td><td>8 bajt\u00f3w<\/td><td>bardzo du\u017ce liczby ca\u0142kowite<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p>Nie wolno zak\u0142ada\u0107, \u017ce ka\u017cdy system ma identyczne rozmiary typ\u00f3w. W systemach wbudowanych r\u00f3\u017cnice bywaj\u0105 bardzo istotne.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"jak-poprawnie-zbudowac-pierwszy-program-c-i-zrozumiec-kazdy-etap-od-kodu-zrodlowego-do-pliku-wykonywalnego\">Jak poprawnie zbudowa\u0107 pierwszy Program C i zrozumie\u0107 ka\u017cdy etap od kodu \u017ar\u00f3d\u0142owego do pliku wykonywalnego<\/h2>\n\n\n\n<p>Najprostszy przyk\u0142ad powinien by\u0107 banalny, ale zrozumia\u0142y. Nie chodzi o samo wypisanie tekstu, tylko o zobaczenie pe\u0142nego procesu: zapis pliku, kompilacja, uruchomienie i analiza wyniku.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"przyklad-podstawowy-w-kilku-jezykach-dla-porownania\">Przyk\u0142ad podstawowy w kilku j\u0119zykach dla por\u00f3wnania<\/h3>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>J\u0119zyk<\/th><th>Kod<\/th><\/tr><\/thead><tbody><tr><td>C<\/td><td><code>c\\n#include &lt;stdio.h&gt;\\n\\nint main() {\\n printf(\\\"Witaj\\\\n\\\");\\n return 0;\\n}\\n<\/code><\/td><\/tr><tr><td>C++<\/td><td><code>cpp\\n#include &lt;iostream&gt;\\nusing namespace std;\\n\\nint main() {\\n cout &lt;&lt; \\\"Witaj\\\" &lt;&lt; endl;\\n return 0;\\n}\\n<\/code><\/td><\/tr><tr><td>Python<\/td><td><code>python\\nprint(\\\"Witaj\\\")\\n<\/code><\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p>W C trzeba jawnie do\u0142\u0105czy\u0107 bibliotek\u0119 i okre\u015bli\u0107 typ zwracany funkcji. To drobiazg, ale od pocz\u0105tku uczy dyscypliny.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"kompilacja-i-etapy-dzialania\">Kompilacja i etapy dzia\u0142ania<\/h3>\n\n\n\n<p>Proces wygl\u0105da tak:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>zapis pliku <code>main.c<\/code>,<\/li>\n\n\n\n<li>preprocessowanie (<code>#include<\/code>, makra),<\/li>\n\n\n\n<li>kompilacja do kodu po\u015bredniego,<\/li>\n\n\n\n<li>asembler,<\/li>\n\n\n\n<li>linkowanie z bibliotekami,<\/li>\n\n\n\n<li>utworzenie pliku wykonywalnego.<\/li>\n<\/ol>\n\n\n\n<p>Dla GCC:<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>System<\/th><th>Polecenie<\/th><\/tr><\/thead><tbody><tr><td>Linux \/ macOS<\/td><td><code>bash\\ngcc main.c -o program\\n<\/code><\/td><\/tr><tr><td>Windows (MinGW)<\/td><td><code>bash\\ngcc main.c -o program.exe\\n<\/code><\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p>Uruchomienie:<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>System<\/th><th>Polecenie<\/th><\/tr><\/thead><tbody><tr><td>Linux \/ macOS<\/td><td><code>bash\\n.\/program\\n<\/code><\/td><\/tr><tr><td>Windows<\/td><td><code>bash\\nprogram.exe\\n<\/code><\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p>Student cz\u0119sto widzi tylko \u201edzia\u0142a\u201d albo \u201enie dzia\u0142a\u201d, ale problem zwykle le\u017cy wcze\u015bniej: brak biblioteki, liter\u00f3wka, z\u0142y typ albo b\u0142\u0105d linkera.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"instrukcje-warunkowe-i-petle\">Instrukcje warunkowe i p\u0119tle<\/h3>\n\n\n\n<p>Bez tego nie ma algorytmiki.<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Konstrukcja<\/th><th>Kod<\/th><\/tr><\/thead><tbody><tr><td><code>if<\/code><\/td><td><code>c\\nif (x &gt; 0) {\\n printf(\\\"Dodatnia\\\\n\\\");\\n}\\n<\/code><\/td><\/tr><tr><td><code>for<\/code><\/td><td><code>c\\nfor (int i = 0; i &lt; 5; i++) {\\n printf(\\\"%d\\\\n\\\", i);\\n}\\n<\/code><\/td><\/tr><tr><td><code>while<\/code><\/td><td><code>c\\nwhile (x &gt; 0) {\\n x--;\\n}\\n<\/code><\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p>Najcz\u0119stszy b\u0142\u0105d pocz\u0105tkuj\u0105cych: u\u017cycie <code>=<\/code> zamiast <code>==<\/code>.<\/p>\n\n\n\n<p>To wygl\u0105da niewinnie:<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>B\u0142\u0105d<\/th><th>Poprawna wersja<\/th><\/tr><\/thead><tbody><tr><td><code>c\\nif (x = 5)\\n<\/code><\/td><td><code>c\\nif (x == 5)\\n<\/code><\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p>Pierwsza wersja przypisuje warto\u015b\u0107, druga por\u00f3wnuje.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"funkcje-i-przekazywanie-argumentow\">Funkcje i przekazywanie argument\u00f3w<\/h3>\n\n\n\n<p>Funkcja porz\u0105dkuje kod i zmniejsza liczb\u0119 b\u0142\u0119d\u00f3w.<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Przyk\u0142ad<\/th><th>Kod<\/th><\/tr><\/thead><tbody><tr><td>Funkcja sumy<\/td><td><code>c\\nint suma(int a, int b) {\\n return a + b;\\n}\\n<\/code><\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p>Je\u015bli funkcja ma zmienia\u0107 warto\u015b\u0107 zmiennej spoza swojego zakresu, potrzebny jest wska\u017anik.<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Przyk\u0142ad<\/th><th>Kod<\/th><\/tr><\/thead><tbody><tr><td>Modyfikacja przez wska\u017anik<\/td><td><code>c\\nvoid zwieksz(int *x) {\\n (*x)++;\\n}\\n<\/code><\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p>Tutaj zaczyna si\u0119 realne rozumienie pami\u0119ci.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"wskazniki-tablice-i-pamiec-dynamiczna-jako-miejsce-w-ktorym-program-c-przestaje-byc-prosty\">Wska\u017aniki, tablice i pami\u0119\u0107 dynamiczna jako miejsce, w kt\u00f3rym Program C przestaje by\u0107 prosty<\/h2>\n\n\n\n<p>Wi\u0119kszo\u015b\u0107 problem\u00f3w zaczyna si\u0119 w\u0142a\u015bnie tutaj. Dop\u00f3ki kod u\u017cywa tylko kilku zmiennych i <code>printf<\/code>, wszystko wygl\u0105da \u0142atwo. Wska\u017aniki pokazuj\u0105, \u017ce komputer nie \u201edomy\u015bla si\u0119\u201d intencji programisty.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"czym-naprawde-jest-wskaznik\">Czym naprawd\u0119 jest wska\u017anik<\/h3>\n\n\n\n<p>Wska\u017anik przechowuje adres w pami\u0119ci.<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Przyk\u0142ad<\/th><th>Kod<\/th><\/tr><\/thead><tbody><tr><td>Podstawy wska\u017anika<\/td><td><code>c\\nint x = 10;\\nint *p = &amp;x;\\nprintf(\\\"%d\\\", *p);\\n<\/code><\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>&amp;x<\/code> oznacza adres zmiennej,<\/li>\n\n\n\n<li><code>p<\/code> przechowuje ten adres,<\/li>\n\n\n\n<li><code>*p<\/code> odczytuje warto\u015b\u0107 spod tego adresu.<\/li>\n<\/ul>\n\n\n\n<p>Je\u015bli wska\u017anik wskazuje na niepoprawne miejsce, program mo\u017ce si\u0119 zawiesi\u0107 albo uszkodzi\u0107 dane.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"tablica-nie-jest-zwykla-lista\">Tablica nie jest zwyk\u0142\u0105 list\u0105<\/h3>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Przyk\u0142ad<\/th><th>Kod<\/th><\/tr><\/thead><tbody><tr><td>Tablica liczb<\/td><td><code>c\\nint tab[5] = {1,2,3,4,5};\\nprintf(\\\"%d\\\", tab[0]);\\n<\/code><\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p>C nie sprawdza automatycznie granic tablicy.<\/p>\n\n\n\n<p>To znaczy, \u017ce taki kod mo\u017ce si\u0119 skompilowa\u0107:<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Niebezpieczny przyk\u0142ad<\/th><th>Kod<\/th><\/tr><\/thead><tbody><tr><td>Wyj\u015bcie poza zakres<\/td><td><code>c\\nprintf(\\\"%d\\\", tab[100]);\\n<\/code><\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p>Skutek mo\u017ce by\u0107 losowy: z\u0142y wynik, awaria albo cichy b\u0142\u0105d trudny do wykrycia.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"pamiec-dynamiczna-i-odpowiedzialnosc-za-malloc\">Pami\u0119\u0107 dynamiczna i odpowiedzialno\u015b\u0107 za <code>malloc<\/code><\/h3>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Operacja<\/th><th>Kod<\/th><\/tr><\/thead><tbody><tr><td>Rezerwacja pami\u0119ci<\/td><td><code>c\\nint *tab = malloc(10 * sizeof(int));\\n<\/code><\/td><\/tr><tr><td>Zwolnienie pami\u0119ci<\/td><td><code>c\\nfree(tab);\\n<\/code><\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p>Brak <code>free()<\/code> powoduje wycieki pami\u0119ci. W ma\u0142ym programie to nie boli. W serwerze dzia\u0142aj\u0105cym miesi\u0105cami oznacza realne problemy i koszt.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"przydatne-wzory-zwiazane-z-pamiecia-i-indeksowaniem\">Przydatne wzory zwi\u0105zane z pami\u0119ci\u0105 i indeksowaniem<\/h3>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Zastosowanie<\/th><th>Wz\u00f3r<\/th><\/tr><\/thead><tbody><tr><td>Adres elementu tablicy<\/td><td><code>adres = baza + i * rozmiar_elementu<\/code><\/td><\/tr><tr><td>Liczba bajt\u00f3w tablicy<\/td><td><code>n * sizeof(typ)<\/code><\/td><\/tr><tr><td>Z\u0142o\u017cono\u015b\u0107 liniowego przej\u015bcia<\/td><td><code>O(n)<\/code><\/td><\/tr><tr><td>Z\u0142o\u017cono\u015b\u0107 wyszukiwania binarnego<\/td><td><code>O(log n)<\/code><\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p>To s\u0105 rzeczy praktyczne, nie teoria dla ozdoby. Bez tego trudno pisa\u0107 wydajny kod.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"najczestsze-bledy-ktore-psuja-program-c-jeszcze-zanim-pojawi-sie-wiekszy-projekt\">Najcz\u0119stsze b\u0142\u0119dy kt\u00f3re psuj\u0105 Program C jeszcze zanim pojawi si\u0119 wi\u0119kszy projekt<\/h2>\n\n\n\n<p>Najwi\u0119cej czasu nie zabiera pisanie kodu, tylko poprawianie drobnych b\u0142\u0119d\u00f3w, kt\u00f3re na pocz\u0105tku wydaj\u0105 si\u0119 nieistotne.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"typowe-pulapki\">Typowe pu\u0142apki<\/h3>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Brak \u015brednika<br>Kompilator zg\u0142asza b\u0142\u0105d kilka linii dalej i pocz\u0105tkuj\u0105cy szuka problemu w z\u0142ym miejscu.<\/li>\n\n\n\n<li>Niezainicjalizowana zmienna<br>Program dzia\u0142a \u201eczasami\u201d, bo odczytywana jest przypadkowa warto\u015b\u0107 z pami\u0119ci.<\/li>\n\n\n\n<li>U\u017cycie z\u0142ego formatu w <code>printf<\/code><\/li>\n<\/ol>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>B\u0142\u0105d<\/th><th>Problem<\/th><\/tr><\/thead><tbody><tr><td><code>%d<\/code> dla <code>float<\/code><\/td><td>b\u0142\u0119dny odczyt danych<\/td><\/tr><tr><td><code>%f<\/code> dla <code>int<\/code><\/td><td>niepoprawny wynik<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<ol start=\"4\" class=\"wp-block-list\">\n<li>Brak sprawdzenia wyniku <code>malloc()<\/code><br>Je\u015bli pami\u0119\u0107 nie zosta\u0142a przydzielona, dalsza praca na wska\u017aniku jest niebezpieczna.<\/li>\n\n\n\n<li>Zapominanie o <code>free()<\/code><br>Klasyczny wyciek pami\u0119ci.<\/li>\n\n\n\n<li>Zbyt p\u00f3\u017ane testowanie<br>Pisanie 300 linii i uruchomienie dopiero na ko\u0144cu zwykle ko\u0144czy si\u0119 d\u0142ugim debugowaniem.<\/li>\n<\/ol>\n\n\n\n<p>Dobra praktyka jest prosta: pisa\u0107 ma\u0142y fragment, kompilowa\u0107 natychmiast, poprawia\u0107 od razu.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"faq-dotyczace-nauki-jezyka-c-i-pracy-z-pierwszymi-projektami\">FAQ dotycz\u0105ce nauki j\u0119zyka C i pracy z pierwszymi projektami<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"czy-warto-zaczynac-nauke-programowania-wlasnie-od-c\">Czy warto zaczyna\u0107 nauk\u0119 programowania w\u0142a\u015bnie od C<\/h3>\n\n\n\n<p>Tak, je\u015bli celem jest informatyka techniczna, systemy operacyjne, embedded lub solidne zrozumienie podstaw. Je\u015bli celem jest szybkie tworzenie prostych aplikacji biznesowych, Python bywa \u0142atwiejszy na start.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"dlaczego-program-kompiluje-sie-ale-dziala-zle\">Dlaczego program kompiluje si\u0119, ale dzia\u0142a \u017ale<\/h3>\n\n\n\n<p>Kompilator sprawdza g\u0142\u00f3wnie poprawno\u015b\u0107 sk\u0142adni i cz\u0119\u015b\u0107 typ\u00f3w. Nie wie, czy logika programu jest poprawna. B\u0142\u0105d mo\u017ce by\u0107 ca\u0142kowicie poprawny sk\u0142adniowo.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"czy-wskazniki-sa-naprawde-tak-trudne\">Czy wska\u017aniki s\u0105 naprawd\u0119 tak trudne<\/h3>\n\n\n\n<p>Na pocz\u0105tku tak, bo wymagaj\u0105 my\u015blenia o adresach pami\u0119ci. Po kilku prostych \u0107wiczeniach staj\u0105 si\u0119 bardziej naturalne ni\u017c zbyt abstrakcyjne mechanizmy z innych j\u0119zyk\u00f3w.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"czy-c-zastepuje-c-calkowicie\">Czy C++ zast\u0119puje C ca\u0142kowicie<\/h3>\n\n\n\n<p>Nie. C++ jest szerszy i wygodniejszy w wielu projektach, ale C nadal dominuje w systemach niskopoziomowych, mikrokontrolerach i bibliotekach systemowych.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"jaki-kompilator-wybrac-na-poczatek\">Jaki kompilator wybra\u0107 na pocz\u0105tek<\/h3>\n\n\n\n<p>Najcz\u0119\u015bciej GCC albo Clang. S\u0105 dobrze udokumentowane, przewidywalne i zgodne z materia\u0142ami akademickimi.<\/p>\n\n\n\n<p>J\u0119zyk C nie wybacza wielu b\u0142\u0119d\u00f3w, ale w\u0142a\u015bnie dlatego dobrze uczy. Programista szybciej zaczyna rozumie\u0107 nie tylko sk\u0142adni\u0119, ale spos\u00f3b dzia\u0142ania komputera. Ta wiedza zostaje p\u00f3\u017aniej niezale\u017cnie od tego, czy pracuje w Pythonie, PHP, Javie czy C++.<\/p>\n\n\n\n<p><em>\u0179r\u00f3d\u0142o Foto: Freepik<\/em><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Programowanie w j\u0119zyku C uczy my\u015blenia o komputerze na poziomie bli\u017cszym sprz\u0119towi ni\u017c wi\u0119kszo\u015b\u0107 nowoczesnych j\u0119zyk\u00f3w. Wida\u0107 tutaj pami\u0119\u0107, wska\u017aniki, spos\u00f3b dzia\u0142ania funkcji, koszt operacji i konsekwencje b\u0142\u0119d\u00f3w. To w\u0142a\u015bnie dlatego C jest cz\u0119sto pierwszym j\u0119zykiem na studiach technicznych oraz podstaw\u0105 wielu system\u00f3w operacyjnych, sterownik\u00f3w i oprogramowania wbudowanego. Dobrym punktem startu do zrozumienia kompilacji, pami\u0119ci i kontroli nad wykonaniem pozostaje Program C. Dlaczego Program C nadal jest podstaw\u0105 nauki algorytmiki, system\u00f3w operacyjnych i programowania niskopoziomowego J\u0119zyk C powsta\u0142 na pocz\u0105tku lat 70. i mimo wieku nadal jest u\u017cywany tam, gdzie liczy si\u0119 przewidywalno\u015b\u0107 dzia\u0142ania, szybko\u015b\u0107 oraz bezpo\u015bredni dost\u0119p do pami\u0119ci. Kernel systemu Linux, du\u017ca cz\u0119\u015b\u0107 bibliotek systemowych, firmware urz\u0105dze\u0144 i wiele sterownik\u00f3w powstaje w\u0142a\u015bnie w C. Najwa\u017cniejsza r\u00f3\u017cnica mi\u0119dzy C a j\u0119zykami wysokiego poziomu polega na odpowiedzialno\u015bci programisty. W Pythonie interpreter ukrywa wiele mechanizm\u00f3w. W C trzeba samodzielnie pilnowa\u0107 typ\u00f3w danych, rozmiaru pami\u0119ci, zakresu tablic i poprawnego zwalniania zasob\u00f3w. To nie jest wada. To w\u0142a\u015bnie dzi\u0119ki temu student zaczyna rozumie\u0107: Bez tego trudno p\u00f3\u017aniej dobrze pisa\u0107 nawet w Java, Pythonie czy PHP, bo b\u0142\u0119dy logiczne s\u0105 te same \u2014 tylko lepiej ukryte. Podstawowe elementy sk\u0142adni i ich znaczenie Program w C sk\u0142ada si\u0119 z funkcji. Punktem startowym jest main(). Kompilator zamienia kod \u017ar\u00f3d\u0142owy na kod maszynowy wykonywany przez procesor. Tabela poni\u017cej pokazuje najwa\u017cniejsze elementy. Element Znaczenie Przyk\u0142ad #include do\u0142\u0105czenie bibliotek nag\u0142\u00f3wkowych #include &lt;stdio.h&gt; int main() funkcja startowa programu int main() printf() wypisanie tekstu na ekran printf(&#8222;Hello&#8221;); return 0; zako\u0144czenie programu kodem sukcesu return 0; ; zako\u0144czenie instrukcji int x = 5; Typy danych i ich realne znaczenie Typ danych nie jest tylko formalno\u015bci\u0105. To informacja o ilo\u015bci pami\u0119ci i zakresie warto\u015bci. Typ Typowy rozmiar Przyk\u0142adowy zakres char 1 bajt -128 do 127 int 4 bajty oko\u0142o \u00b12 miliardy float 4 bajty liczby zmiennoprzecinkowe double 8 bajt\u00f3w wi\u0119ksza precyzja long long 8 bajt\u00f3w bardzo du\u017ce liczby ca\u0142kowite Nie wolno zak\u0142ada\u0107, \u017ce ka\u017cdy system ma identyczne rozmiary typ\u00f3w. W systemach wbudowanych r\u00f3\u017cnice bywaj\u0105 bardzo istotne. Jak poprawnie zbudowa\u0107 pierwszy Program C i zrozumie\u0107 ka\u017cdy etap od kodu \u017ar\u00f3d\u0142owego do pliku wykonywalnego Najprostszy przyk\u0142ad powinien by\u0107 banalny, ale zrozumia\u0142y. Nie chodzi o samo wypisanie tekstu, tylko o zobaczenie pe\u0142nego procesu: zapis pliku, kompilacja, uruchomienie i analiza wyniku. Przyk\u0142ad podstawowy w kilku j\u0119zykach dla por\u00f3wnania J\u0119zyk Kod C c\\n#include &lt;stdio.h&gt;\\n\\nint main() {\\n printf(\\&#8221;Witaj\\\\n\\&#8221;);\\n return 0;\\n}\\n C++ cpp\\n#include &lt;iostream&gt;\\nusing namespace std;\\n\\nint main() {\\n cout &lt;&lt; \\&#8221;Witaj\\&#8221; &lt;&lt; endl;\\n return 0;\\n}\\n Python python\\nprint(\\&#8221;Witaj\\&#8221;)\\n W C trzeba jawnie do\u0142\u0105czy\u0107 bibliotek\u0119 i okre\u015bli\u0107 typ zwracany funkcji. To drobiazg, ale od pocz\u0105tku uczy dyscypliny. Kompilacja i etapy dzia\u0142ania Proces wygl\u0105da tak: Dla GCC: System Polecenie Linux \/ macOS bash\\ngcc main.c -o program\\n Windows (MinGW) bash\\ngcc main.c -o program.exe\\n Uruchomienie: System Polecenie Linux \/ macOS bash\\n.\/program\\n Windows bash\\nprogram.exe\\n Student cz\u0119sto widzi tylko \u201edzia\u0142a\u201d albo \u201enie dzia\u0142a\u201d, ale problem zwykle le\u017cy wcze\u015bniej: brak biblioteki, liter\u00f3wka, z\u0142y typ albo b\u0142\u0105d linkera. Instrukcje warunkowe i p\u0119tle Bez tego nie ma algorytmiki. Konstrukcja Kod if c\\nif (x &gt; 0) {\\n printf(\\&#8221;Dodatnia\\\\n\\&#8221;);\\n}\\n for c\\nfor (int i = 0; i &lt; 5; i++) {\\n printf(\\&#8221;%d\\\\n\\&#8221;, i);\\n}\\n while c\\nwhile (x &gt; 0) {\\n x&#8211;;\\n}\\n Najcz\u0119stszy b\u0142\u0105d pocz\u0105tkuj\u0105cych: u\u017cycie = zamiast ==. To wygl\u0105da niewinnie: B\u0142\u0105d Poprawna wersja c\\nif (x = 5)\\n c\\nif (x == 5)\\n Pierwsza wersja przypisuje warto\u015b\u0107, druga por\u00f3wnuje. Funkcje i przekazywanie argument\u00f3w Funkcja porz\u0105dkuje kod i zmniejsza liczb\u0119 b\u0142\u0119d\u00f3w. Przyk\u0142ad Kod Funkcja sumy c\\nint suma(int a, int b) {\\n return a + b;\\n}\\n Je\u015bli funkcja ma zmienia\u0107 warto\u015b\u0107 zmiennej spoza swojego zakresu, potrzebny jest wska\u017anik. Przyk\u0142ad Kod Modyfikacja przez wska\u017anik c\\nvoid zwieksz(int *x) {\\n (*x)++;\\n}\\n Tutaj zaczyna si\u0119 realne rozumienie pami\u0119ci. Wska\u017aniki, tablice i pami\u0119\u0107 dynamiczna jako miejsce, w kt\u00f3rym Program C przestaje by\u0107 prosty Wi\u0119kszo\u015b\u0107 problem\u00f3w zaczyna si\u0119 w\u0142a\u015bnie tutaj. Dop\u00f3ki kod u\u017cywa tylko kilku zmiennych i printf, wszystko wygl\u0105da \u0142atwo. Wska\u017aniki pokazuj\u0105, \u017ce komputer nie \u201edomy\u015bla si\u0119\u201d intencji programisty. Czym naprawd\u0119 jest wska\u017anik Wska\u017anik przechowuje adres w pami\u0119ci. Przyk\u0142ad Kod Podstawy wska\u017anika c\\nint x = 10;\\nint *p = &amp;x;\\nprintf(\\&#8221;%d\\&#8221;, *p);\\n Je\u015bli wska\u017anik wskazuje na niepoprawne miejsce, program mo\u017ce si\u0119 zawiesi\u0107 albo uszkodzi\u0107 dane. Tablica nie jest zwyk\u0142\u0105 list\u0105 Przyk\u0142ad Kod Tablica liczb c\\nint tab[5] = {1,2,3,4,5};\\nprintf(\\&#8221;%d\\&#8221;, tab[0]);\\n C nie sprawdza automatycznie granic tablicy. To znaczy, \u017ce taki kod mo\u017ce si\u0119 skompilowa\u0107: Niebezpieczny przyk\u0142ad Kod Wyj\u015bcie poza zakres c\\nprintf(\\&#8221;%d\\&#8221;, tab[100]);\\n Skutek mo\u017ce by\u0107 losowy: z\u0142y wynik, awaria albo cichy b\u0142\u0105d trudny do wykrycia. Pami\u0119\u0107 dynamiczna i odpowiedzialno\u015b\u0107 za malloc Operacja Kod Rezerwacja pami\u0119ci c\\nint *tab = malloc(10 * sizeof(int));\\n Zwolnienie pami\u0119ci c\\nfree(tab);\\n Brak free() powoduje wycieki pami\u0119ci. W ma\u0142ym programie to nie boli. W serwerze dzia\u0142aj\u0105cym miesi\u0105cami oznacza realne problemy i koszt. Przydatne wzory zwi\u0105zane z pami\u0119ci\u0105 i indeksowaniem Zastosowanie Wz\u00f3r Adres elementu tablicy adres = baza + i * rozmiar_elementu Liczba bajt\u00f3w tablicy n * sizeof(typ) Z\u0142o\u017cono\u015b\u0107 liniowego przej\u015bcia O(n) Z\u0142o\u017cono\u015b\u0107 wyszukiwania binarnego O(log n) To s\u0105 rzeczy praktyczne, nie teoria dla ozdoby. Bez tego trudno pisa\u0107 wydajny kod. Najcz\u0119stsze b\u0142\u0119dy kt\u00f3re psuj\u0105 Program C jeszcze zanim pojawi si\u0119 wi\u0119kszy projekt Najwi\u0119cej czasu nie zabiera pisanie kodu, tylko poprawianie drobnych b\u0142\u0119d\u00f3w, kt\u00f3re na pocz\u0105tku wydaj\u0105 si\u0119 nieistotne. Typowe pu\u0142apki B\u0142\u0105d Problem %d dla float b\u0142\u0119dny odczyt danych %f dla int niepoprawny wynik Dobra praktyka jest prosta: pisa\u0107 ma\u0142y fragment, kompilowa\u0107 natychmiast, poprawia\u0107 od razu. FAQ dotycz\u0105ce nauki j\u0119zyka C i pracy z pierwszymi projektami Czy warto zaczyna\u0107 nauk\u0119 programowania w\u0142a\u015bnie od C Tak, je\u015bli celem jest informatyka techniczna, systemy operacyjne, embedded lub solidne zrozumienie podstaw. Je\u015bli celem jest szybkie tworzenie prostych aplikacji biznesowych, Python bywa \u0142atwiejszy na start. Dlaczego program kompiluje si\u0119, ale dzia\u0142a \u017ale Kompilator sprawdza g\u0142\u00f3wnie poprawno\u015b\u0107 sk\u0142adni i cz\u0119\u015b\u0107 typ\u00f3w. Nie wie, czy logika programu jest poprawna. B\u0142\u0105d mo\u017ce by\u0107 ca\u0142kowicie poprawny sk\u0142adniowo. Czy wska\u017aniki s\u0105 naprawd\u0119 tak trudne Na pocz\u0105tku tak, bo wymagaj\u0105 my\u015blenia o adresach pami\u0119ci. Po kilku prostych \u0107wiczeniach staj\u0105 si\u0119 bardziej naturalne ni\u017c zbyt abstrakcyjne mechanizmy z innych j\u0119zyk\u00f3w. Czy C++ zast\u0119puje C ca\u0142kowicie Nie. C++ jest szerszy i wygodniejszy w wielu projektach, ale C nadal dominuje w systemach niskopoziomowych, mikrokontrolerach i bibliotekach systemowych. Jaki kompilator wybra\u0107 na pocz\u0105tek Najcz\u0119\u015bciej GCC albo Clang. S\u0105 dobrze udokumentowane, przewidywalne i zgodne z materia\u0142ami akademickimi. J\u0119zyk C nie wybacza wielu b\u0142\u0119d\u00f3w, ale w\u0142a\u015bnie dlatego dobrze uczy. Programista szybciej zaczyna rozumie\u0107 nie tylko sk\u0142adni\u0119, ale spos\u00f3b dzia\u0142ania komputera. Ta wiedza zostaje p\u00f3\u017aniej niezale\u017cnie od tego, czy pracuje w Pythonie, PHP, Javie czy C++. \u0179r\u00f3d\u0142o Foto: Freepik<\/p>\n","protected":false},"author":1,"featured_media":1346,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[27],"tags":[],"class_list":["post-1345","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-jezyk-programowania"],"_links":{"self":[{"href":"https:\/\/trzykody.pl\/index.php\/wp-json\/wp\/v2\/posts\/1345","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/trzykody.pl\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/trzykody.pl\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/trzykody.pl\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/trzykody.pl\/index.php\/wp-json\/wp\/v2\/comments?post=1345"}],"version-history":[{"count":1,"href":"https:\/\/trzykody.pl\/index.php\/wp-json\/wp\/v2\/posts\/1345\/revisions"}],"predecessor-version":[{"id":1347,"href":"https:\/\/trzykody.pl\/index.php\/wp-json\/wp\/v2\/posts\/1345\/revisions\/1347"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/trzykody.pl\/index.php\/wp-json\/wp\/v2\/media\/1346"}],"wp:attachment":[{"href":"https:\/\/trzykody.pl\/index.php\/wp-json\/wp\/v2\/media?parent=1345"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/trzykody.pl\/index.php\/wp-json\/wp\/v2\/categories?post=1345"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/trzykody.pl\/index.php\/wp-json\/wp\/v2\/tags?post=1345"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}