12.03: Stringovi i pokazivači
Slično kao kod nizova, ako koristimo ime stringa, to je u stvari pokazivač na prvi element u njemu (prvo slovo). Iz toga sledi da možemo da koristimo i pokazivač sa istim imenom kao string, da bismo radili sa elementima unutar stringa.
Primer:
#include <stdio.h>
int main(void) {
char name[] = "Harry Potter";
printf("%c", *name); // Output: H
printf("%c", *(name+1)); // Output: a
printf("%c", *(name+7)); // Output: o
char *namePtr;
namePtr = name;
printf("%c", *namePtr); // Output: H
printf("%c", *(namePtr+1)); // Output: a
printf("%c", *(namePtr+7)); // Output: o
}Pokazivači na C stringove rade na istom principu kao i pokazivači na nizove brojeva
Stringovi predstavljaju nizove karaktera, a na kraju tog niza se nalazi karakter binarne nule, odnosno null karakter. Pokazivač na C stringove, s obzirom da su to u stvari nizovi karaktera, rade na istom principu kao i pokazivači na nizove brojeva.
Pažnja!
Ako je promenljiva pmessage deklarisana na sledeći način:
char *pmessage;
tada naredba:
pmessage = ”now is the time”;
dodeljuje promenljivoj pmessage pokazivač na dati niz znakova.
Ovo nije kopiranje stringa; radi se samo sa pokazivačima.
U sledećim definicijama postoji jedna važna razlika:
char nmessage[] = ”now is the time”; /* niz */
char *pmessage = ”now is the time”; /* pokazivac */
nmessage je niz, tačno onoliko veliki koliko je potrebno za smeštanje navedene niske znakova i znaka ’\0’ kojima se ovaj niz inicijalizuje. Pojedinačni znakovi unutar niza se mogu promeniti, ali nmessage uvek pokazuje na isti memorijski prostor.
pmessage je pokazivač koji je inicijalizovan da pokazuje na string konstantu. Ovaj pokazivač se kasnije može promeniti tako da pokazuje na nešto drugo, ali je rezultat nedefinisan ako pokušate da modifikujete string konstantu.
nmessage++; /* NE MOZE */
nmessage[2]='t'; /* MOZE */
nmessage=pmessage; /* NE MOZE */
pmessage++; /* MOZE */
pmessage[2]=’t’; /* NE MOZE */
pmessage=nmessage; /* MOZE */
/* a posle toga moze i
pmessage[2]=’t’;
jer pmessage ne pokazuje vise
na string konstantu */