WYKAAD 6
ARYTMETYKA WSKAyNIKÓW
81
M. JANKOWSKA PROGRAMOWANIE I JZYK C++
ARYTMETYKA WSKAyNIKÓW
Wskazniki możemy używać jako operandy z następującymi operatorami:
" dodawania (+) i odejmowania (-) liczb całkowitych (możliwe jest również odjęcie od
siebie dwóch wskazników),
" przypisania (=),
" przypisania wraz dodaniem/odjęciem liczby całkowitej (+=, -=),
" porównania (<, >, <=, >=, ==, !=),
" inkrementacji (++) oraz dekrementacji (--).
UWAGI
W języku C++ istnieje ścisły związek między wskaznikami a tablicami. Mogą
być one dzięki temu wykorzystywane zamiennie.
Wskazniki mogą być wykorzystane do wykonania dowolnej operacji, która działa
na indeksach elementów tablicy.
Nazwa tablicy (bez indeksu) jest wskaznikiem do pierwszego elementu
tablicy.
Arytmetyka operacji na wskaznikach zawsze bierze pod uwagę rozmiar
wskazywanego typu. Zakłada się, że wskaznik jest adresem pierwszego
elementu tablicy składającej się z elementów tego właśnie typu.
82
M. JANKOWSKA PROGRAMOWANIE I JZYK C++
UWAGA 1
W języku C/C++ tablica zajmuje ciągły obszar pamięci o rozmiarze, który wystarcza
do przechowania wszystkich jej elementów.
Deklaracja wskaznika pA do wartości typu
PRZYKAAD
int połączona z inicjacją adresem
/* ... */
pierwszego elementu tablicy może być
int A[6] = {0,1,2,3,4,5};
wykonana na dwa równoważne sposoby:
int * pA = A;
" przy wykorzystaniu nazwy tablicy A
lub
nazwa tablicy jest adresem pierwszego
/* ... */ elementu tablicy,
int A[6] = {0,1,2,3,4,5};
" pobierając adres (operator &) pierwszego
int * pA = &A[0];
elementu tablicy A, czyli elementu A[0];
4
położenie w pamięci 2000 2004 2008 2012 2016 2020
elementy tablicy
A[0] A[1] A[2] A[3] A[4] A[5]
0 1 2 3 4 5
zmienna wskaznikowa pA
wskazuje na element A[0]
tablicy znajdujący się
2000
pod adresem 2000
pA
83
M. JANKOWSKA PROGRAMOWANIE I JZYK C++
UWAGA 2 REZULTAT OPERACJI ARYTMETYCZNYCH
Rezultat operacji arytmetycznych wykonywanych na wskaznikach zależy od
rozmiaru obiektu, na który wskaznik wskazuje.
Dodanie/odjęcie liczby całkowitej n do/od wskaznika powoduje przesunięcie go o n
elementów tablicy do przodu/wstecz (tj. w kierunku rosnących/malejących indeksów
lub za tablicę).
Wykonanie wspomnianych operacji dodawania/odejmowania powoduje przesuniecie
wskaznika o:
n * sizeof(typ-wskazywany)
bajtów.
UWAGA 3 ODEJMOWANIE ZMIENNYCH WSKAyNIKOWYCH
Zmienne wskaznikowe mogą być od siebie odejmowane.
W przypadku, gdy odejmujemy od siebie zmienne wskaznikowe wskazujące na
różne elementy tej samej tablicy w wyniku dostaniemy liczbę elementów znajdują-
cych się pomiędzy nimi (a nie liczbę bajtów).
Wynikiem może być oczywiście liczba ujemna!
84
M. JANKOWSKA PROGRAMOWANIE I JZYK C++
PRZYKAAD REZULTAT OPERACJI ARYTMETYCZNYCH
/* ... */
int A[6] = {0,1,2,3,4,5};
// Krok 1
int * pA1 = &A[0];
int * pA2 = pA1;
// Krok 2
pA1++;
pA2 += 3;
KROK 1
4
położenie w pamięci 2000 2004 2008 2012 2016 2020
elementy tablicy
A[0] A[1] A[2] A[3] A[4] A[5]
0 1 2 3 4 5
zmienne wskaznikowe
pA1 oraz pA2
wskazują na element A[0]
2000 2000
tablicy znajdujący się
pod adresem 2000
pA1 pA2
85
M. JANKOWSKA PROGRAMOWANIE I JZYK C++
PRZYKAAD REZULTAT OPERACJI ARYTMETYCZNYCH
/* ... */
int A[6] = {0,1,2,3,4,5};
// Krok 1
int * pA1 = &A[0];
int * pA2 = pA1;
Wynikiem działania jest wartość 2000 + 4 = 2004;
liczba 2000 zostaje powiększona o rozmiar wskaznika
// Krok 2
(w przypadku liczb typu int rozmiar zazwyczaj wynosi 4).
pA1++;
pA2 += 3;
Wynikiem działania jest wartość 2000 + 3*4 = 2012.
KROK 2
4
położenie w pamięci 2000 2004 2008 2012 2016 2020
elementy tablicy
A[0] A[1] A[2] A[3] A[4] A[5]
zmienna wskaznikowa pA1
0 1 2 3 4 5
wskazuje na element A[1] tablicy
znajdujący się pod adresem 2004
zmienna wskaznikowa pA2 2004 2012
wskazuje na element A[3] tablicy
znajdujący się pod adresem 2012
pA1 pA2
86
M. JANKOWSKA PROGRAMOWANIE I JZYK C++
PRZYKAAD ODEJMOWANIE ZMIENNYCH WSKAyNIKOWYCH
/* ... */
int A[6] = {0,1,2,3,4,5}; Wynikiem działania nie jest liczba bajtów,
tj. wartość 2020 2004 = 16.
int * pA1 = &A[1];
Wykonując odejmowanie wskazników wskazujących na
int * pA2 = &A[5];
elementy tej samej tablicy, np. pA2 - pA1 dostaniemy
int x = pA2 pA1;
liczbę elementów znajdujących się pomiędzy nimi;
w danym przypadku x = 4.
4
położenie w pamięci
2000 2004 2008 2012 2016 2020
elementy tablicy
A[0] A[1] A[2] A[3] A[4] A[5]
zmienna wskaznikowa pA1 0 1 2 3 4 5
wskazuje na element A[1] tablicy
znajdujący się pod adresem 2004
2004 2020
zmienna wskaznikowa pA2
wskazuje na element A[5] tablicy
znajdujący się pod adresem 2020 pA1 pA2
87
M. JANKOWSKA PROGRAMOWANIE I JZYK C++
ZWIZEK MIDZY WSKAyNIKAMI A TABLICAMI
Wiemy już, że istnieje ścisły związek między wskaznikami i tablicami, gdyż:
" w języku C/C++ tablica zajmuje ciągły obszar pamięci o rozmiarze, który wystarcza
do przechowania wszystkich jej elementów,
" nazwa tablicy (bez indeksu) może być traktowana jako wskaznik do jej pierwszego
elementu.
Tak więc wskazniki mogą być wykorzystane do wykonania dowolnej operacji,
działającej na indeksach elementów tablicy.
PRZYKAAD 1 DZIAAANIA NA TABLICY PRZYKAAD 2 DZIAAANIA NA TABLICY
Z WYKORZYSTANIEM Z WYKORZYSTANIEM
NOTACJI INDEKSOWEJ NOTACJI INDEKSOWANIA WSKAyNIKA
/* ... */ /* ... */
int A[6]; int A[6];
int * pA = A;
for (int i=0; i<=5; i++)
A[i] = i; for (int i=0; i<=5; i++)
pA[i] = i;
Wskaznik do pierwszego elementu tablicy (tak samo jak nazwa tablicy) może być
wykorzystany z indeksami poszczególnych elementów. Na przykład wyrażenie pA[3] określa
element o indeksie 3, podobnie jak A[3].
88
M. JANKOWSKA PROGRAMOWANIE I JZYK C++
PRZYKAAD 3 DZIAAANIA NA TABLICY PRZYKAAD 4 DZIAAANIA NA TABLICY
Z WYKORZYSTANIEM Z WYKORZYSTANIEM
NOTACJI WSKAyNIK/PRZESUNICIE NOTACJI WSKAyNIK/PRZESUNICIE
(JAKO WSKAyNIK WYKORZYSTYWANA
/* ... */
JEST NAZWA TABLICY)
int A[6];
/* ... */
int * pA = A;
int A[6];
for (int i=0; i<=5; i++)
for (int i=0; i<=5; i++)
*(pA + i) = i;
*(A + i) = i;
Nazwa tablicy jest wskaznikiem do Zapamiętując adres pierwszego
jej pierwszego elementu. elementu tablicy w zmiennej
wskaznikowej pA możemy postępować
Dodając liczbę całkowitą (tzw.
podobnie jak w Przykładzie 3.
przesunięcie (ang. offset) względem
wskaznika) do wskaznika ustalamy,
który element tablicy ma być
referowany (a dokładnie wartość
adresu elementu tablicy, który ma
być referowany)
przy pomocy operatora *.
89
Wyszukiwarka
Podobne podstrony:
CPP WYKLAD 1CPP WYKLAD 7CPP WYKLADY ANALIZA 2CPP WYKLAD 1 2CPP WYKLAD 3CPP WYKLAD 4 5CPP WYKLADY ANALIZA 1Wyklad CPP 6Wyklad CPP 1Wyklad CPP 2Wyklad CPP 7Wyklad CPP 3Wyklad CPP 5Sieci komputerowe wyklady dr FurtakWykład 05 Opadanie i fluidyzacjawięcej podobnych podstron