1
Programowanie obiektowe
Lokalizacja plików do wykładów
http://members.lycos.co.uk/pkjw84/kw/
w folderze:
Programowanie obiektowe IV ZIN
logowanie:
nazwa u
ż
ytkownika
2007/2008
hasło
kw
2
Programowanie obiektowe
Wykład 2: Wskaźnikowe typy danych
Podstawy typów wska
ź
nikowych
Operatory wska
ź
nikowe
Tablice
Wska
ź
niki a typy tablicowe i napisy
Struktury
3
Programowanie obiektowe
Podstawy typów wskaźnikowych
Zmienna typu wskaźnikowego (wskaźnik) jest zmienną przechowującą
adres do innego obiektu (zmiennej) w pamięci operacyjnej
Wskaźniki mają określoną specjalną arytmetykę wskaźników, dzięki czemu
można w stosunkowo łatwy sposób operować na adresach w pamięci
operacyjnej
Adres
Wartość
Wskaźnik
Zmienna
4
Programowanie obiektowe
Deklaracja wskaźnika:
typ *nazwa;
Przykłady:
int *wsk1;
char *wsk2;
Wskaźniki - podstawy
5
Programowanie obiektowe
Operatory wskaźnikowe:
*
oraz
&
Jednoargumentowy operator
&
zwraca adres w pamięci
Operacja:
m = &count;
umieszcza w zmiennej
m
adres zmiennej
count
Załóżmy, że zmienna
count
zajmuje komórkę pamięci o adresie
2000
.
Załóżmy, też że jej wartość to
100
W wyniku powyższego przypisania zmienna
m
będzie miała wartość
2000, tzn. zmienna m otrzymuje adres zmiennej count
6
Programowanie obiektowe
Jednoargumentowy operator
*
zwraca wartość zmiennej,
znajdującej się pod adresem następującym po operatorze
Jeśli zmienna
m
zawiera adres zmiennej
count
to instrukcja
q = *m;
umieszcza wartość zmiennej
count
w zmiennej
q
Tak więc zmienna
q
będzie miała wartość
100
, gdyż
100
znajduje się
pod adresem
2000
, który jest adresem zapisanym w
m
„
q
otrzymuje wartość, znajdującą się pod adresem
m
”
Operatory wskaźnikowe:
*
oraz
&
7
Programowanie obiektowe
Zadanie
Napisa
ć
program wypisuj
ą
cy na ekranie liczb
ę
100 z u
ż
yciem
wska
ź
nika na liczb
ę
typu int.
Wskaźniki - podstawy
8
Programowanie obiektowe
#include <iostream>
using namespace std;
int main() {
int *p, q;
q = 100;
/* przypisanie do q warto
ś
ci 100 */
p = &q;
/* przypisanie do p adresu q */
cout << *p;
/* wy
ś
wietlenie warto
ś
ci q z u
ż
yciem wska
ź
nika */
return 0;
}
Wskaźniki - podstawy
Sposób 1
9
Programowanie obiektowe
#include <iostream>
using namespace std;
int main()
{
int *p, q;
p = &q;
/* pobranie adresu q */
*p = 100;
/* przypisanie warto
ś
ci q z wykorzystaniem wska
ź
nika */
cout <<
″″″″
Warto
ś
ci
ą
zmiennej q jest
″″″″
<< q;
return 0;
}
Wskaźniki - podstawy
Sposób 2
10
Programowanie obiektowe
Przykład niepoprawnego wykorzystania wska
ź
nika
int main(void)
{
int *p;
*p = 10;
}
Wskaźniki - podstawy
/* niepoprawnie - p jeszcze na nic nie wskazuje! */
11
Programowanie obiektowe
Oprócz operatorów * i & istnieją tylko cztery inne operatory,
które można stosować ze wskaźnikami: +, ++, -, --.
Operator ++ zwiększa adres, na który wskazuje wskaźnik o jedną długość
typu wskaźnika;
np. jeżeli
p
zawiera adres
200
do liczby całkowitej (o długości 2 bajtów),
to instrukcja
p++
powoduje, że
p
będzie miało adres
202
, tzn. 200+(1*2).
Równoważnie można to zapisać:
p+=1;
Jeżeli mamy:
int *p;
p=p+200;
to
p
będzie wskazywało na 200. liczbę całkowitą, występująca za liczbą
wskazywaną poprzednio.
Podobnie działają operatory odejmowania.
Wskaźniki - podstawy
12
Programowanie obiektowe
Aby otrzymać wartość o jeden większą od wskazywanej przez wskaźnik,
należy posłużyć się konstrukcją:
(*p)++;
(Jeżeli założymy, że
p
wskazuje na adres
200
, pod którym znajduje się
liczba
100
typu int, to po wykonaniu ww. instrukcji
p
wskazuje na liczbę
101
nadal pod adresem
200
).
UWAGA!
Instrukcja:
*p++;
powoduje zwiększenia wskaźnika
p
o
1
(a nie wartości obiektu, na który
wskazuje!!!), tzn.
p
wskazuje na adres
202
(zakładamy, że liczba typu int
zajmuje 2 bajty).
Wskaźniki - podstawy
13
Programowanie obiektowe
Aby rzutować zmienną
t
typu
T
na inny typ
S
, poprzedzamy
t
nazwą
typu
S
ujętą w nawias.
Przykład
float f;
f=100.2;
cout << (int) f; /*wyświetlenie f jako liczby całkowitej */
Rzutowanie typów
14
Programowanie obiektowe
Ta sama zasada dotyczy rzutowania wskaźników
Załóżmy, że mamy:
int *iptr;
float *fptr;
Aby przypisać wskaźnik do liczby całkowitej
iptr
wskaźnikowi do liczby
zmiennoprzecinkowej
fptr
, piszemy:
fptr=(float *) iptr;
Rzutowanie typów
15
Programowanie obiektowe
Wskaźniki a typy tablicowe
J
ę
zyk C/C++ w sposób wyj
ą
tkowy ł
ą
czy wska
ź
niki i tablice
W wyniku deklaracji zmiennej tablicowej,
ś
rodowisko j
ę
zyka C/C++
tworzy wska
ź
nik na pocz
ą
tek tej tablicy. Miejsca na pozostałe
elementy tablicy s
ą
zajmowane w zale
ż
no
ś
ci od rozmiaru tablicy.
Tablica zajmuje spójny obszar pami
ę
ci operacyjnej
Tak wi
ę
c do tablic mo
ż
emy odnosi
ć
si
ę
w sposób tradycyjny, tzn.
przy pomocy nazwy zmiennej z indeksem tablicy: tab[i] lub
stosuj
ą
c arytmetyk
ę
wska
ź
ników
Takie traktowanie tablic jest szczególnie przydatne dla tzw. tablic
otwartych i ła
ń
cuchów znaków - bez wst
ę
pnego okre
ś
lenia ich
długo
ś
ci
Takich cech nie ma wi
ę
kszo
ść
innych j
ę
zyków programowania
16
Programowanie obiektowe
Wskaźniki i tablice
Niech:
int sample[10];
Można utworzyć wskaźnik do pierwszego elementu, używając nazwy
sample
Poniższy fragment programu przypisuje zmiennej
p
adres
pierwszego elementu tablicy
sample
:
int *p;
int sample[10];
p = sample;
Równoważne są również odwołania:
sample[i]
oraz
*(sample+i)
17
Programowanie obiektowe
Nazwa tablicy bez indeksu jest wska
ź
nikiem do pocz
ą
tku
tablicy
Przeanalizujmy poni
ż
szy przykład
#include <iostream>
using namespace std;
int main() {
int a[10] = {10, 20, 30, 40, 50, 60, 70, 80, 90, 100};
int *p;
p = a;
/* przypisanie p adresu pocz
ą
tkowego tablicy a */
/* wypisanie pierwszych trzech elementów tablicy a z u
ż
yciem p */
cout << *p << *(p+1) << *(p+2);
/* to samo z wykorzystaniem a */
cout << a[0] << a[1] << a[2];
return 0;
}
Wskaźniki i tablice
18
Programowanie obiektowe
Zadanie
Jaka warto
ść
zostanie wypisana na ekranie?
int temp[5] = {10, 19, 23, 8, 9};
int *p;
p = temp;
Cout << *(p+3);
Odpowiedź: 8
Wskaźniki i tablice
19
Programowanie obiektowe
Zadanie
Napisa
ć
program wczytuj
ą
cy napis jako ła
ń
cuch znaków. Nast
ę
pnie
program powinien odszuka
ć
pierwszy ci
ą
g spacji w ła
ń
cuchu,
po czym wy
ś
wietli
ć
pozostał
ą
cz
ęść
napisu.
Wykorzysta
ć
zmienne wska
ź
nikowe.
Wskaźniki i tablice
20
Programowanie obiektowe
#include <iostream>
using namespace std;
int main(void)
{
char str[80], *p;
cout << "Wprowadz lancuch znakow: ";
gets(str);
p = str;
while(*p && *p!=' ') p++;
while(*p && *p==' ') p++;
cout << p;
getchar();
return 0;
}
Program 2.1
Wskaźniki i tablice
21
Programowanie obiektowe
Wskaźniki wielokrotne
Mo
ż
liwe jest, aby wska
ź
nik wskazywał na inny wska
ź
nik
(tzw. wielokrotne odwołanie niejawne).
Aby zadeklarowa
ć
wska
ź
nik do wska
ź
nika, nale
ż
y przed
nazw
ą
wska
ź
nika umie
ś
ci
ć
dodatkow
ą
gwiazdk
ę
:
char
char
**
**
mp
mp
;
;
Adres
Wartość
Wskaźnik
do wskaźnika
Zmienna
Adres
Wskaźnik
22
Programowanie obiektowe
Aby dosta
ć
si
ę
do warto
ś
ci wskazywanej niejawnie przez
wska
ź
nik do wska
ź
nika, nale
ż
y zastosowa
ć
operator *
dwukrotnie:
char **mp, *p, ch;
p=&ch;
// pobranie adresu ch
mp=&p;
// pobranie adresu p
/* przypisanie ch warto
ś
ci A z wykorzystaniem wielokrotnego
odwołania niejawnego */
**mp=‘A’;
Wskaźniki wielokrotne
23
Programowanie obiektowe
Arytmetyka wskaźników
Przeanalizuj i wyja
ś
nij poni
ż
szy kod:
int x=1, y, z[10];
int *ip, *iq;
ip = &x;
y = *ip;
*ip = 0;
*ip += 1;
y = *ip+2;
ip = &z[0];
iq = ip;
// ip wskazuje na x
// y=1
// x=0
// x=1
// y=3
// ip wskazuje na z[0]
// iq wskazuje na z[0]
24
Programowanie obiektowe
Arytmetyka wskaźników
Przykład operacji dla typu prostego:
int *px;
px += 2;
px = (adres wskazywany przez px) + (2 * rozmiar obiektu
wskazywanego przez px);
np. dla px równego 3000 i rozmiaru 4 (dla int):
3000 + 2 * 4 = 3008;
Przykład dla tablicy:
int a[4];
int *pa;
pa = a; /* lub pa=&a[0]; */
pa ++;
/*pa wskazuje na a[1] */
pa = pa+2;
/*pa wskazuje na a[3] */
pa --;
/*pa wskazuje na a[2] */
a[0] a[1] a[2] a[3]
3000
3004
3008
3012
pa
25
Programowanie obiektowe
Wprowadzenie do języka C++
Dynamiczny przydział pami
ę
ci (alokacja):
operator new
np.
int *point;
point = new int;
*point = 999;
26
Programowanie obiektowe
Wprowadzenie do języka C++
Dynamiczne zwolnienie pami
ę
ci:
operator delete
np.
delete point;
usuwanie tablicy zaalokowanej dynamicznie:
/* new tab[2]; */
delete [ ] tab;
27
Programowanie obiektowe
Tablice sekwencyjne
W j
ę
zykach programowania przez tablic
ę
rozumie si
ę
ci
ą
g warto
ś
ci
(np. liczb, znaków, innych typów prawidłowych dla kompilatora),
b
ę
d
ą
cych tego samego typu,
Pojedyncza zmienna w tablicy nazywana jest elementem tablicy,
Do wszystkich zmiennych w tablicy odwołujemy si
ę
poprzez t
ę
sam
ą
nazw
ę
wykorzystuj
ą
c indeks elementu tablicy,
Indeks tablicy budowany jest na podstawie typu wyliczeniowego -
najcz
ęś
ciej s
ą
to liczby naturalne z zerem (0) wł
ą
cznie,
S
ą
j
ę
zyki programowania (np. Pascal), w których indeksy mog
ą
by
ć
znakami
ASCII lub własnymi typami wyliczeniowymi,
W j
ę
zyku C/C++ domy
ś
lnym indeksem tablicy s
ą
liczby naturalne
z zerem
28
Programowanie obiektowe
Deklarowanie tablic jednowymiarowych (wektorów)
W j
ę
zyku C/C++ tablice jednowymiarowe deklarujemy według schematu:
typ_elementów nazwa_tablicy [rozmiar]
każdy z elementów tablicy
jest typu „typ_elementów”
dostęp do każdego
z elementów tablicy
jest realizowany
poprzez jej nazwę
rozmiar podawany jest
jako liczba naturalna w otoczeniu
nawiasów kwadratowych
Zmienne i stałe typu tablicowego deklarujemy w cz
ęś
ci
deklaracyjnej programu C/C++ jest liczony od zera do warto
ś
ci
rozmiar-1
29
Programowanie obiektowe
Tablice jednowymiarowe
Przykład: deklaracja pi
ę
ciopozycyjnej tablicy liczb całkowitych:
int tab[5];
Po wykonaniu powy
ż
szej deklaracji powstaje w pami
ę
ci
operacyjnej nast
ę
puj
ą
ca struktura danych:
tab[0]
tab[1]
tab[2]
tab[3]
tab[4]
spójny obszar pamięci operacyjnej
najmłodszy adres
najstarszy adres
30
Programowanie obiektowe
Tablice jednowymiarowe
Wypełnienie tablicy z wykorzystanie p
ę
tli for :
int tab[5];
int j;
for (j=0; j<5; j++)
{
tab [ j ] = j;
/* podstawienie warto
ś
ci do elementu tablicy */
}
Po wykonaniu powy
ż
szych działa
ń
otrzymujemy:
0
tab[0]
1
tab[1]
2
tab[2]
3
tab[3]
4
tab[4]
31
Programowanie obiektowe
Tablice jednowymiarowe
Przykład: Wczytanie elementów do tablicy i wypisanie ich na ekranie:
#include <iostream>
using namespace std;
int moja_tab[5];
int j;
int main( ) {
for (j=0; j<5; j++)
{
/*wczytanie elementu do tablicy*/
cout << endl << "Wprowadz element na pozycje " << j << endl;
cin >> moja_tab[j];
/* wypisanie elementu z opisem i now
ą
lini
ą
*/
cout << "moja_tab[" << j << "] = " << moja_tab[j];
}
getchar();
return 0;
}
Program 2.2
32
Programowanie obiektowe
Inicjowanie wartości elementów tablic
Tablic
ę
mo
ż
na zainicjowa
ć
przy pomocy p
ę
tli, np.: for
Mo
ż
na równie
ż
wczyta
ć
warto
ś
ci elementów przy pomocy funkcji
scanf
Zainicjowanie warto
ś
ci tablicy w postaci wyliczenia listy warto
ś
ci:
typ_elementów nazwa_tablicy [rozmiar] = {lista_warto
ś
ci}
Przykład:
char znaki[5] = {‘A’, ‘B’, ‘C’, ‘D’, ‘E’}
A
znaki[0]
B
znaki[1]
C
znaki[2]
D
znaki[3]
E
znaki[4]
33
Programowanie obiektowe
Inicjowanie wartości elementów tablic
Nie nale
ż
y polega
ć
na warto
ś
ciach inicjalizacyjnych tablic. Mo
ż
e to by
ć
ró
ż
nie realizowane dla poszczególnych
ś
rodowisk j
ę
zyka C i dla ró
ż
nych
systemów operacyjnych. Dlatego te
ż
w dobrym zwyczaju le
ż
y jawne
wypełnienie tablicy warto
ś
ciami pocz
ą
tkowymi, na przykład z
wykorzystaniem p
ę
tli for
:
int tab[100];
int j;
for (j=0; j<100; j++)
{
tab[ j ] = 0;
/* wyzerowanie tablicy */
}
tab[0]
tab[1]
tab[2]
tab[99]
0
0
0
0
Po wykonaniu zerowania:
......................
34
Programowanie obiektowe
Wykorzystywanie tablic „otwartych”
Je
ż
eli z góry nie zakładamy ile elementów ma mie
ć
tablica, to
mo
ż
emy u
ż
y
ć
deklaracji tzw. tablicy otwartej:
typ_elementów nazwa_tablicy [ ] = {lista_warto
ś
ci}
Rozmiar tablicy nie jest podawany wprost.
Faktyczny rozmiar tablicy jest wyliczany przez
środowisko języka C na podstawie liczby elementów
zamieszczonych na liście wartości wprowadzanych do tablicy
Przykłady:
int całkowite[ ] = {1, 4, 6, -8, 3, -56, 19, 27, -13};
float rzeczywiste[ ] = {-12.23, 45.0, 1.4};
unsigned int naturalne[ ] = {0, 2, 8, 9, 23, 90, 100, 234};
Program 2.3
35
Programowanie obiektowe
Przepisywanie zawartości z tablicy do innej tablicy
Aby przepisa
ć
zawarto
ść
jednej tablicy do innej tablicy musimy
przepisa
ć
kolejno jej poszczególne elementy
DOZWOLONY SPOSÓB PRZEPISYWANIA WARTO
Ś
CI:
int
ź
ródło[5] = {0, 1, 2, 3, 4}
int wynik[5];
int i;
for (i=0; i<5; i++)
{
wynik[i] =
ź
ródło[i];
/*przepisywanie pojedynczych elementów*/
}
NIEDOZWOLONY SPOSÓB:
wynik =
ź
ródło;
/*nieprawidłowa próba u
ż
ycia nazwy całej tablicy*/
36
Programowanie obiektowe
Przykłady wykorzystania tablic jednowymiarowych
Wyliczenie warto
ś
ci
ś
redniej elementów tablicy
Wykorzystanie niesko
ń
czonej p
ę
tli for
Program 2.4
Program 2.5
37
Programowanie obiektowe
Tablice wielowymiarowe
W j
ę
zyku C tablice wielowymiarowe deklarujemy według schematu:
typ_elementów nazwa_tablicy [wymiar1]...[wymiarN]
każdy z elementów tablicy
jest typu „typ_elementów”
dostęp do każdego
z elementów tablicy
jest realizowany
poprzez jej nazwę
każdy z wymiarów podawany jest
jako liczba naturalna w
nawiasach kwadratowych
Przykład: deklaracja dwuwymiarowej tablicy (macierzy) liczb rzeczywistych:
float macierz [4][3];
indeks
wiersza
indeks
kolumny
38
Programowanie obiektowe
Inicjowanie wartości elementów macierzy
Przy pomocy podwójnej p
ę
tli for :
float macierz_R[4][3]
int i, j;
for(i=0; i<4; i++) {
for (j=0; j<3; j++) {
macierz_R[i][j] = 0.0;
}
}
0.0
0.0
0.0
0.0
0.0
0.0
0.0
0.0
0.0
0.0
0.0
0.0
0
1
2
0
1
2
3
39
Programowanie obiektowe
Inicjowanie wartości elementów macierzy
Jawnie ustalaj
ą
c list
ę
warto
ś
ci:
float macierz_R[4][3]=
{
0.0, 0.0, 0.0,
0.2, 1.23, 2.12,
1.12, 3.45, 7.23,
3.2, 5.0, 8.7
};
0.0
0.0
0.0
0.2
1.23
2.12
1.12
3.45
7.23
3.2
5.0
8.7
0
1
2
3
40
Programowanie obiektowe
Inicjowanie wartości elementów macierzy
Selektywnie wstawianie warto
ś
ci do tablicy:
macierz_R[2][2] = 1.0;
macierz_R[0][2] = 12.5;
macierz_R[3][1] = 4.78;
12.5
1.0
4.78
0
1
2
3
41
Programowanie obiektowe
#include <iostream>
using namespace std;
int macierz[4][5];
int i,j;
int main() {
for(i=0; i<4; i++)
for(j=0; j<5; j++)
macierz[i][j] = i*j;
for(i=0; i<4; i++) {
for(j=0; j<5; j++)
cout << macierz[i][j];
cout << endl;
}
getchar();
return 0;
}
Przykład wykorzystania tablicy dwuwymiarowej
W poni
ż
szym przykładzie do macierzy liczb całkowitych wstawiana jest, a
nast
ę
pnie wypisywana warto
ść
iloczynu indeksów wierszy i kolumn
poszczególnych elementów macierzy:
Wynik zadziałania programu:
0 0 0 0 0
0 1 2 3 4
0 2 4 6 8
0 3 6 9 12
Program 2.6
42
Programowanie obiektowe
Typy rekordowe - struktury
Do tej pory poznali
ś
my ju
ż
typy tablicowe, które s
ą
zło
ż
onymi
typami danych
Charakterystyczne dla tablicy jest to,
ż
e ka
ż
dy element jest tego
samego typu; mog
ą
to by
ć
na przykład tablice liczb całkowitych,
rzeczywistych, znaków ASCII itd.
Nie mo
ż
emy mie
ć
natomiast tablicy, w której wyst
ę
puj
ą
elementy
ró
ż
nych typów
Nowe mo
ż
liwo
ś
ci w tym zakresie stwarzaj
ą
tzw. struktury
Struktura jest konglomeratem typów danych i składa si
ę
z kilku
zwi
ą
zanych zmiennych, nazywanych składowymi
W przeciwie
ń
stwie do tablic, gdzie wszystkie elementy s
ą
tego
samego typu, ka
ż
da składowa struktury mo
ż
e mie
ć
własny typ,
ró
ż
ny od typów innych składowych
43
Programowanie obiektowe
Struktury
Przykład: dane osobowe
Imię
tekst do 25 znaków
Nazwisko
tekst do 35 znaków
PESEL
tekst 11 znakowy
Wiek
unsigned int
Wzrost
unsigned int
Płeć
char
Składowe stanowią jedną, logiczną całość
44
Programowanie obiektowe
Struktury
Schemat definicji typu strukturowego:
struct nazwa_rekordu {
Typ1 pole1;
Typ2 pole2;
Typ3 pole3;
…………
………...
TypN poleN;
} nazwa_zmiennej1, nazwa_zmiennej2, … ;
Pola w strukturze mogą
mieć różne typy danych
45
Programowanie obiektowe
Struktury
Zdefiniujmy trzy zmienne strukturowe przechowuj
ą
ce dane
osobowe:
struct osoba {
char imie[25];
char nazwisko[35];
char PESEL[11];
unsigned int wiek;
unsigned int wzrost;
char plec;
} Osoba1, Osoba2, Osoba3;
Trzy zmienne
strukturowe
Polami struktury mogą
być tablice
Albo zmienne typu
prostego
46
Programowanie obiektowe
Struktury
A zatem mamy trzy zmienne strukturowe o nazwach: Osoba1,
Osoba2, Osoba3, które b
ę
d
ą
przechowywały informacje o
trzech ró
ż
nych osobach
Zapiszemy dane Osoby1:
Osoba1.imie = „Franciszek”;
Osoba1.nazwisko = „Abacki”;
Osoba1.PESEL = „54061201254”;
Osoba1.wiek = 49;
Osoba1.wzrost = 175;
Osoba1.plec = ‘M’;
Uwaga na KROPKĘ – jest bardzo ważna !!!!!!
Oddziela nazwę zmiennej strukturowej od nazwy jej pola
47
Programowanie obiektowe
Struktury zagnieżdżone w strukturach
Załó
ż
my,
ż
e chcemy dodatkowo przechowywa
ć
dane
adresowe dla ka
ż
dej osoby. Definicja struktury dla adresu
mo
ż
e by
ć
nast
ę
puj
ą
ca:
Struct dane_adresowe {
Char ulica[40];
Char dom[4], lokal[4];
Char kod_p[6];
Char miejscowo
ść
[30];
};
W jaki sposób doł
ą
czy
ć
dane_adresowe do definicji struktury
dla danych osobowych?
48
Programowanie obiektowe
Struktury zagnieżdżone w strukturach
Po prostu jako jedno z pól struktury nale
ż
y zdefiniowa
ć
pole
zdefiniowane jako dane_adresowe:
struct osoba {
char imie[25];
char nazwisko[35];
char PESEL[11];
unsigned int wiek;
unsigned int wzrost;
char plec;
struct dane_adresowe adres;
} Osoba1, Osoba2, Osoba3;
Pole strukturowe,
zagnieżdżone wewnątrz
struktury
Struktura dane_adresowe
została zdefiniowana
wcześniej
49
Programowanie obiektowe
Struktury zagnieżdżone w strukturach
Jak zapisa
ć
informacje o tym,
ż
e Osoba1 mieszka w
Warszawie, Osoba2 w Krakowie, a Osoba3 w Olsztynie?
Mo
ż
na to zrobi
ć
tak, jak przedstawiono poni
ż
ej:
Osoba1.adres.miejscowo
ść
=„Warszawa”;
Osoba2.adres.miejscowo
ść
=„Kraków”;
Osoba3.adres.miejscowo
ść
=„Olsztyn”;
Mo
ż
na równie
ż
wczyta
ć
dowoln
ą
nazw
ę
z klawiatury,np.:
gets(Osoba3.adres.miejscowo
ść
);
Kolejne kropki wskazują na kolejne poziomy
zagnieżdżeń struktury
50
Programowanie obiektowe
Wskaźniki do struktur
Mo
ż
emy definiowa
ć
równie
ż
wska
ź
niki do struktur, np.:
struct osoba *wsk_osoba
Wówczas do pól struktury dostajemy si
ę
wykorzystuj
ą
c
zamiast kropki tzw. operator strzałkowy, np.:
wsk_osoba -> imie = „Anna”;
Pozostałe reguły pracy ze zmiennymi strukturowymi nie
ulegaj
ą
zmianie
Przykład u
ż
ycia wska
ź
ników do struktur
Program 2.7
51
Programowanie obiektowe