ANSI C 1

ANSI C 1



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 -


Wyszukiwarka

Podobne podstrony:
ANSI C 1 5 WSKAŹNIKI I TABLICE------- if (left >= right) /* nic nie rób, jeśli tablica zawiera
Instrukcja AX up by dunaj2 1 Wskaźniki tablicy rozdzielczej Powinna być zgaszona, gdy ślin pracuj
ANSI C 4 WSKAŹNIKI I TABLICE Wskaźnik jest zmienną, która zawiera adres innej zmiennej. W języku C
ANSI C 5 5 WSKAŹNIKI I TABLICE Jeżeli wskaźnik ip wskazuje na zmienną całkowitą x, to *ip może wys
ANSI C 6 5 WSKAŹNIKI I TABLICE _ Obrazowo wygląda to tak: 5 2 WSKAŹNIKI I ARGUMENTY FUNKCJI w miej
ANSI C 7 5 WSKAŹNIKI I TABLICE Ćwiczenie 5.1. Tak jak została napisana, funkcja getint traktuje zn
ANSI C 8 5 WSKAŹNIKI I TABLICE Między nazwą tablicy a wskaźnikiem jest jednak istotna różnica, o k
ANSI C 9 5 WSKAŹNIKI I TABLICE______—-- alloc i afree jest stosem lub listą LIFO (ang. last-in, fi
ANSI C 0 5 WSKAŹNIKI I TABLICE o specjalną wartość wskaźnikową. Stała NULL jest zdefiniowana w
ANSI C 2 5 WSKAŹNIKI I TABLICE _______^ operator przyrostkowy ++ nie zmieni t, dopóki nie zostanie
ANSI C 3 5 WSKAŹNIKI I TABLICE możliwości są zawarte w funkcjach: getline (rozdz. 1 i 4), atoi, it
ANSI C 4 5 WSKAŹNIKI I TABLICE #define MAXLEN 1000 /* maks. długość wiersza wejściowego */ int get
ANSI C 5 5 WSKAŹNIKI I TABLICE /* swap: zamień miejscami v[i] i v[j] */ void swap(char *v[], int i
ANSI C 6 5 WSKAŹNIKI I TABLICE_______—- Oprócz tej różnicy w zapisie tablicę dwuwymiarową traktuj
ANSI C 7 5 WSKAŹNIKI I TABLICE oba zapisy a[3][4] i b[31[4] są poprawnymi odwołaniami do pojedyncz
ANSI C 8 5 WSKAŹNIKI I TABLICE ____________— for (i = 1; i < argc; i-H-) printf(,,%s%s”, argv[i
ANSI C 9 5 WSKAŹNIK! I TABLICE ________— A oto program: #include <stdio.h> #include
ANSI C 0 5 WSKAŹNIKI I TABLICE -------- ten program tak, aby najlepiej wykorzystywał dostępną mu p
ANSI C 2 5 WSKAŹNIKI I TABLICE _______—— Ćwiczenie 5.16. Dodaj opcję -d (kolejność słownikowa) spr

więcej podobnych podstron