Darmowy fragment publikacji:
IDZ DO
IDZ DO
PRZYK£ADOWY ROZDZIA£
PRZYK£ADOWY ROZDZIA£
SPIS TREĎCI
SPIS TREĎCI
KATALOG KSI¥¯EK
KATALOG KSI¥¯EK
KATALOG ONLINE
KATALOG ONLINE
ZAMÓW DRUKOWANY KATALOG
ZAMÓW DRUKOWANY KATALOG
TWÓJ KOSZYK
TWÓJ KOSZYK
DODAJ DO KOSZYKA
DODAJ DO KOSZYKA
CENNIK I INFORMACJE
CENNIK I INFORMACJE
ZAMÓW INFORMACJE
ZAMÓW INFORMACJE
O NOWOĎCIACH
O NOWOĎCIACH
ZAMÓW CENNIK
ZAMÓW CENNIK
CZYTELNIA
CZYTELNIA
FRAGMENTY KSI¥¯EK ONLINE
FRAGMENTY KSI¥¯EK ONLINE
Wydawnictwo Helion
ul. Chopina 6
44-100 Gliwice
tel. (32)230-98-63
e-mail: helion@helion.pl
Jêzyk C. Wskaĥniki.
Vademecum profesjonalisty
Autor: Kenneth A. Reek
T³umaczenie: Pawe³ Gonera
ISBN: 83-7361-198-3
Tytu³ orygina³u: Pointers on C
Format: B5, stron: 544
Przyk³ady na ftp: 55 kB
Ksi¹¿ka „Jêzyk C. Wskaĥniki. Vademecum profesjonalisty” przeznaczona jest dla
zaawansowanych studentów i profesjonalistów, zapewniaj¹c obszerne ĥród³o informacji
dla tych, którzy potrzebuj¹ dog³êbnego omówienia jêzyka C. Dok³adne wyjaġnienie
podstaw oraz przegl¹d zaawansowanych funkcji pozwala programistom skorzystaæ
z si³y wskaĥników w jêzyku C. Dok³adny opis idiomów programowych oraz gruntowna
dyskusja zaawansowanych tematów powoduje, ¿e ksi¹¿ka jest nieocenionym
podrêcznikiem i informatorem dla studentów i zawodowych programistów.
• Zawiera wszystko, co jest niezbêdne do dog³êbnego poznania jêzyka C
• Dok³adnie opisuje wskaĥniki, ich sk³adniê, techniki efektywnego u¿ycia
oraz czêsto stosowane idiomy programistyczne, w których wystêpuj¹ wskaĥniki
• Porównuje ró¿ne metody implementacji czêsto stosowanych abstrakcyjnych
typów danych
• Zawiera wskazówki na temat efektywnoġci, przenoġnoġci i zagadnieñ in¿ynierii
programowania, jak równie¿ ostrze¿enia o czêsto pope³nianych b³êdach
• Oferuje prosty, konwersacyjny styl, jasno opisuj¹cy trudne tematy, zawiera wiele
ilustracji i diagramów pomagaj¹cych z wizualizacji skomplikowanych zagadnieñ
• Opisuje wszystkie funkcje z biblioteki standardowej C.
O Autorze: Kenneth A. Reek jest Profesorem informatyki w Rochester Institute of
Technology i doġwiadczonym programist¹, który pracowa³ w wielu firmach jako
konsultant. Ksi¹¿ka ta powsta³a po dziewiêciu latach prowadzenia seminariów
z programowania w C. Profesor Reek prowadzi³ zajêcia na podstawowym i ġrednim
poziomie z systemów operacyjnych, telekomunikacji, sieci komputerowych, analizy
algorytmów i systemów prze³¹czaj¹cych.
5RKUVTGħEK
4QFKCđ
4QFKCđ
2TGFOQYC
5[DMKUVCTV
.........19
1.1. Wstęp ...................................................O...................................................O...............
1.1.1. Odstępy i komentarze ...................................................O.........................................22
1.1.2. Dyrektywy preprocesora...................................................O.....................................23
1.1.3. Funkcja main ...................................................O...................................................O...24
1.1.4. Funkcja czytaj_zakresy_kolumn ...................................................O........................27
1.1.5. Funkcja przeksztalc ...................................................O............................................32
1.2. Inne możliwości...................................................O...................................................O.....
...35
......35
1.3. Kompilacja...................................................O...................................................O..........
1.4. Podsumowanie ...................................................O...................................................O........
..35
1.5. Podsumowanie ostrzeżeń...................................................O.............................................36
1.6. Podsumowanie wskazówek ...................................................O.........................................36
.........37
1.7. Pytania ...................................................O...................................................O.............
1.8. Ćwiczenia...................................................O...................................................O...........
.......37
2QFUVCYQYGRQLúEKC
......39
2.1. Środowiska...................................................O...................................................O..........
2.1.1. Translacja...................................................O...................................................O........
.39
2.1.2. Wykonanie...................................................O...................................................O.......41
2.2. Zasady leksykalne...................................................O...................................................O...
..42
2.2.1. Znaki...................................................O...................................................O.............
...42
2.2.2. Komentarze...................................................O...................................................O......44
2.2.3. Dowolna postać kodu źródłowego ...................................................O.....................44
2.2.4. Identyfikatory ...................................................O...................................................O..45
2.2.5. Postać programu ...................................................O.................................................45
2.3. Styl programowania...................................................O...................................................O..46
2.4. Podsumowanie ...................................................O...................................................O........
..47
2.5. Podsumowanie ostrzeżeń...................................................O.............................................48
2.6. Podsumowanie wskazówek ...................................................O.........................................48
2.7. Pytania ...................................................O...................................................O.............
2.8. Ćwiczenia...................................................O...................................................O...........
.........48
.......50
4QFKCđ CPG
3.1. Podstawowe typy danych...................................................O.............................................51
3.1.1. Rodzina liczb całkowitych...................................................O..................................51
3.1.2. Typy zmiennoprzecinkowe...................................................O.................................55
3.1.3. Wskaźniki ...................................................O...................................................O........56
3.2. Podstawowe deklaracje...................................................O................................................58
3.2.1. Inicjalizacja...................................................O...................................................O.....
.59
3.2.2. Deklarowanie prostych tablic ...................................................O.............................59
6
Język C. Wskaźniki. Vademecum profesjonalisty
3.2.3. Deklaracja wskaźników...................................................O......................................60
3.2.4. Niejawne deklaracje ...................................................O...........................................61
3.3. Typedef ...................................................O...................................................O.............
3.4. Stałe ...................................................O...................................................O...............
3.5. Zasięg...................................................O...................................................O..............
........61
...........62
..........63
3.5.1. Zasięg ograniczony do bloku...................................................O..............................64
3.5.2. Zasięg ograniczony do pliku...................................................O...............................65
3.5.3. Zasięg ograniczony do prototypu ...................................................O.......................65
3.5.4. Zasięg ograniczony do funkcji ...................................................O...........................65
3.6. Sposób konsolidacji ...................................................O...................................................O.
.66
3.7. Klasa zapisu ...................................................O...................................................O........
......67
3.7.1. Inicjalizacja...................................................O...................................................O.....
.69
3.8. Słowo kluczowe static ...................................................O.................................................69
3.9. Przykład zasięgu, rodzaju łączenia i klas zapisu...................................................O............70
3.10. Podsumowanie ...................................................O...................................................O.......
.72
3.11. Podsumowanie ostrzeżeń...................................................O...........................................72
3.12. Podsumowanie wskazówek ...................................................O.......................................73
3.13. Pytania ...................................................O...................................................O............
........73
+PUVTWMELG
4.1. Instrukcja pusta ...................................................O...................................................O....
.....77
4.2. Instrukcja wyrażenia ...................................................O...................................................O.77
....78
4.3. Instrukcja bloku ...................................................O...................................................O....
........79
4.4. Instrukcja if ...................................................O...................................................O.......
4.5. Instrukcja while...................................................O...................................................O....
.....80
4.5.1. Instrukcje break i continue ...................................................O.................................80
4.5.2. Działanie pętli while...................................................O...........................................81
4.6. Instrukcja for...................................................O...................................................O......
.......82
4.6.1. Wykonanie pętli for ...................................................O............................................82
4.7. Instrukcja do ...................................................O...................................................O.......
4.8. Instrukcja switch ...................................................O...................................................O...
......83
....84
4.8.1. Instrukcja break w switch ...................................................O...................................85
4.8.2. Wartości domyślne ...................................................O.............................................86
4.8.3. Wykonanie instrukcji switch ...................................................O..............................86
4QFKCđ
.....87
4.9. Instrukcja goto ...................................................O...................................................O.....
4.10. Podsumowanie ...................................................O...................................................O.......
.89
4.11. Podsumowanie ostrzeżeń...................................................O...........................................90
4.12. Podsumowanie wskazówek ...................................................O.......................................90
4.13. Pytania ...................................................O...................................................O............
4.14. Ćwiczenia...................................................O...................................................O..........
........90
......92
4QFKCđ 1RGTCVQT[KY[TCľGPKC
.......95
5.1. Operatory ...................................................O...................................................O...........
5.1.1. Arytmetyka ...................................................O...................................................O......95
5.1.2. Przesunięcia ...................................................O...................................................O.....95
5.1.3. Operatory bitowe ...................................................O................................................97
5.1.4. Przypisania..................................O...................................................O........................98
5.1.5. Operatory jednoargumentowe ...................................................O..........................101
5.1.6. Operatory relacyjne ...................................................O..........................................103
5.1.7. Operatory logiczne ...................................................O...........................................104
5.1.8. Operator warunkowy ...................................................O........................................105
5.1.9. Operator przecinka ...................................................O...........................................105
5.1.10. Indeks, wywołanie funkcji i element struktury .................................................107
5.2. Wartości logiczne ...................................................O...................................................O...108
5.3. L-wartości i R-wartości ...................................................O.............................................109
Spis treści
7
5.4. Obliczanie wyrażeń...................................................O...................................................O.110
5.4.1. Niejawna konwersja typów ...................................................O..............................110
5.4.2. Konwersje arytmetyczne ...................................................O..................................111
5.4.3. Właściwości operatorów...................................................O...................................112
5.4.4. Priorytety i kolejność wykonywania ...................................................O................114
5.5. Podsumowanie ...................................................O...................................................O........116
5.6. Podsumowanie ostrzeżeń...................................................O...........................................118
5.7. Podsumowanie wskazówek ...................................................O.......................................118
5.8. Pytania ...................................................O...................................................O.............
5.9. Ćwiczenia...................................................O...................................................O...........
.......118
.....121
4QFKCđ 9UMCļPKMK
..123
6.1. Pamięć i adresy ...................................................O...................................................O.....
6.1.1. Adresy i zawartość...................................................O............................................124
6.2. Wartości i ich typy...................................................O...................................................O.
.124
6.3. Zawartość zmiennej wskaźnikowej ...................................................O...........................126
6.4. Operator dereferencji ...................................................O.................................................126
6.5. Niezainicjowane i nieprawidłowe wskaźniki ...................................................O............128
6.6. Wskaźnik NULL...................................................O...................................................O.....129
6.7. Wskaźniki, dereferencja i L-wartości ...................................................O........................130
6.8. Wskaźniki, dereferencja i zmienne...................................................O............................131
6.9. Stałe wskaźnikowe...................................................O...................................................O..131
6.10. Wskaźniki do wskaźników ...................................................O......................................132
6.11. Operacje na wskaźnikach...................................................O.........................................133
6.12. Przykłady ...................................................O...................................................O..........
6.13. Arytmetyka wskaźników ...................................................O.........................................141
6.13.1. Operacje arytmetyczne ...................................................O...................................142
6.13.2. Operacje relacyjne ...................................................O..........................................145
6.14. Podsumowanie ...................................................O...................................................O......146
6.15. Podsumowanie ostrzeżeń...................................................O.........................................147
6.16. Podsumowanie wskazówek ...................................................O.....................................147
......148
6.17. Pytania ...................................................O...................................................O............
6.18. Ćwiczenia...................................................O...................................................O..........
....150
(WPMELG
7.1. Definicja funkcji ...................................................O...................................................O...
..153
....138
7.1.1. Instrukcja return...................................................O................................................154
7.2. Deklaracje funkcji...................................................O...................................................O..
.155
7.2.1. Prototypy ...................................................O...................................................O.......155
7.2.2. Domyślne założenia dla funkcji ...................................................O.......................158
7.3. Argumenty funkcji...................................................O...................................................O..158
7.4. ATD i czarne skrzynki...................................................O...............................................162
7.5. Rekurencja ...................................................O...................................................O..........
....164
7.5.1. Śledzenie funkcji rekurencyjnych ...................................................O....................166
7.5.2. Rekurencja a iteracja ...................................................O........................................169
7.6. Zmienna lista argumentów...................................................O.........................................172
7.6.1. Makra stdarg ...................................................O...................................................O..173
7.6.2. Ograniczenia zmiennej listy argumentów ...................................................O........174
7.7. Podsumowanie ...................................................O...................................................O........175
7.8. Podsumowanie ostrzeżeń...................................................O...........................................176
7.9. Podsumowanie wskazówek ...................................................O.......................................176
7.10. Pytania ...................................................O...................................................O............
7.11. Ćwiczenia...................................................O...................................................O..........
......177
....178
4QFKCđ
8
Język C. Wskaźniki. Vademecum profesjonalisty
4QFKCđ
6CDNKEG
8.1. Tablice jednowymiarowe...................................................O...........................................179
8.1.1. Nazwy tablic ...................................................O...................................................O..179
8.1.2. Indeksy......................................O...................................................O........................180
8.1.3. Wskaźniki kontra indeksy ...................................................O................................183
8.1.4. Efektywność wskaźników ...................................................O................................184
8.1.5. Tablice i wskaźniki...................................................O...........................................190
8.1.6. Nazwy tablic i argumenty funkcji ...................................................O....................190
8.1.7. Deklarowanie parametrów tablicowych ...................................................O...........192
8.1.8. Inicjalizacja...................................................O...................................................O....192
8.1.9. Niekompletne inicjalizacje ...................................................O...............................193
8.1.10. Automatyczne określanie wielkości tablicy ...................................................O...194
8.1.11. Inicjalizacja tablicy znaków ...................................................O...........................194
8.2. Tablice wielowymiarowe...................................................O...........................................194
8.2.1. Kolejność zapisu...................................................O...............................................195
8.2.2. Nazwy tablic ...................................................O...................................................O..196
8.2.3. Indeksy......................................O...................................................O........................197
8.2.4. Wskaźniki na tablice...................................................O.........................................199
8.2.5. Tablice wielowymiarowe jako argumenty funkcji ..............................................200
8.2.6. Inicjalizacja...................................................O...................................................O....201
8.2.7. Automatyczne określanie wielkości tablic ...................................................O.......204
8.3. Tablice wskaźników ...................................................O..................................................204
8.4. Podsumowanie ...................................................O...................................................O........207
8.5. Podsumowanie ostrzeżeń...................................................O...........................................208
8.6. Podsumowanie wskazówek ...................................................O.......................................209
8.7. Pytania ...................................................O...................................................O.............
8.8. Ćwiczenia...................................................O...................................................O...........
.......209
.....213
4QFKCđ KæIKPCMKKDCLV[
9.1. Ciągi znaków — podstawy ...................................................O........................................219
9.2. Długość ciągu ...................................................O...................................................O.......
9.3. Nieograniczone funkcje operujące na ciągach...................................................O.............221
9.3.1. Kopiowanie ciągów ...................................................O..........................................221
9.3.2. Łączenie ciągów ...................................................O...............................................222
9.3.3. Wartość zwracana przez funkcję ...................................................O......................222
9.3.4. Porównywanie ciągów...................................................O......................................223
..219
9.4. Funkcje operujące na ciągach o ograniczonej długości ..................................................223
9.5. Proste wyszukiwanie w ciągach ...................................................O................................224
9.5.1. Wyszukiwanie znaków ...................................................O.....................................225
9.5.2. Wyszukiwanie dowolnego z kilku znaków ...................................................O......225
9.5.3. Wyszukiwanie podciągu...................................................O...................................225
9.6. Zaawansowane wyszukiwanie ciągów ...................................................O......................227
9.6.1. Wyszukiwanie przedrostków w ciągu ...................................................O..............227
9.6.2. Wyszukiwanie tokenów...................................................O....................................227
9.7. Komunikaty dotyczące błędów...................................................O..................................229
9.8. Operacje na znakach ...................................................O..................................................229
9.8.1. Klasyfikacja znaków...................................................O.........................................229
9.8.2. Transformacje znaków ...................................................O.....................................230
9.9. Operacje na pamięci...................................................O...................................................O230
9.10. Podsumowanie ...................................................O...................................................O......232
9.11. Podsumowanie ostrzeżeń...................................................O.........................................233
9.12. Podsumowanie wskazówek ...................................................O.....................................233
9.13. Pytania ...................................................O...................................................O............
9.14. Ćwiczenia...................................................O...................................................O..........
......234
....234
Spis treści
9
4QFKCđ 5VTWMVWT[KWPKG
10.1. Podstawy struktur ...................................................O...................................................O.241
10.1.1. Deklaracje struktur ...................................................O.........................................242
10.1.2. Składniki struktury ...................................................O.........................................243
10.1.3. Bezpośredni dostęp do składników ...................................................O................244
10.1.4. Pośredni dostęp do składników ...................................................O......................244
10.1.5. Struktury odwołujące się do samych siebie...................................................O....245
10.1.6. Niekompletne deklaracje ...................................................O................................246
10.1.7. Inicjalizacja struktur ...................................................O.......................................246
10.2. Struktury, wskaźniki i składniki ...................................................O..............................247
10.2.1. Odwołanie poprzez wskaźnik...................................................O.........................248
10.2.2. Odwoływanie się do struktury...................................................O........................248
10.2.3. Odwoływanie się do składników struktury ...................................................O....249
10.2.4. Odwoływanie się do zagnieżdżonej struktury ...................................................O251
10.2.5. Odwoływanie się do składnika wskaźnikowego ...............................................251
10.3. Sposób zapisu struktur ...................................................O.............................................253
10.4. Struktury jako argumenty funkcji ...................................................O............................254
10.5. Pola bitowe ...................................................O...................................................O........
10.6. Unie...................................................O...................................................O...............
...257
........260
10.6.1. Rekordy z wariantami...................................................O.....................................261
10.6.2. Inicjalizacja unii ...................................................O.............................................262
10.7. Podsumowanie ...................................................O...................................................O......263
10.8. Podsumowanie ostrzeżeń...................................................O.........................................264
10.9. Podsumowanie wskazówek ...................................................O.....................................264
10.10. Pytania ...................................................O...................................................O...........
10.11. Ćwiczenia...................................................O...................................................O.........
.....264
...267
4QFKCđ [PCOKEPGRT[FKGNCPKGRCOKúEK
11.1. Dlaczego korzystamy z dynamicznego przydzielania pamięci ..................................271
11.2. Funkcje malloc i free ...................................................O...............................................271
11.3. Funkcje calloc i realloc ...................................................O............................................273
11.4. Wykorzystanie dynamicznie przydzielanej pamięci...................................................O273
11.5. Częste błędy pamięci dynamicznej...................................................O..........................274
11.5.1. Wycieki pamięci ...................................................O.............................................277
11.6. Przykłady przydzielania pamięci ...................................................O.............................277
11.7. Podsumowanie ...................................................O...................................................O......283
11.8. Podsumowanie ostrzeżeń...................................................O.........................................283
11.9. Podsumowanie wskazówek ...................................................O.....................................283
11.10. Pytania ...................................................O...................................................O...........
11.11. Ćwiczenia...................................................O...................................................O.........
.....284
...285
4QFKCđ 9[MQT[UVCPKGUVTWMVWTKYUMCļPKMÎY
........287
12.1. Listy ...................................................O...................................................O..............
12.2. Lista jednokierunkowa...................................................O.............................................287
12.2.1. Wstawianie węzłów do listy jednokierunkowej ................................................288
12.2.2. Inne operacje na listach ...................................................O..................................297
12.3. Lista dwukierunkowa...................................................O...............................................298
12.3.1. Wstawianie do listy dwukierunkowej...................................................O.............298
12.3.2. Inne operacje na listach ...................................................O..................................306
12.4. Podsumowanie ...................................................O...................................................O......307
12.5. Podsumowanie ostrzeżeń...................................................O.........................................307
12.6. Podsumowanie wskazówek ...................................................O.....................................308
12.7. Pytania ...................................................O...................................................O............
12.8. Ćwiczenia...................................................O...................................................O..........
......308
....308
10
Język C. Wskaźniki. Vademecum profesjonalisty
4QFKCđ CCYCPUQYCPGCICFPKGPKCFQV[EæEGYUMCļPKMÎY
13.1. Więcej o wskaźnikach do wskaźników ...................................................O...................311
13.2. Deklaracje zaawansowane ...................................................O.......................................313
13.3. Wskaźniki do funkcji ...................................................O...............................................315
13.3.1. Funkcje wywołania zwrotnego...................................................O.......................316
13.3.2. Tablice skoków...................................................O...............................................319
13.4. Argumenty wiersza poleceń...................................................O.....................................321
13.4.1. Przekazywanie argumentów wiersza poleceń ...................................................O321
13.4.2. Przetwarzanie argumentów wiersza poleceń...................................................O..323
13.5. Literały ciągów znaków...................................................O...........................................326
13.6. Podsumowanie ...................................................O...................................................O......328
13.7. Podsumowanie ostrzeżeń...................................................O.........................................329
13.8. Podsumowanie wskazówek ...................................................O.....................................329
13.9. Pytania ...................................................O...................................................O............
13.10. Ćwiczenia...................................................O...................................................O.........
......330
...333
4QFKCđ 2TGRTQEGUQT
14.1. Symbole predefiniowane ...................................................O.........................................337
14.2. #define ...................................................O...................................................O............
......337
14.2.1. Makra...................................................O...................................................O...........339
14.2.2. Podstawianie za pomocą #define...................................................O....................340
14.2.3. Makra kontra funkcje...................................................O......................................341
14.2.4. Argumenty makr z efektami ubocznymi ...................................................O........342
14.2.5. Konwencje nazewnictwa ...................................................O................................343
14.2.6. #undef ...................................................O...................................................O..........344
14.2.7. Definicje z wiersza poleceń...................................................O............................345
14.3. Kompilacja warunkowa ...................................................O...........................................345
14.3.1. #if defined...................................................O...................................................O....347
14.3.2. Dyrektywy zagnieżdżone ...................................................O...............................347
14.4. Dołączanie plików ...................................................O...................................................O348
14.4.1. Dołączanie biblioteczne...................................................O..................................349
14.4.2. Dołączanie lokalne ...................................................O.........................................349
14.4.3. Zagnieżdżone dołączanie plików...................................................O....................350
14.5. Inne dyrektywy ...................................................O...................................................O.....351
14.6. Podsumowanie ...................................................O...................................................O......352
14.7. Podsumowanie ostrzeżeń...................................................O.........................................353
14.8. Podsumowanie wskazówek ...................................................O.....................................354
14.9. Pytania ...................................................O...................................................O............
14.10. Ćwiczenia...................................................O...................................................O.........
......354
...356
4QFKCđ (WPMELGYGLħEKCY[LħEKC
15.1. Raportowanie błędów ...................................................O..............................................357
15.2. Przerywanie działania ...................................................O..............................................358
15.3. Standardowa biblioteka wejścia-wyjścia ...................................................O.................358
15.4. Założenia wejścia-wyjścia ANSI...................................................O.............................359
15.4.1 Strumienie...................................................O...................................................O.....359
15.4.2. Struktury FILE...................................................O................................................361
15.4.3. Standardowe stałe wejścia-wyjścia ...................................................O................361
15.5. Przegląd strumieniowego wejścia-wyjścia ...................................................O..............362
15.6. Otwieranie strumieni...................................................O................................................363
15.7. Zamykanie strumieni ...................................................O...............................................365
15.8. Znakowe wejście-wyjście ...................................................O........................................366
15.8.1. Makra znakowego wejścia-wyjścia ...................................................O................367
15.8.2. Wycofywanie operacji znakowego wejścia-wyjścia .........................................368
15.9. Niesformatowane wierszowe wejście-wyjście ...................................................O........369
Spis treści
11
15.10. Formatowane wierszowe wejście-wyjście...................................................O.............371
15.10.1. Rodzina scanf ...................................................O...............................................371
15.10.2. Kody formatujące funkcji scanf ...................................................O...................371
15.10.3. Rodzina printf ...................................................O...............................................376
15.10.4. Kody formatujące printf ...................................................O...............................376
15.11. Binarne wejście-wyjście ...................................................O........................................380
15.12. Funkcje wyszukujące i opróżniające bufory...................................................O..........381
15.13. Zmiana buforowania ...................................................O..............................................384
15.14. Funkcje obsługi błędów strumienia ...................................................O.......................385
15.15. Pliki tymczasowe ...................................................O...................................................O385
15.16. Funkcje do manipulacji plikami ...................................................O............................386
15.17. Podsumowanie ...................................................O...................................................O....386
15.18. Podsumowanie ostrzeżeń...................................................O.......................................388
15.19. Podsumowanie wskazówek ...................................................O...................................389
15.20. Pytania ...................................................O...................................................O...........
15.21. Ćwiczenia...................................................O...................................................O.........
.....389
...390
4QFKCđ $KDNKQVGMCUVCPFCTFQYC
16.1. Funkcje typu całkowitego...................................................O........................................395
16.1.1. Arytmetyka stdlib.h ...................................................O....................................395
16.1.2. Liczby losowe stdlib.h ...................................................O...............................396
16.1.3. Konwersja ciągów znaków stdlib.h ...................................................O...........397
16.2. Funkcje zmiennoprzecinkowe ...................................................O.................................398
16.2.1. Trygonometria math.h ...................................................O................................399
16.2.2. Funkcje hiperboliczne math.h ...................................................O....................399
16.2.3. Funkcje logarytmiczne i wykładnicze math.h ...............................................399
16.2.4. Reprezentacja zmiennoprzecinkowa math.h .................................................400
16.2.5. Potęgowanie math.h ...................................................O...................................400
16.2.6. Podłoga, sufit, wartość bezwzględna i reszta math.h ....................................400
16.2.7. Konwersja ciągów znaków stdlib.h ...................................................O...........401
16.3. Funkcje daty i czasu...................................................O.................................................401
16.3.1. Czas procesora time.h ...................................................O................................401
16.3.2. Data i godzina time.h ...................................................O.................................402
16.4. Skoki nielokalne setjmp.h ...................................................O...................................405
16.4.1. Przykład ...................................................O...................................................O.......406
16.4.2. Kiedy używać nielokalnych skoków ...................................................O..............408
16.5. Sygnały ...................................................O...................................................O............
.....408
16.5.1. Nazwy sygnałów signal.h ...................................................O..........................408
16.5.2. Przetwarzanie sygnałów signal.h ...................................................O...............410
16.5.3. Obsługa sygnałów...................................................O...........................................411
16.6. Drukowanie list zmiennych argumentów stdarg.h .................................................413
16.7. Środowisko wykonania...................................................O............................................413
16.7.1. Przerwanie działania stdlib.h ...................................................O.....................413
16.7.2. Asercje assert.h ...................................................O..........................................414
16.7.3. Środowisko stdlib.h ...................................................O....................................415
16.7.4. Wykonywanie poleceń systemowych stdlib.h ..............................................415
16.8. Sortowanie i wyszukiwanie stdlib.h ...................................................O....................415
16.9. Ustawienia międzynarodowe...................................................O...................................418
16.9.1. Formatowanie numeryczne i monetarne locale.h .........................................419
16.9.2. Ciągi znaków i ustawienia regionalne string.h .............................................421
16.9.3. Efekty zmiany ustawień regionalnych...................................................O............422
16.10. Podsumowanie ...................................................O...................................................O....422
16.11. Podsumowanie ostrzeżeń...................................................O.......................................424
16.12. Podsumowanie wskazówek ...................................................O...................................424
16.13. Pytania ...................................................O...................................................O...........
16.14. Ćwiczenia...................................................O...................................................O.........
.....425
...426
12
Język C. Wskaźniki. Vademecum profesjonalisty
4QFKCđ -NCU[EPGRT[MđCF[CDUVTCME[LP[EJV[RÎYFCP[EJ
17.1. Przydział pamięci...................................................O...................................................O..429
17.2. Stosy...................................................O...................................................O..............
........430
17.2.1. Interfejs stosu...................................................O..................................................430
17.2.2. Implementacja stosu ...................................................O.......................................430
17.3. Kolejki ...................................................O...................................................O............
......438
17.3.1. Interfejs kolejki...................................................O...............................................439
17.3.2. Implementacja kolejki ...................................................O....................................440
17.4. Drzewa ...................................................O...................................................O.............
.....444
17.4.1. Wstawianie wartości do uporządkowanego drzewa binarnego............................445
17.4.2. Usuwanie wartości z uporządkowanego drzewa binarnego ..............................445
17.4.3. Wyszukiwanie wartości w uporządkowanym drzewie binarnym ........................446
17.4.4. Przeglądanie drzewa ...................................................O.......................................446
17.4.5. Interfejs uporządkowanego drzewa binarnego ..................................................448
17.4.6. Implementacja uporządkowanego drzewa binarnego........................................448
17.5. Usprawnienia implementacji ...................................................O...................................455
17.5.1. Utworzenie więcej niż jednego stosu ...................................................O.............455
17.5.2. Wykorzystywanie więcej niż jednego typu ...................................................O....456
17.5.3. Konflikty nazw ...................................................O...............................................457
17.5.4. Standardowe biblioteki ATD...................................................O..........................457
17.6. Podsumowanie ...................................................O...................................................O......460
17.7. Podsumowanie ostrzeżeń...................................................O.........................................461
17.8. Podsumowanie wskazówek ...................................................O.....................................461
17.9. Pytania ...................................................O...................................................O............
17.10. Ćwiczenia...................................................O...................................................O.........
......462
...463
4QFKCđ ĦTQFQYKUMQY[MQPCPKC
18.1. Określanie cech środowiska wykonania ...................................................O..................465
18.1.1. Program testowy ...................................................O.............................................465
18.1.2 Zmienne statyczne i inicjalizacja...................................................O.....................468
18.1.3. Ramka stosu...................................................O...................................................O.469
18.1.4. Zmienne register ...................................................O.............................................470
18.1.5. Długość identyfikatorów zewnętrznych ...................................................O.........471
18.1.6. Określanie układu ramki stosu ...................................................O.......................472
18.1.7. Efekty uboczne wyrażeń...................................................O.................................477
18.2. Współpraca z kodem asemblera ...................................................O..............................478
18.3. Efektywność działania ...................................................O.............................................479
18.3.1. Poprawianie wydajności ...................................................O.................................480
18.4. Podsumowanie ...................................................O...................................................O......482
18.5. Podsumowanie ostrzeżeń...................................................O.........................................482
18.6. Podsumowanie wskazówek ...................................................O.....................................483
18.7. Pytania ...................................................O...................................................O............
18.8. Ćwiczenia...................................................O...................................................O..........
......483
....483
QFCVGM# 9[DTCPGTQYKæCPKCRTQDNGOÎY
QFCVGM$
$KDNKQITCHKC
5MQTQYKF
Rozdział 12.
9[MQT[UVCPKGUVTWMVWT
KYUMCļPKMÎY
Łącząc ze sobą wskaźniki i struktury, można tworzyć bardzo efektywne struktury danych.
W rozdziale tym przyjrzymy się kilku technikom wykorzystania struktur i wskaźników.
Wiele czasu poświęcimy strukturze nazywanej listą — nie tylko dlatego, że jest bardzo
użyteczna, ale również dlatego, że wiele z technik wykorzystywanych do manipulowania
listą można również stosować do innych struktur danwych.
.KUV[
Jeżeli nie jesteś zaznajomiony z pojęciem listy, nakreślę krótkie wprowadzenie. Lista to
zbiór niezależnych struktur (często nazywanych węzłami), zawierających dane. Poszcze-
gólne węzły na liście są połączone ze sobą za pomocą połączeń lub wskaźników. Program
odwołuje się do węzłów listy podążając za wskaźnikami. Zwykle węzły są tworzone
dynamicznie, choć czasami można spotkać się z listą skonstruowaną z elementów tablicy
węzłów. Nawet w takim przypadku program przegląda listę wpodążając za wskaźnikami.
.KUVCLGFPQMKGTWPMQYC
Na liście jednokierunkowej każdy węzeł zawiera wskaźnik do następnego węzła listy.
Pole wskaźnikowe w ostatnim elemencie zawiera wartość 07.., wskazując, że na liście
nie ma już więcej węzłów. Aby pamiętać, w którym miejscu lista się zaczyna, wykorzy-
stywany jest wskaźnik nazywany korzeniem lub głową listy. Wskaźnik korzenia wska-
zuje na pierwszy element listy. Zwróć uwagę, że korzeńw nie zawiera żadnych danych.
Poniżej przedstawiono diagram listy jednokierunkowejw.
288
Język C. Wskaźniki. Vademecum profesjonalisty
Węzły z tego przykładu są strukturami utworzonymi na pwodstawie następujących deklaracji.
V[RGFGHUVTWEV9 .]
UVTWEV9 .RQNCEGPKG
KPVYCTVQUE
_9GGN
W każdym z węzłów zapisywana jest jedna dana — liczba KPV. Przedstawiona lista zawiera
trzy węzły. Jeżeli zaczniemy od korzenia i za wskaźnikiem podążymy do pierwszego węzła,
możemy uzyskać dostęp do danych zapisanych w tym węźle. Podążając za wskaźnikiem,
przechodzimy z pierwszego węzła do drugiego i uzyskujemy dostęp do jego danych. Na
koniec następny wskaźnik przenosi nas do ostatniego węzła. Wartość zero została wyko-
rzystana do pokazania wskaźnika 07..; oznacza on, że na liście nie ma już więcej węzłów.
Na diagramie węzły zostały umieszczone obok siebie w celu pokazania logicznego
uporządkowania zapewnianego przez połączenia. W rzeczywistości węzły mogą być roz-
siane po całej pamięci. Dla programu przetwarzającego taką listę nie ma żadnej różnicy,
czy węzły sąsiadują ze sobą czy nie, ponieważ program zawsze korzysta z połączeń, aby
przejść z jednego węzła do drugiego.
Lista jednokierunkowa może być przeglądana od początku do końca dzięki podążaniu
za wskaźnikami, ale nie można jej przeglądać wstecz. Inaczej mówiąc, gdy program
dojdzie do ostatniego węzła listy, jedyną możliwością cofnięcia się jest wykorzystanie
wskaźnika korzenia. Oczywiście program może zapamiętać wskaźnik do bieżącego węzła
przed przejściem do następnego węzła, może nawet zapamiętywać wskaźniki wskazujące
na kilka kolejnych węzłów. Jednak lista jest strukturą dynamiczną i może zwiększyć się
do kilkuset lub kilku tysięcy węzłów — nierealne jest więc zapamiętywanie wskaźników
do wszystkich poprzednich węzłów w liście.
Węzły przedstawionej listy są połączone w taki sposób, że wartości w węzłach są uporząd-
kowane w kolejności rosnącej. Takie uporządkowanie jest ważne w przypadku niektórych
aplikacji, na przykład dla porządkowania spotkań względem czasu. Możliwe jest również
tworzenie listy nieuporządkowanej, jeżeli aplikacjaw nie wymaga uporządkowania.
9UVCYKCPKGYúđÎYFQNKUV[LGFPQMKGTWPMQYGLK
W jaki sposób należy wstawiać nowy węzeł do uporządkowanej listy jednokierunkowej?
Załóżmy, że mamy nową wartość — 12 — i musimy wstawić ją do przedstawionej po-
wyżej listy. Pod względem koncepcyjnnym zadanie jest proste: zaczynamy od początku
listy i podążamy za wskaźnikami, aż znajdziemy pierwszy węzeł o wartości większej
niż 12. Wstawiamy wówczas nową wartość do listy przed wznalezionym węzłem.
W praktyce algorytm jest bardziej interesujący. Przeglądamy listę i zatrzymujemy się,
gdy osiągniemy węzeł z wartością 15 — pierwszy, który jest większy od 12. Wiemy, że
nowa wartość musi być dodana do listy bezpośrednio przed tym węzłem, ale przed reali-
zacją tej operacji zmienione musi zostać pole wskaźnikowe poprzedniego węzła; tym-
czasem my nie możemy się cofnąć. Rozwiązaniem jest zapamiętywanie wskaźnika do
poprzedniego węzła.
Teraz możemy zaprojektować funkcję wstawiającą węzeł do uporządkowanej listy jedno-
kierunkowej. W listingu 12.1 przedstawiamy pierwsze podejście do tego problemu.
Rozdział 12. Wykorzystanie struktur i wskaźników
289
.KUVKPI Wstawianie węzła do uporządkowanej listy jednokierunkowej — pierwsza próba (wstaw1.c)
9UVCYKCPKGYúđCFQWRQTæFMQYCPGLNKUV[LGFPQMKGWTWPMQYGL#TIWOGPVCOK
UæYUMCļPKMFQRKGTYUGIQYúđCNKUV[KYCTVQħèFQWYUVCYKGPKC
KPENWFGUVFNKDJ
KPENWFGUVFKQJ
KPENWFGYGGNARQLJ
FGHKPG(#.5
FGHKPG647
KPV
YUVCYANKUVCARQL
9GGNDKGKPVPQYCAYCTV
]
9GGNRQRT
9GGNPQY[
5WMCPKGYđCħEKYGIQOKGLUECRQRTGRTGINæFCPKGWNKUV[
FQOQOGPVWPCNGKGPKCYúđCMVÎTGIQYCTVQħèLGUVYKúMUC
NWDTÎYPCPQYGLYCTVQħEK
YJKNG
DKGŌ YCTVQUEPQYCAYCTV]
RQRTDKG
DKGDKGŌ RQNCEGPKG
_
7VYQTGPKGPQYGIQYúđCKCRCOKúVCPKGYPKOPQWYGLYCTVQħEK
9RT[RCFMWPKGRQYQFGPKCYTCECPCLGUVYCTVQħè(#.5
PQY[
9GGNOCNNQE
UKGQH
9GGN
KH
PQY[07..
TGVWTP(#.5
PQY[Ō YCTVQUEPQYCAYCTV
9UVCYKGPKGPQYGIQYúđCFQNKUV[KYTÎEGPKGWYCTVQħEK647
PQY[Ō RQNCEGPKGDKG
RQRTŌ RQNCEGPKGPQY[
TGVWTP647
_
Funkcję tę wywołujemy w następujący sposób:
Y[PKMYUVCYANKUVCARQL
MQTGP
Prześledźmy kod, aby sprawdzić, czy wartość 12 jest prawidłowo wstawiana do listy.
Na początek funkcja jest wywoływana z wartością zmiennej MQTGP, która jest wskaźni-
kiem na pierwszy węzeł listy. Poniżej przedstawiono stan listy na początku wykonywania
funkcji:
290
Język C. Wskaźniki. Vademecum profesjonalisty
Diagram ten nie zawiera zmiennej MQTGP, ponieważ funkcja nie może się do niej odwo-
ływać. Kopia jej wartości jest przekazana do funkcji jako parametr DKG, ale funkcja nie
może odwoływać się do MQTGP. Teraz DKGŌ YCTVQUE jest równe 5, czyli mniej niż 12
— wykonywane jest więc ciało pętli, w którym przesuwanwe są nasze wskaźniki.
W chwili obecnej DKGŌ YCTVQUE jest równe 10, więc ciało pętli jest wykonywane kolejny
raz, co daje następujący wynik:
Teraz DKGŌ YCTVQUE jest większe od 12, więc pętla jest przerywana.
W tym momencie ważny staje się wskaźnik RQRT, ponieważ wskazuje na węzeł, który
musi zostać zmieniony, aby możliwe było dodanie nowej wartości. Na początek należy
jednak utworzyć nowy węzeł i zapisać w nim wartość. Następny diagram pokazuje stan
listy po skopiowaniu wartości do nowego węzła.
Rozdział 12. Wykorzystanie struktur i wskaźników
291
Włączenie nowego węzła do listy wymaga wykonania dwóch wkroków. Pierwszym jest:
PQY[Ō RQNCEGPKGDKG
co powoduje, że nowy węzeł wskazuje na węzeł będący następnym węzłem na liście —
pierwszym, którego wartość jest większa niż 12. Po tej operacji lista wygląda następująco:
Drugim krokiem jest zmiana wskaźnika w poprzednim węźle — ostatnim o wartości
mniejszej niż 12 — tak, aby wskazywał na nowy węzeł. Operacja ta jest wykonywana
przez instrukcję:
RQRTŌ RQNCEGPKGPQY[
Wynikiem wykonania tego kroku jest:
292
Język C. Wskaźniki. Vademecum profesjonalisty
Funkcja kończy się, pozostawiając listę w następującymw stanie:
Rozpoczynając od wskaźnika MQTGP i podążając za wskaźnikami, możemy sprawdzić,
że nowy węzeł został prawidłowo wstawiony.
7UWYCPKGDđúFÎYHWPMELKYUVCYKCLæEGL
Niestety funkcja wstawiająca jest nieprawidłowa. Spróbuj wstawić do listy wartość 20,
a zobaczysz, na czym polega problem; pętla YJKNG przejdzie poza koniec listy i wykona
dereferencję wskaźnika 07... Aby rozwiązać ten problem, musimy przed obliczeniem
DKGŌ YCTVQUE sprawdzać, czy wskaźnik DKG jest różny od 07...
YJKNG
DKG07..DKGŌ YCTVQUEYCTVQUE]
Następny problem jest poważniejszy. Prześledź zachowanie funkcji podczas wstawiania
do listy wartości 3. Co się dzieje?
Aby wstawić element na początek listy, funkcja musi zmienić wskaźnik MQTGP. Funkcja
jednak nie może odwoływać się do wartości MQTGP. Najprostszym sposobem naprawienia
tego problemu jest zmiana zmiennej MQTGP na zmienną globalną, dzięki czemu funkcja
wstawiająca mogłaby ją modyfikować. Niestety podejście to jest najgorszym sposobem
rozwiązania tego problemu, ponieważ funkcja mogłaby być używana tylko dla jednej listy.
Lepszym rozwiązaniem jest przekazywanie wskaźnika do MQTGP jako argumentu. Funkcja
mogłaby wykonywać dereferencję zarówno w celu pobrania wartości MQTGP (wskaźnika
do pierwszego elementu listy), jak i zapisywania nowej wartość wskaźnika. Jaki powinien
być typ takiego parametru? Zmienna MQTGP jest wskaźnikiem na 9GGN, więc parametr
powinien mieć typ 9GGN: wskaźnik do wskaźnika na 9GGN. Funkcja zamieszczona
w listingu 12.2 zawiera te modyfikacje. Funkcję tę należy wywoływać w następujący
sposób:
Y[PKMYUVCYANKUVCARQL
MQTGP
.KUVKPI Wstawianie węzła do uporządkowanej listy jednokieręunkowej — druga próba (wstaw2.c)
9UVCYKCPKGFQWRQTæFMQYCPGLNKUV[LGFPQMKGTWPMQYGL#TIWOGPVCOK
UæYUMCļPKMFQYUMCļPKMCMQTGPKCNKUV[KYCTVQħèWFQYUVCYKGPKC
Rozdział 12. Wykorzystanie struktur i wskaźników
293
KPENWFGUVFNKDJ
KPENWFGUVFKQJ
KPENWFGYGGNARQLJ
FGHKPG(#.5
FGHKPG647
KPV
YUVCYANKUVCARQL
9GGNMQTGPAYUMKPVPQYCAYCTV
]
9GGNDKG
9GGNRQRT
9GGNPQY[
2QDTCPKGYUMCļPKMCFQRKGTYUGIQYúđC
DKGMQTGPAYUM
RQRT07..
5WMCPKGYđCħEKYGIQOKGLUECRQRTGRTGINæFCPKGWNKUV[
FQOQOGPVWPCNGKGPKCYúđCMVÎTGIQYCTVQħèLGUWVYKúMUC
NWDTÎYPCPQYGLYCTVQħEK
YJKNG
DKG07..DKGŌ YCTVQUEPQYCAYCTV]
RQRTDKG
DKGDKGŌ RQNCEGPKG
_
7VYQTGPKGPQYGIQYúđCKCRCOKúVCPKGYPKOPQYGLYCTVQħEK
9RT[RCFMWPKGRQYQFGPKCYTCECPCLGUVYCTVWQħè(#.5
PQY[
9GGNOCNNQE
UKGQH
9GGN
KH
PQY[07..
TGVWTP(#.5
PQY[Ō YCTVQUEPQYCAYCTV
9UVCYKGPKGPQYGIQYúđCFQNKUV[KYTÎEGPKGWYCTVQħEK647
PQY[Ō RQNCEGPKGDKG
KH
RQRT07..
MQTGPAYUMPQY[
GNUG
RQRTŌ RQNCEGPKGPQY[
TGVWTP647
_
Ta druga wersja zawiera kilka dodatkowych instrukcjiw:
RQRT07..
Instrukcja ta jest niezbędna, ponieważ później możemy sprawdzić, czy nowa wartość
powinna być pierwszym węzłem na liście.
DKGMQTGPAYUM
294
Język C. Wskaźniki. Vademecum profesjonalisty
Wykorzystano tu dereferencję na argumencie będącym wswkaźnikiem do korzenia, dzięki
czemu pobraliśmy wartość wskaźnika MQTGP — wskaźnika do pierwszego węzła listy.
Na koniec funkcji dodane zostały instrukcje:
KH
RQRT07..
MQTGPAYUMPQY[
GNUG
RQRTŌ RQNCEGPKGPQY[
Sprawdzają one, czy nowa wartość powinna być włączona na początku listy. Jeżeli tak, za
pomocą dereferencji modyfikujemy wskaźnik MQTGP t
Pobierz darmowy fragment (pdf)