5 WSKAŹNIKI I TABLICE
Stałe napisowe chyba najczęściej występują jako argumenty funkcji, jak w wywołaniu printf(”ahoj, przygodo\n”);
Gdy taki ciąg znaków pojawia się w programie, wówczas dostęp do niego jest realizowany za pomocą wskaźnika znakowego; funkcja printf otrzymuje wskaźnik do początku tablicy znaków. Oznacza to, że stała napisowa jest dostępna poprzez wskaźnik
do swojego pierwszego znaku.
•
Stałe napisowe nie muszą być argumentami funkcji. Jeśli pmessage zadeklarowano tak:
char *pmessage; /* wskaźnik do komunikatu */ to w instrukcji
pmessage = "nadszedł czas”;
zmiennej pmessage przypisuje się wskaźnik do określonej tablicy znaków. To nie jest kopia napisu; tu są zaangażowane wyłącznie wskaźniki. W języku C nie ma operacji do obsługi ciągów znaków traktowanych jako całość.
Zachodzi istotna różnica między takimi definicjami:
char amessage[] = "nadszedł czas"; /* tablica */ char *pmessage = "nadszedł czas”; /* wskaźnik */
amessage jest tablicą wystarczająco dużą, aby pomieścić swój inicjator, czyli ciąg znaków zakończony znakiem ’\0\ Poszczególne znaki w tablicy można zmieniać, ale nazwa amessage zawsze będzie odwołaniem do tego samego miejsca w pamięci. Z drugiej strony, pmessage jest wskaźnikiem zainicjowanym tak, aby wskazywał stałą napisową; wskaźnik można później zmieniać, by wskazywał na cokolwiek, ale próba zmiany w stałej napisowej ma skutek nieokreślony.
pmessage:
amessage:
Więcej właściwości wskaźników i tablic omówimy przy prezentacji dwóch pożytecznych funkcji pochodzących z biblioteki standardowej. Pierwsza z funkcji - strcpy(s,t) - kopiuje tekst z t do s. Byłoby bardzo przyjemnie, gdyby można byk napisać s = t, ale niestety taki zapis zamiast znaków kopiuje jedynie wskaźnik
I* strcpy: skopiuj t do s; wersja z indeksowaniem tablic */ void strcpy(char *s, char *t)
int i;
i = 0;
while ((s[i] = t[i]) != ’\0’) i++;
I dla porównania ta sama funkcja w wersji wskaźnikowej:
I* strcpy: skopiuj t do s; wersja wskaźnikowa 1 */ void strcpy(char *s, char *t)
while ((*s = *t) != ’\0') { s++; t++;
Argumenty są przekazywane funkcjom „przez wartość”, a więc z parametrów s i t funkcja Strcpy może korzystać, jak jej się podoba. Tutaj parametrami są dogodnie inicjowane wskaźniki, które jednocześnie maszerują wzdłuż tablic aż do napotkania znaku ’\0’ kończącego tekst w t i skopiowania go do s.
W praktyce funkcję strcpy pisze się jeszcze inaczej, niż pokazaliśmy. Programiści z doświadczeniem w języku C napisaliby ją raczej tak:
I* strcpy: skopiuj t do s; wersja wskaźnikowa 2 */ void strcpy(char *s, char *t)
while ((*s++ = *t++) != ’\0’)
f
Zwiększenie wskaźników s i t zostało przeniesione do części warunkowej pętli. Wartością operacji *t++ jest znak, na który wskazywał wskaźnik t przed zwiększeniem;
145
Język ANSI C
io -