5 WSKAŹNIKI I TABLICE
oba zapisy a[3][4] i b[31[4] są poprawnymi odwołaniami do pojedynczego obiekty typu int. Lecz a jest prawdziwą dwuwymiarową tablicą: zarezerwowano dla niej 200 miejsc o rozmiarze odpowiednim dla typu int, a do znalezienia elementu tablicy a[mersz][kolumna\ stosuje się tradycyjny przepis na wyliczenie indeksu dla tablic prostokątnych: 20 * wiersz + kolumna. Natomiast definicja b przydziela jedynie 10 miejsc pamięci na wskaźniki i nie inicjuje ich; nadanie wartości początkowych musi być zrobione jawnie - statycznie lub programowo. Przypuśćmy, że w istocie każdy z elementów tablicy b wskazuje na tablicę 20 elementów całkowitych. Wówczas mamy zarezerwowanych 200 miejsc pamięci na wartości całkowite plus te dziesięć komórek na wskaźniki. Ważną przewagą tablicy wskaźników jest to, że wiersze tablicy mogą mieć różne długości. W takim razie nie* wszystkie elementy tablicy b muszą wskazywać na dwudziestoelementowe wektory; kilka z nich może wskazywać na wektory dwuelementowe, inne - na pięćdziesięcioelementowe, a jeszcze inne mog$ w ogóle na nic nie wskazywać.
Chociaż ograniczyliśmy rozważania wyłącznie do obiektów całkowitych, w rzeczywistości z tablic wskaźników korzysta się najczęściej w sposób podobny do przedstawionego w funkcji month_name: zapamiętuje się w nich teksty o różnych długościach. Porównaj deklarację i ilustrację tablicy wskaźników:
char *name[] = { "Błędny miesiąc”, "Sty”, "Lut”, "Mar” };
name:
z deklaracją i ilustracją tablicy dwuwymiarowej:
char aname[J[15] = {"Błędny miesiąc”, "Sty”, "Lut”, "Mar” }; aname:
Błędny miesiąc \o Sty \o Lut\o Mar\o "~~~J
0 15 30 45
Ćwiczenie 5.9. Napisz na nowo funkcje day^of_year i month-day, stosuj# wskaźniki zamiast indeksowania tablic.
5.10 ARGUMENTY wywołania programu
powered by
Mi siol
W środowiskach wyposażonych w C do uruchamianego programu można przekazać parametry, czyli argumenty wywołania, w wierszu polecenia wywołującego program. Działanie każdego programu rozpoczyna się wywołaniem funkcji main z dwoma argumentami. Pierwszy, umownie nazwany argc (od ang. argument count\ jest liczbą argumentów, z jakimi program został wywołany; drugi, argv (od ang. argument vector), jest wskaźnikiem do tablicy zawierającej argumenty, każdy argument jako osobny tekst. Do operowania na tych tekstach zwyczajowo stosujemy kilka poziomów wskaźników.
Najprostszym przykładem jest program echo, który jak echo powtarza argumenty swego wywołania, wypisując je w osobnym wierszu rozdzielone odstępami. Jeśli więc polecenie miało postać.
echo ahoj, przygodo
to wynikiem programu będzie wiersz
ahoj, przygodo
Zgodnie z przyjętą konwencją argv[0] jest nazwą, z jaką program został wywołany, licznik argc jest więc co najmniej równy l. Wartość argc równa 1 oznacza, że w wierszu polecenia po nazwie programu nie było argumentów. W powyższym przykładzie argc równa się 3, a argv[0], argv[1] i argv[2] wskazują odpowiednio napisy 'echo”, ”ahoj,” i "przygodo”. Pierwszym prawdziwym argumentem jest argv[1], a ostatnim argv[argc-1]; dodatkowo standard wymaga, aby element argv[argc] był wskaźnikiem pustym, tj. równym NULL.
argv:
echo \o | ||||
ahoj, \o
przygodo \o
Pierwsza wersja programu echo traktuje argv jak tablicę wskaźników do znaków: #include <stdio.h>
/* echo argumentów wywołania; wersja 1 */ main(int argc, char *argv[ ])
{
int i;
157