W6 wskaźniki.pdf
(
272 KB
)
Pobierz
Podstawy programowania
2013-10-22/23
Wskaźniki
247
Definiowanie wskaźników
W uproszczeniu,
wskaźnik
na zmienną pewnego typu jest
adresem początku obszaru pamięci, w którym obiekt ten
jest przechowywany.
Ponadto w C++ wskaźnik jest wskaźnikiem na zmienną
określonego typu tzn. "ma świadomość" na co wskazuje.
wskaźnik
zmienna
adres
wartość
Przykład
int *wsk_i; // wskaźnik na liczbę int
char *wsk_c; // wskaźniki na znak
float *wsk_f; // wskaźniki na liczbę float
248
dr inż. P. Borowiecki (KAMS, WETI, PG)
1
Podstawy programowania
2013-10-22/23
Użycie wskaźników
Operator
&
jest operatorem jednoargumentowym,
który daje adres swojego operandu.
Operator
*
jest operatorem jednoargumentowym,
który pozwala odwołać się do zmiennej wskazywanej
przez wskaźnik będący jego operandem.
Operator ten nazywany jest
operatorem dereferencji
.
W zależności od kontekstu może to być pobranie
wartości zmiennej wskazywanej albo odniesienie się do
niej przez wskaźnik (wskazanie), bez użycia jej nazwy.
249
Użycie wskaźników
$
Przykład
int
*
w;
// def. wskaźnika do zmiennej typu
int
int k = 10;
// def. zmiennej typu
int
w =
&
k;
// przypisanie do w adresu zmiennej
k
cout <<
*
w;
// wypisanie zmiennej wskazywanej przez
w
*
w = 2;
// zmiana wartości zmiennej wskazywanej przez
w
cout <<
*
w;
(
*
w)++;
// inkrementacja zmiennej wskazywanej przez
w
(
*
w)--;
// dekrementacja zmiennej wskazywanej przez
w
*
w =
*
w + 3;
// zwiększenie wartości zm. wskaz. przez
w
Położenie gwiazdki w definicji wskaźnika nie ma znaczenia, tzn.
int* w
jest równoważne
int *w
250
dr inż. P. Borowiecki (KAMS, WETI, PG)
2
Podstawy programowania
2013-10-22/23
Wskaźnik a referencja
...
void main ()
{
1
0x8fa0fff4
0x8fa0fff4
0x8fa0fff4
1
1
0x8fa0fff4
2
_
int a = 1;
int *Adr;
int
&
r_a = a;
Adr =
&
a;
cout << *Adr << endl;
cout <<
&
r_a << endl;
cout <<
&
a << endl;
cout << Adr << endl;
cout << a << endl;
cout << r_a << endl;
r_a = 2;
Adr =
&
r_a;
cout << Adr << endl;
cout << *Adr << endl;
Nie można definiować:
¦
referencji do referencji,
¦
tablic referencji,
¦
wskaźników na referencje.
}
251
Arytmetyka wskaźników
Dzięki temu, że definiując wskaźnik podajemy typ zmiennej
wskazywanej, operatory inkrementacji i dekrementacji zastosowane
do wskaźników uwzględniają rozmiar zmiennej wskazywanej.
...
double liczba_d = 0.34;
int liczba_i = 10;
8
0x22ff70
0x22ff78
double *
wsk_d
= &liczba_d;
cout << sizeof(double) << endl;
cout << wsk_d << endl;
wsk_d++;
cout << wsk_d << endl << endl;
0
4
0x22ff68
0x22ff6c
_
int *
wsk_i
= NULL;
cout << wsk_i << endl;
cout << sizeof(int) << endl;
wsk_i = &liczba_i;
cout << wsk_i << endl;
wsk_i++;
cout << wsk_i << endl;
...
Poprawna jest również instrukcja:
wsk_i = wsk_i + 7;
252
dr inż. P. Borowiecki (KAMS, WETI, PG)
3
Podstawy programowania
2013-10-22/23
Stałe wskaźniki
Można definiować
stałe wskaźniki
, czyli takie wskaźniki, których
wartości nie mogą być zmieniane.
Wartość stałego wskaźnika należy określić podczas jego inicjalizacji.
Przykład
int a, b;
int*
const
wsk = &a;
// Dobrze
wsk = &b;
// Błąd!! próba zmiany wartości
// stałego wskaźnika
Pamiętajmy, że stały wskaźnik nie zabrania nam modyfikowania
wartości zmiennej, na którą wskazuje.
Stałość dotyczy jedynie wartości wskaźnika a nie zawartości
obszaru pamięci, na który wskazuje.
*wsk = 10;
// Dobrze. Nadaje zmiennej wskazywanej
// wartość równą 10
253
Wskaźniki do stałych
Można definiować wskaźniki, które traktują wskazywane przez siebie
zmienne jak stałe. Są to
wskaźniki na stałe
.
Jeżeli wskaźnik zostanie zdefiniowany jako wskazujący na stałą, to
nie może być użyty do zmiany jej wartości.
Przykład
int a = 13;
const
int *wsk;
wsk = &a;
cout << *wsk;
// Dobrze. Odczytanie wartości
*wsk = 24;
// Błąd!! Próba użycia wskaźnika na stałą
// do zmiany wartości zm. wskazywanej
a = 24
// Dobrze. Zmienna a nie jest stała
Zauważmy, że przy powyższej definicji wartość zmiennej
a
można
zmieniać, gdyż
a
nie jest stałą, jednak nie można tego zrobić przez
wskaźnik na stałą.
254
dr inż. P. Borowiecki (KAMS, WETI, PG)
4
Podstawy programowania
2013-10-22/23
Tryb dostępu a wskaźniki
Tryb dostępu do
zmiennej wskazywanej
Zmiana
wskaźnika
Definicja typu
Opis typu
typ*
zwykły wskaźnik
czytanie i pisanie
dopuszczalna
const typ*
wskaźnik do stałej
tylko czytanie
dopuszczalna
typ* const
stały wskaźnik
czytanie i pisanie
zabroniona
const typ* const
stały wskaźnik do stałej tylko czytanie
zabroniona
Pamiętajmy, że zadeklarowanie wskaźnika jako wskaźnika na stałą
jest
zapewnieniem
ze strony programisty, że za pośrednictwem tego
wskaźnika, na zmiennej wskazywanej
nie będą wykonywane
żadne
modyfikacje (zmienna wskazywana nie musi być wtedy zdefiniowana
jako stała).
Zasada ta jest często wykorzystywana podczas przesyłania do funkcji
parametrów będących wskaźnikami.
255
Tryb dostępu a wskaźniki
Rozszerzanie uprawnień wskaźnika jest kontrolowane.
Przykład
int a = 5;
int b = 10;
const int *cwsk = &a;
// cwsk - wskaźnik na stały int
int *wsk;
// wsk - wskaźnik na int
wsk = &b;
*cwsk = *wsk;
// Błąd kompilacji:
// "Próba pisania w obszarze
// przeznaczonym tylko do odczytu"
wsk = cwsk;
// Błąd kompilacji:
// "Niepoprawna konwersja const int* na int*"
256
dr inż. P. Borowiecki (KAMS, WETI, PG)
5
Plik z chomika:
inzynieria.biomedyczna
Inne pliki z tego folderu:
Lab_2_Instrukcje_warunkowe.pdf
(123 KB)
Lab_3_Iteracje.pdf
(143 KB)
Lab_4_Tablice.pdf
(192 KB)
Lab_5_Podprogramy.pdf
(103 KB)
Lab_6_Struktury.pdf
(147 KB)
Inne foldery tego chomika:
Algebra Liniowa
Analiza Matematyczna
Chemia
Egzaminy z analizy, algebry i podstaw
ETRAPEZ
Zgłoś jeśli
naruszono regulamin