CPP WYKLAD 3


WYKAAD 3
WSKAyNIKI I TABLICE
48
M. JANKOWSKA  PROGRAMOWANIE I JZYK C++
TYPY I ZMIENNE WSKAyNIKOWE
W języku C/C++ zdefiniowane są zmienne wskaznikowe, które jako swoją wartość
przechowują adres pewnego obszaru w pamięci. Obszar ten można interpretować
jako zmienną określonego typu.
Zmienne wskaznikowe mogą zawierać adres zmiennych należących zarówno do
typów prostych, jak i złożonych. Zmienne na które wskazują zmienne wskaznikowe
nazywamy wówczas zmiennymi wskazywanymi.
PRZYKAAD
A
" Zmienna o nazwie A
zawiera bezpośrednio wartość 15 15
" Zmienna wskaznikowa (wskaznik)
o nazwie pA zawiera adres zmiennej A;
tak więc wskaznik pośrednio wskazuje wartość 15
pA
A
adres
15
zmiennej A
w pamięci
49
1
M. JANKOWSKA  PROGRAMOWANIE I JZYK C++
DEKLARACJA
Deklaracja zmiennej wskaznikowej (wskaznika), o nazwie określonej przez
identyfikator-wskaznika, do wartości typu określonego przez typ-wartości:
typ-wartości * identyfikator-wskaznika
INICJACJA
Inicjację wskaznika (zmiennej wskaznikowej) możemy wykonać zarówno po dekla-
racji jak również łącznie z deklaracją.
Adres danej zmiennej możemy otrzymać wykorzystując jednoargumentowy operator
pobierania adresu & (ang. address operator), który zwraca adres operandu:
typ-wartości * identyfikator-wskaznika = &identyfikator-zmiennej
DEREFERENCJA
Synonim lub alias obiektu wskazywanego przez zmienną wskaznikową możemy
wykonać wykorzystując jednoargumentowy operator adresowania pośredniego *
(ang. indirection operator) nazywany również operatorem dereferencji (ang.
dereference operator):
* identyfikator-wskaznika
Powyższy sposób korzystania z operatora * jest określany jako dereferowanie
wskaznika (ang. dereferencing a pointer). Dereferowany wskaznik może być użyty
zarówno po lewej jak i po prawej stronie operatora przypisania.
50
M. JANKOWSKA  PROGRAMOWANIE I JZYK C++
PRZYKAAD
- deklaracja zmiennej A typu int połączona z inicjacją wartością
/* ... */
całkowitą równą 10
int A = 10; - deklaracja wskaznika (zmiennej wskaznikowej) pA
do wartości typu int połączona z inicjacją adresem zmiennej A
int * pA = &A;
double B; - deklaracja zmiennej B typu double
- deklaracja wskazników pB oraz pC do wartości typu double
double * pB, * pC;
- zmiennej B przypisujemy wartość 8.5
B = 8.5;
- zmiennej pB przypisujemy adres zmiennej B (mówimy, że pB
pB = &B;
 wskazuje na zmienną B
pC = NULL;
- zmiennej pC przypisujemy wskazanie puste
*pB = 12.5;
- w wyniku przypisania *pB = 12.5 operujemy na zmiennej, na
cin >> *pB;
którą wskazuje zmienna pB, czyli w tym przypadku na zmiennej
cout << *pB;
B (jest to równoważne przypisaniu B = 12.5)
UWAGI
Do wartości, które mogą zostać nadane wskaznikom należy dowolny adres
logiczny oraz 0 i NULL. Wskazniki o wartości 0 i NULL nie wskazują żadnej
wartości (a mówiąc dokładnie wartość liczbowa adresu, na który wskazują jest
równa 0, przy czym w obecnych systemach operacyjnych żaden proces nie ma
dostępu do komórki pamięci o adresie 0).
NULL jest stałą symboliczną, a inicjowanie wskaznika wartością NULL jest
równoważne inicjowaniu go wartością 0. W języku C++ zaleca się inicjowanie
wskazników wartością 0, gdyż zostaje ona przekonwertowana na wskaznik do
51
odpowiedniego typu.
2
M. JANKOWSKA  PROGRAMOWANIE I JZYK C++
TYP VOID
Typ void jest tzw. pustym typem danych.
Składniowo zachowuje się w ten sam sposób jak typ podstawowy można go jednak
używać jedynie jako części bardziej złożonego typu, a co za tym idzie nie
możemy zadeklarować zmiennej typu void.
Sposoby użycia typu void:
" jako pseudotyp, aby wskazać, że funkcja nie przekazuje żadnej wartości (języki
C/C++), np.
void moja_funkcja ();
" w celu wskazania, że funkcja nie pobiera żadnych argumentów (język C), np.
int moja_funkcja (void);
" jako typ podstawowy dla wskazników do obiektów nieznanego (dowolnego)
typu (języki C/C++), np.
void * pV;
52
M. JANKOWSKA  PROGRAMOWANIE I JZYK C++
WSKAZANIA ADRESOWE  TYP VOID *
W języku C/C++ zdefiniowane są zmienne typu void * (nazywane również wskaza-
niami adresowymi, lub wskaznikami do obiektów nieznanego typu).
Zmienne te nie wskazują zmiennych jakiegoś określonego typu i mogą przechowy-
wać wartość wskaznika dowolnego typu.
UWAGI
W ogólności wiemy, że wartość jednego wskaznika może zostać przypisana
innemu wskaznikowi w przypadku, gdy oba są tego samego typu. Np.
int A = 10, B = 20;
int * pA, * pB;
pA = &A; pB = pA;
Wskaznik typu void, czyli void * jest wskaznikiem ogólnym, który może
przechowywać wartość wskaznika dowolnego typu. Możemy mu więc przypi-
sać wskazniki do wszystkich typów bez konieczności wykonania konwersji.
double D = 12.5;
double * pD = &D;
// Wskaznik ogolny moze przechowywac wskaznik dowolnego typu
void * pV = pD;
// Wykonujemy jawna konwersja z powrotem do double *
double * pE = static_cast (pV);
53
3
M. JANKOWSKA  PROGRAMOWANIE I JZYK C++
Wskaznikowi typu void możemy przypisać wskazniki do typu void. Co więcej
możemy je również porównywać ze względu na równość lub nierówność, jak
również jawnie przekształcać do innego typu.
Wskaznik typu void nie może podlegać dereferencji, gdyż wskazuje on
jedynie położenie danych nieznanego typu i w związku z tym nie jest w stanie
określić liczby bajtów zajmowanych przez daną.
PRZYKAAD
int A = 10, * pA = &A;
void * pV = pA;
cout << *pV << endl; Dereferencja * pV jest niedozwolona.
Nie możemy zastosować arytmetyki wskazników,
pV++;
gdyż nie jest znany rozmiar wskazywanej zmiennej.
54
M. JANKOWSKA  PROGRAMOWANIE I JZYK C++
TYPY I ZMIENNE REFERENCYJNE
W języku C/C++ zdefiniowane są zmienne referencyjne, których zadaniem jest
reprezentacja innych zmiennych w programie.
Operacje wykonywane na pewnej zmiennej x są równoważne operacjom
wykonywanym na zmiennej referencyjnej z nią związanej.
DEKLARACJA
Deklaracja zmiennej referencyjnej o nazwie określonej przez identyfikator-
zmiennej-referencyjnej związanej ze zmienną daną przez identyfikator-zmiennej
połączona (zawsze!) z jej inicjalizacją:
typ &identyfikator-zmiennej-referencyjnej = identyfikator-zmiennej
lub
typ& identyfikator-zmiennej-referencyjnej = identyfikator-zmiennej
Przykłady wykorzystania typów i zmiennych referencyjnych:
" przekazywanie parametrów do funkcji,
" zwracanie wartości funkcji.
PRZYKAAD
Deklaracja zmiennej referencyjnej o nazwie refA połączona
z jej inicjacją, w wyniku której zmienna refA jest związana ze
/* ... */
zmienną A (stanowi alias zmiennej A).
int A;
int & refA = A;
Nadanie wartości 15 dla zmiennej refA jest równoważne z na-
refA = 15; daniem tej wartości zmiennej A.
55
4
M. JANKOWSKA  PROGRAMOWANIE I JZYK C++
TABLICE
Tablica  złożona struktura danych, składająca się z elementów tego samego typu
mających wspólną nazwę.
Cechy charakterystyczne tablicy:
" zajmuje ciągły obszar pamięci o rozmiarze potrzebnym do zapamiętania jej
wszystkich elementów,
" do konkretnej komórki (elementu tablicy) odwołujemy się podając jej nazwę oraz
liczbę określającą położenie elementu w tablicy (tzw. indeks lub numer pozycji).
56
M. JANKOWSKA  PROGRAMOWANIE I JZYK C++
DEKLARACJA
Deklaracja tablicy N - wymiarowej o wymiarach wymiar1, wymiar2, ... , wymiarN,
o nazwie określonej przez identyfikator i typie wszystkich elementów tablicy danym
przez typ-elementów:
typ-elementów identyfikator [wymiar1] [wymiar2] ... [wymiarN]
UWAGA
Elementy tablicy mogą być dowolnego typu za wyjątkiem typu referencyjnego.
Możemy więc w tablicy przechowywać nie tylko liczby całkowite i rzeczywiste, ale
również wskazniki, struktury, unie, inne tablice oraz obiekty.
PRZYKAADY DEKLARACJI
tablica o nazwie z zawierająca 10 elementów typu int
/* ... */
int z[10];
tablica o nazwie str zawierająca 30 znaków
char str[30];
tablica o nazwie tabld zawierająca 12
long double * tabld[12];
wskazników liczb typu double
short w[3][20];
dwuwymiarowa tablica o nazwie w liczb całkowitych typu short
57
5
M. JANKOWSKA  PROGRAMOWANIE I JZYK C++
INICJACJA
Inicjację tablicy możemy wykonać:
" po deklaracji,
" łącznie z deklaracją. Polega ona wówczas na wymienieniu bezpośrednio po
deklaracji zmiennej listy inicjatorów tablicy ujętej w nawiasy klamrowe.
Zasady obowiązujące przy inicjacji tablic:
" lista inicjatorów nie może zawierać więcej elementów niż przewiduje to rozmiar
tablicy,
" w przypadku, gdy inicjatorów jest mniej niż elementów tablicy, wówczas pozostałe
elementy tablicy są inicjowane zerami (w przypadku tablic liczb i znaków), lub
wskazaniami pustymi NULL (w przypadku tablicy wskazników),
" inicjator musi być stałą (język C), oraz może być stałą lub identyfikatorem zmiennej
(język C++).
Tablicę o nazwie z zainicjowano trzema pierwszymi elementami,
pozostałym elementom zostanie domyślnie przypisana wartość zero.
PRZYKAADY INICJACJI
Inicjacja tablicy dwuwymiarowej
/* ... */
o nazwie tabi  wartości zgrupo-
double z[10] = {2.5, 8.1, 12.0};
wane są w nawiasach klamrowych
int tabi[3][2] = {{1,2}, {3,4}, {5,6}};
według wierszy.
int n[] = {1,2,4,5};
Wielkość tablicy n została pominięta w deklaracji z listą wartości
inicjujących  w takim przypadku liczba jej elementów będzie równa liczbie
elementów znajdujących się na liście wartości inicjujących, czyli 4.
58
M. JANKOWSKA  PROGRAMOWANIE I JZYK C++
DOSTP DO ELEMENTÓW TABLICY
Dostęp do elementu tablicy możemy uzyskać poprzez podanie jego pozycji
(indeksu/ów) w nawiasach kwadratowych.
Odwołując się do elementu tablicy musimy pamiętać, że:
" pierwszy element tablicy ma indeks równy zero (w przypadku tablic wielowymia-
rowych wszystkie indeksy są równe zero), np.
tab[0][0]
jest odwołaniem do pierwszego elementu (elementu w pierwszym wierszu
i w pierwszej kolumnie) tablicy dwuwymiarowej o nazwie tab,
" pozycja ostatniego elementu tablicy jest równa wymiar-1, np.
tab[n-1]
jest odwołaniem do ostatniego elementu jednowymiarowej tablicy n-elementowej
o nazwie tab,
" zarówno w procesie kompilacji, jak i w trakcie wykonywania programu w C/C++
nie jest wykonywane sprawdzenie czy używane indeksy nie wskazują poza
tablice. Może to powodować niebezpieczne i trudne do wykrycia błędy. Zalecana
jest szczególna ostrożność zwłaszcza podczas umieszczania danych w tablicy.
59
6
M. JANKOWSKA  PROGRAMOWANIE I JZYK C++
PRZYKAAD 1
Tablice jednowymiarowe ...
c[0] 5
- deklaracja tablicy jednowymiarowej o nazwie c zawierającej
6 elementów typu int połączona z inicjacją tych elementów
c[1] 12
int c[6] = {5,12,-7,9,5,-51};
c[2] -7
- zmieniamy wartość elementu o indeksie 2 (trzeciego
c[3] 9
elementu w tablicy) na 17
c[4] 5
c[2] = 17;
c[5] -51
kolumna 0 kolumna 1 kolumna 2 kolumna 3
PRZYKAAD 2 wiersz 0 a[0][0] a[0][1] a[0][2] a[0][3]
Tablice dwuwymiarowe ...
wiersz 1 a[1][0] a[1][1] a[1][2] a[1][3]
wiersz 2 a[2][0] a[2][1] a[2][2] a[2][3]
- deklaracja tablicy dwuwymiarowej o nazwie a zawierającej 3 wiersze oraz
4 kolumny; elementy tablicy są typu double; deklaracja połączona jest
z inicjacją początkowych elementów tablicy (wartości nie zostały zgrupowane
w nawiasach klamrowych tak więc elementy inicjowane są wierszami)
double a[3][4] = {1.5, 2.3, 1.5, 8.3, 14.1, 7.2, 9.1};
- odwołanie do elementu tablicy a znajdującego się w pierwszym wierszu i trzeciej
kolumnie i przypisanie mu wartości 12.5
a[1][3] = 12.5; 60
M. JANKOWSKA  PROGRAMOWANIE I JZYK C++
STRUKTURY
Struktura  złożony typ danych będący zbiorem elementów (prawie!) dowolnego
typu. Struktura definiuje w istocie nowy typ danych.
Cechy charakterystyczne struktury:
" składa się ona ze składowych różnych typów, które umieszczone są w pamięci
jedna za drugą,
" rozmiar struktury jest równy sumie rozmiarów jej składowych.
DEKLARACJA
Deklaracja struktury (nowego typu danych) o nazwie identyfikator-typu-struktury
o polach określonych przez deklaracje-składowej1, deklaracje-składowej2, .... :
struct identyfikator-typu-struktury
{
deklaracja-składowej1
deklaracja-składowej2
...
} [identyfikator-struktury1 = [inicjator1], ... ,
identyfikator-struktury1 = [inicjator1] ];
Definicja typu struktury może być połączona z utworzeniem zmiennej strukturalnej
identyfikator-struktury1 i jej inicjacją przy pomocy inicjatora1.
W deklaracji możemy pominąć identyfikator-typu-struktury, identyfikatory-
61
struktury i ich inicjatory.
7
M. JANKOWSKA  PROGRAMOWANIE I JZYK C++
UWAGA
Składowe (pola) struktury mogą być dowolnego typu (w tym typu strukturalnego),
z dwoma wyjątkami:
" składowa nie może być typu strukturalnego, który jest aktualnie deklarowany, np.
struct osoba
{
char nazwisko[30];
int wiek;
deklaracja niedozwolona
osoba ojciec;
};
... może być ona natomiast wskaznikiem do aktualnie deklarowanej struktury, np.
struct osoba
{
char nazwisko[30];
int wiek; deklaracja dozwolona
osoba * ojciec;
};
" (język C) składową struktury nie może być funkcja, natomiast może wskaznik do
funkcji.
62
M. JANKOWSKA  PROGRAMOWANIE I JZYK C++
DOSTP DO SKAADOWYCH STRUKTURY
Dostęp do składowych struktury umożliwiają operatory:
" kropki . (bezpośredni selektor składowych)  stosujemy w przypadku struktur
reprezentowanych przez zmienne strukturalne;
" -> (pośredni selektor składowych)  wykorzystujemy w przypadku struktur
wskazywanych przez wskazniki.
Deklaracja struktury o nazwie Kolo
PRZYKAADY DEKLARACJI I INICJACJI
połączona z utworzeniem zmiennej
strukturalnej typu Kolo o nazwie k1.
/* Przyklad 1 ... */
struct Kolo
Pola zmiennej k1 są inicjowane kolejno
{ wartościami: 10, 20, 3.
double x,y;
double r;
Deklaracja zmiennej strukturalnej typu Kolo
} k1 = {10,20,3};
o nazwie mojeKolo połączona z inicjacją składowych.
/* Przyklad 2 ... */
Kolo mojeKolo = {1,10,5};
Przykłady dostępu do
składowych struktury
/* Przyklad 3 ... */ /* Przyklad 4 ... */
za pomocą operatorów
Kolo inneKolo; Kolo * pKolo = new Kolo;
w zależności od rodzaju
inneKolo.x = 3.5; pKolo->x = 3.5; zmiennej strukturalnej.
inneKolo.y = 12.5; pKolo->y = 12.5;
inneKolo.r = 8.0; pKolo->r = 8.0;
63
8


Wyszukiwarka

Podobne podstrony:
CPP WYKLAD 1
CPP WYKLAD 7
CPP WYKLAD 6
CPP WYKLADY ANALIZA 2
CPP WYKLAD 1 2
CPP WYKLAD 4 5
CPP WYKLADY ANALIZA 1
Wyklad CPP 6
Wyklad CPP 1
Wyklad CPP 2
Wyklad CPP 7
Wyklad CPP 3
Wyklad CPP 5
Sieci komputerowe wyklady dr Furtak
Wykład 05 Opadanie i fluidyzacja

więcej podobnych podstron