background image

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

background image

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

background image

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

background image

4

Programowanie obiektowe

Deklaracja wskaźnika:

typ *nazwa;

Przykłady:

int  *wsk1;

char *wsk2;

Wskaźniki - podstawy

background image

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 otrzymuje adres zmiennej count

background image

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

otrzymuje wartość, znajdującą się pod adresem

m

Operatory wskaźnikowe:  

*

oraz  

&

background image

7

Programowanie obiektowe

Zadanie

Napisa

ć

 program wypisuj

ą

cy na ekranie liczb

ę

 100 z u

Ŝ

yciem 

wska

ź

nika na liczb

ę

 typu int.

Wskaźniki - podstawy

background image

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

background image

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

background image

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! */

background image

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, Ŝ

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

background image

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, Ŝ

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

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

background image

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

background image

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

background image

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 
ł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

background image

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)

background image

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

background image

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

background image

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

background image

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

background image

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 

background image

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

background image

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]

background image

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 (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

background image

25

Programowanie obiektowe

Wprowadzenie do języka C++



Dynamiczny przydział pami

ę

ci (alokacja):



operator new



np.

int *point;

point = new int;

*point = 999;

background image

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; 

background image

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

ą

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

background image

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

background image

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

background image

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]

background image

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

background image

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]

background image

33

Programowanie obiektowe

Inicjowanie wartości elementów tablic



Nie nale

Ŝ

y polega

ć

 na warto

ś

ciach inicjalizacyjnych tablic. Mo

Ŝ

e to by

ć

 

Ŝ

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:

......................

background image

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

background image

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*/

background image

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

background image

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

background image

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

background image

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

background image

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

background image

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

background image

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 

Ŝ

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, 

Ŝ

ny od typów innych składowych

background image

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ść

background image

44

Programowanie obiektowe

Struktury



Schemat definicji typu strukturowego:

struct nazwa_rekordu {

Typ1  pole1;

Typ2  pole2;

Typ3  pole3;

…………

………...

TypN poleN;

nazwa_zmiennej1nazwa_zmiennej2,  … ;

Pola w strukturze mogą 

mieć róŜne typy danych

background image

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

background image

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

background image

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?

background image

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

background image

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

background image

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

ą

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

background image

51

Programowanie obiektowe