Jeśli T jest pewnym typem, to T* jest typem wskaźnikowym do T. Wartością typu T* jest pewne miejsce w pamięci (np. zmienna), w którym przechowywana jest wartość typu T.
Wskaźniki przypominają referencje, ale są tu istotnie różnice:
Przykład:
int i=2;
int j=5;
int& r=i; //referencja r wskazuje na i
int* w; //wskaźnik w nie został ustawiony
w = &i; //teraz w oraz r wskazują na i
*w = 3; //i==r==*w==3
r++; //teraz i==r==*w==4
w = &j; //teraz i==r==4, *w==j==5
Jeśli potrzebujemy przechowywać wiele wartości tego samego typu możemy użyć tablic. Tablicę o nazwie t zawierającą n elementów typu T deklarujemy przez
T t[n];możliwe jest też zainicjowanie tablicy w następujący sposób:
int tab[5] = {7, 13, -22, 8, 0};Do elementów tablicy odwołujemy się przez nazwa_tablicy[indeks], przy czym numeracja rozpoczyna się od zera. W powyższym przykładzie dostępne są elementy tab[0], tab[1], tab[2], tab[3] oraz tab[4].
Uwaga: Rozmiar tablicy musi być wartością stałą (możliwą do obliczenia w czasie kompilacji).
Do elementów tablicy można się odwoływać za pomocą wskaźników - nazwa tablicy może być używana jako wskaźnik do pierwszego (tj. tego o indeksie 0) elementu tablicy. Inaczej mówiąc, w powyższym przykładzie tab[0] oraz *tab są synonimami. Podobnie dla pozostałych elementów tablicy - można się do nich odwoływać przez tab[i] lub równoważnie przez *(tab+i).
Przykład: Poniższy kod wypisuje dwukrotnie zawartość tablicy t na ekran. Najpierw odwołujemy się do tablicy używając indeksów, a za drugim razem korzystając ze wskaźnika.
int t[5];
for(int i=0; i<5; ++i)
cout << t[i] << endl;
for(int* p=t; p<t+5; ++p)
cout << *p << endl;
Uwaga: Jak widzimy na powyższych przykładach na wskaźnikach można używać operatorów ++ (przesuwa wskaźnik o jedno pole wyżej), + (zwraca wskaźnik przesunięty w stosunku do podanego). Podobnie dozwolone są operatory -- oraz -.
Napisy (ciągi znaków) są przechowywane jako tablice znaków (tj. typ char[] lub char*), przy czym znak o wartości 0 (ale nie '0'!) oznacza koniec napisu, np. napis "Ala" w tablicy t o rozmiarze 5 pamiętany jest jako
t[0] | t[1] | t[2] | t[3] | t[4] |
'A' | 'l' | 'a' | 0 | 'q' |
Uwaga: Znaki zapamiętywane są w pamięci komputera jako liczby z przedziału 0..255; kody te są nazywane ASCII. Np. literze 'A' odpowiada wartość 65, 'B' to 66, itd. Wartość 0 nie koduje żadnego znaku, jest wykorzystywana do oznaczenia końca napisu.
Przykład: Poniższy program
int main() {powoduje wypisanie kolejno napisów Kot, Lot oraz L.
char n[5];
n[0]='K'; n[1]='o'; n[2]='t'; n[3]=0;
cout << n << endl;
n[0]='L';
cout << n << endl;
n[1]=0;
cout << n << endl;
}
Poprzedzenie nazwy typu słowem const powoduje, że wartości tego typu nie można zmieniać po zainicjowaniu. W szczególności wartość zmiennej typu stałego (nazywanej stałą) musi zostać podana przy deklaracji. Stałych używa się w następujących przypadkach: