Wska¹niki, tablice dynamiczne jednowymiarowe, staªe
|
|
- Aleksander Dudek
- 6 lat temu
- Przeglądów:
Transkrypt
1 Rozdziaª 9 Wska¹niki, tablice dynamiczne jednowymiarowe, staªe 9.1 Wst p Czym w C jest wska¹nik? Wska¹nik jest zmienn, która zawiera adres (wskazanie) innej zmiennej lub adres dowolnego obszaru w pami ci komputera, (np. mo»e by to adres obszaru danych lub adres kodu programu). Jak wiemy, poznane dot d zmienne (typów int, double, float, char, void) przechowywane s w pami ci RAM komputera dost pnej dla programu. Przykªadowo, gdy w programie zdeniujemy zmienn typu int i nadamy jej warot± : 5 i n t a = 104; 6 return 0 ; 7 } zmienna ta zostanie umieszczona w komórce pami ci RAM (dost pnej dla naszego programu) pod okre- ±lonym adresem: Dla powy»szego obrazka przykªadowy wska¹nik, który wskazywaªby na zmienn a, przechowywaªby jej adres w pami ci, czyli warto± Deklarowanie wska¹ników Poniewa» wska¹nik jest zmienn, która mo»e przechowywa jedynie adresy innych zmiennych, jego deklaracja ró»ni si od deklaracji zwykªych zmiennych. Mo»emy zadeklarowa wska¹nik na ka»dy dost pny w j zyku C typ danych, tj. mo»emy w programie zdeniowa : 196
2 ˆ wska¹nik na zmienn typu int ˆ wska¹nik na zmienn typu float ˆ wska¹nik na zmienn typu double ˆ wska¹nik na zmienn typu char ˆ wska¹nik na zmienn typu void Ogólny schemat deniowania wska¹nika wygl da nast puj co: 1 typ_danych * nazwa_wskaznika ; Je±li zdeniujemy wska¹nik, który wskazuje na zmienn, wówczas wska¹nik ten przechowuje adres tej zmiennej w pami ci. Je±li wska¹nik nie wskazuje na»adn zmienn, wówczas zamiast adresu wska¹nik przechowuje warto± NULL (wska¹nik nie wskazuje na nic). Cz sto w odniesieniu do wska¹ników, które nie wskazuj na nic, stosuje si równie» okre±lenie pusty wska¹nik. Na poni»szym przykªadzie zdeniowano wska¹niki do wszystkich typów danych j zyka C. W przykªadzie poni»ej wska¹niki nie wskazuj na razie na»adne zmienne, przechowuj wi c warto±ci NULL. 5 /* wskaznik na zmienna typu i n t */ 6 i n t * wi = NULL ; 7 8 /* wskaznik na zmienna typu f l o a t */ 9 f l o a t * wf = NULL ; /* wskaznik na zmienna typu double */ 1 double * wd = NULL ; /* wskaznik na zmienna typu char */ 15 char * wc = NULL ; /* wskaznik na zmienna typu void */ 18 void * wv = NULL ; 19 0 return 0 ; 1 } Nale»y zwróci szczególn uwag na deklarowanie wska¹ników. Gdy chcemy zdeniowa kilka wska¹ników, mo»emy to zrobi na spoosby: 5 /* pierwszy wskaznik na zmienna typu i n t */ 6 i n t * wi1 = NULL ; 7 8 /* drugi wskaznik na zmienna typu i n t */ 9 i n t * wi = NULL ; return 0 ; 1 } 197
3 lub: 5 /* dwa wskazniki na zmienna typu i n t */ 6 7 i n t * wi1 = NULL, * wi = NULL ; 8 9 return 0 ; 10 } Przed ka»d zmienn, któr chcemy zadeklarowa jako zmienn wska¹nikow, MUSI pojawi si symbol gwiazdki, gdy si nie pojawi, zmienna ta b dzie zwykª zmienn, a nie zmienn wska¹nikow : 5 i n t *a, b, *c, d, e, *f, *g, *h ; 6 7 i n t * p, r, s ; 8 9 i n t * x, *y, *z ; return 0 ; 1 } W powy»szym kodzie wska¹nikami s : d, e, r, s. a, c, f, g, h, p, x, y, z, natomiast zwykªe zmienne to 9.3 Deniowanie wska¹ników Aby wska¹niki mogªy by u»yteczne w programie, musz wskazywa na zmienne. Nale»y pami ta o tym,»e: ˆ wska¹nik typu int * (na przykªad int *wi) mo»e wskazywa tylko na zmienn typu int (na przykªad int i), ˆ wska¹nik typu float * (na przykªad float *wf) mo»e wskazywa tylko na zmienn typu float (na przykªad float f), ˆ wska¹nik typu double * (na przykªad double *wd) mo»e wskazywa tylko na zmienn typu double (na przykªad double di), ˆ wska¹nik typu char * (na przykªad char *wc) mo»e wskazywa tylko na zmienn typu char (na przykªad char c), Poniewa» wska¹nik mo»e przechowywa jedynie adresy, do wska¹nika nale»y wpisa adres zmiennej, na któr dany wska¹nik powinien wskazywa. Aby to uczyni, konieczne jest skorzystanie z operatorów, przeznaczonych dla wska¹ników. Ze wska¹nikami i adresami zwi zane s dwa operatory: ˆ operator adresu (referencji) & zwracaj cy adres zmiennej podanej po prawej stronie tego operatora ˆ operator wyªuskania (dereferencji) * identykuj cy obszar zmiennej wskazywanej przez wska¹nik podany po prawej stronie tego operatora 198
4 Adres zmiennej pobieramy za pomoc operatora &. W poni»szym przykªadzie wy±wietlamy warto± zmiennej (tak, jak robili±my to do tej pory), oraz jej adres w pami ci - pobieramy go za pomoc operatora & oraz wykorzystujemy %p jako ci g formatuj cy do wy±wietlenia adresu z pami ci RAM w funkcji printf: 5 /* d e k l a r a c j a zwyklej zmiennej */ 6 i n t a = 104; 7 8 /* w y s w i e t l e n i e w a r t o s c i zmiennej */ 9 printf ( "%d\n", a ) ; /* w y s w i e t l e n i e adresu zmiennej */ 1 printf ( "%p\n", &a ) ; return 0 ; 15 } Aby wska¹nik wskazywaª na zmienn, nale»y go zadeklarowa i przypisa mu adres zmiennej, na któr ma wskazywa. Skoro adres zmiennej mo»emy pobra za pomoc operatora &, mo»emy tak pobrany adres przypisa do wska¹nika, a nast pnie go wy±wietli : 5 /* d e k l a r a c j a zwyklej zmiennej typu i n t */ 6 i n t a = 104; 7 8 /* w y s w i e t l e n i e w a r t o s c i zmiennej */ 9 printf ( "%d\n", a ) ; 10 /* w y s w i e t l e n i e adresu zmiennej */ 11 printf ( "%p\n", &a ) ; 1 13 /* d e k l a r a c j a wskaznika na zmienna typu i n t */ 14 i n t *w ; /* pobranie adresu zmiennej a i wpisanie 17 j e j adresu do wskaznika */ 18 w = &a ; 19 0 /* w y s w i e t l e n i e adresu zmiennej za pomoca wskaznika */ 1 printf ( "%p\n", w ) ; 3 return 0 ; 4 } 199
5 Za pomoc instrukcji int *w = &a; zadeklarowali±my wska¹nik do zmiennej int oraz wpisalismy do niego adres zmiennej a. Teraz we wska¹niku w znajduje si adres zmiennej a w pami ci RAM dost pnej dla programu. Posiadaj c wska¹nik do zmiennej, mo»emy wy±wietli jej adres, jak równie» sam warto± zmiennej. W poni»szym przykªadzie deklarujemy zmienn zm oraz przypisujemy jej warto±. Nast pnie deklarujemy wska¹nik, który wskazuje na t zmienn, i wy±wietlamy adres zmiennej w pami ci, oraz jej warto± korzystaj c ze wska¹nika. Do pobrania warto±ci zmiennej za pomoc wska¹nika, który na ni wskazuje, u»ywamy operatora *. { 4 /* d e k l a r a c j a zwyklej zmiennej typu f l o a t */ 5 f l o a t zm = 5. 6 ; 6 7 /* wskaznik na zmienna typu f l o a t */ 8 f l o a t *w ; 9 10 /* wskaznik w wskazuje na zmienna zm */ 11 w = &zm ; 1 13 /* w y s w i e t l e n i e adresu zmiennej zm za pomoca wskaznika */ 14 printf ( "%p\n", w ) ; /* w y s w i e t l e n i e w a r t o s c i zmiennej zm za pomoca wskaznika */ 17 printf ( "%. f \n", *w ) ; return 0 ; 0 } 00
6 Za pomoc wska¹nika mo»emy zmieni warto± zmiennej. Zaªó»my,»e zmienna abc ma warto± pocz tkow równ 51. Deniujemy wska¹nik wsk który na ni wskazuje, wy±wietlamy warto± zmiennej. Nast pnie, u»ywaj c operatora * w odniesieniu do wska¹nika, wpisujemy do zmiennej abc warto± Operator * pozwala nam, maj c wska¹nik, dosta si do zmiennej i zmieni / wy±wietli jej warto± : { 4 /* zwykla zmienna typu i n t */ 5 i n t abc = 51; 6 7 /* zmienna wskaznikowa, wskaznik na zmienna typu i n t */ 8 i n t * wsk ; 9 10 /* wskaznik wskazuje t e r a z za zmienna abc */ 11 wsk = &abc ; 1 13 /* wyswietlamy wartosc zmiennej */ 14 printf ( "abc = %d\n", abc ) ; /* do zmiennej abc za pomoca wskaznika wpisujemy wartosc 4096 */ 17 /* to samo, co abc = 4096, poniewaz wsk wskazuje na abc */ 18 * wsk = 4096; 19 0 /* wyswietlamy wartosc zmiennej j u z zmieniona */ 1 printf ( "abc = %d\n", abc ) ; 3 return 0 ; 4 } Aby przyswoi sobie deniowanie wska¹ników, prosz przeanalizowa poni»sze przykªady: { 4 /* zmienna typu i n t */ 5 i n t a = 4 ; 6 7 /* wskaznik na typ int, n i e wskazuje na n i c */ 8 i n t * wsk = NULL ; 9 10 /* wskaznik wskazuje na zmienna a */ 11 wsk = &a ; 1 13 /* w y s w i e t l e n i e w a r t o s c i zmiennej a za 14 pomoca wskaznika i samej zmiennej */ 15 printf ( "*wsk = %d, a = %d \n\n", * wsk, a ) ; /* w y s w i e t l e n i e adresu zmiennej a za 01
7 18 pomoca wskaznika i samej zmiennej */ 19 printf ( "wsk = %p, &a = %p \n\n", wsk, &a ) ; 0 1 return 0 ; } 5 /* zmienne typu i n t */ 6 i n t a = 4, b = 5 ; 7 8 /* wskaznik na typ int, n i e wskazuje na n i c */ 9 i n t * wsk = NULL ; /* wskaznik wskazuje na zmienna a */ 1 wsk = &a ; printf ( "*wsk = %d\n", * wsk ) ; /* wskaznik wskazuje na zmienna b */ 17 wsk = &b ; printf ( "*wsk = %d\n", * wsk ) ; 0 1 return 0 ; } 0
8 5 /* zmienna typu i n t */ 6 i n t i = 104; 7 /* wskaznik na typ int, n i e wskazuje na n i c */ 8 i n t * wski = NULL ; 9 /* wskaznik wskazuje t e r a z na zmienna i */ 10 wski = &i ; 11 1 printf ( "* wski = %d \ t \ t i = %d \n", * wski, i ) ; 13 printf ( " wski = %p \ t &i = %p \n\n", wski, &i ) ; /* zmienna typu f l o a t */ 16 f l o a t f = ; 17 /* wskaznik na typ f l o a t, n i e wskazuje na n i c */ 18 f l o a t * wskf = NULL ; 19 /* wskaznik wskazuje t e r a z na zmienna f */ 0 wskf = &f ; 1 printf ( "* wskf = %f \ t f = %f \n", * wskf, f ) ; 3 printf ( " wskf = %p \ t &f = %p \n\n", wskf, &f ) ; 4 5 /* zmienna typu double */ 6 double d = ; 7 /* wskaznik na typ double, n i e wskazuje na n i c */ 8 double * wskd = NULL ; 9 /* wskaznik wskazuje t e r a z na zmienna d */ 30 wskd = &d ; 31 3 printf ( "*wskd = %l f \ t d = %l f \n", * wskd, d ) ; 33 printf ( "wskd = %p \ t &d = %p \n\n", wskd, &d ) ; /* zmienna typu char */ 36 char c = 'K ' ; 37 /* wskaznik na typ char, n i e wskazuje na n i c */ 38 char * wskc = NULL ; 39 /* wskaznik wskazuje t e r a z na zmienna c */ 40 wskc = &c ; 41 4 printf ( "*wskc = %c \ t \ t c = %c \n", * wskc, c ) ; 43 printf ( "wskc = %p \ t &c = %p \n\n", wskc, &c ) ; return 0 ; 46 } Prosz przyjrze si UWA NIE poni»szemu programowi: 03
9 5 i n t a = 104; 6 7 i n t * wsk = &a ; 8 9 i n t b ; 10 b = a + 1 ; 11 printf ( "%d\n", b ) ; 1 13 b = * wsk + 1 ; 14 printf ( "%d\n", b ) ; return 0 ; 17 } Je±li wsk wskazuje na a, wówczas instrukcje b = *wsk + 1 oraz b = a + 1 s równowa»ne, wykonuj TO SAMO. Gdy deniujemy wska¹nik, który wskazuje na zmienn, sam wska¹nik równie» znajduje si w pewnej komórce pami ci. Rozwa»my poni»szy przykªad: Gdy deklarujemy zmienn a zapisywana jest ona (przykªadowo) do komórki pami ci RAM o adresie 0x Gdy deklarujemy wska¹nik, który wskazuje na zmienn a, jego warto±ci jest adres zmiennej a w pami ci, czyli adres 0x Jednak, aby wska¹nik byª dost pny i mógª by u»ywany w programie, on równie» musi mie swoje miejsce w pami ci RAM. Dla powy»szego obrazka: wska¹nik wsk1 znajduje si w komórce pami ci RAM o adresie 0x W j zyku C mo»liwe jest zdeniowanie wska¹nika, kótry b dzie wskazywaª na inny wska¹nik. Poniewa» wska¹nik równie» ma swój wªasny adres w pami ci, mo»emy zdeniowa wska¹nik, który b dzie na niego wskazywaª: 04
10 Na obrazku powy»ej widzimy zmienn a, na któr wskazuje wska¹nik wsk1, na który wskazuje wska¹nik wsk. Wówczas wsk = 0x , wsk1 = 0x , a = 18 - wska¹nik wsk przechowuje adres w pami ci wska¹nika wsk1, wska¹nik wsk1 przechowuje adres w pami ci zmiennej a. W j zyku C taka konstrukcja b dzie wygl da nast puj co (oczywi±cie adresy b d si ró»ni, powy»sze to tylko przykªad): 5 /* zwykla zmienna typu i n t */ 6 i n t a = 18; 7 8 /* wskaznik na typ int, n i e wskazuje na n i c */ 9 i n t * wsk1 = NULL ; /* wskaznik wsk wskazuje na zmienna a */ 1 wsk1 = &a ; /* wskaznik na wskaznik na zmienna int, n i e 15 wskazuje na n i c */ 16 i n t ** wsk = NULL ; /* wskaznik wsk wskazuje na wskaznik wsk1 */ 19 wsk = &wsk1 ; 0 1 printf ( "Adres zmiennej a : \ t \ t \ t \ t %p \n", &a ) ; printf ( "Wartosc zmiennej a : \ t \ t \ t \ t %d \n\n", a ) ; 3 4 printf ( "Adres wskaznika wsk1 : \ t \ t \ t \ t %p \n", &wsk1 ) ; 5 printf ( "Wskaznik wsk1 wskazuje na adres : \ t \ t %p \n", wsk1 ) ; 6 printf ( " Wartosc pod adresem %p j e s t rowna \ t %d \n\n", wsk1, * wsk1 ) ; 7 8 printf ( "Adres wskaznika wsk : \ t \ t \ t \ t %p \n", &wsk ) ; 9 printf ( "Wskaznik wsk wskazuje na adres : \ t \ t %p \n", wsk ) ; 30 printf ( " Wartosc pod adresem %p j e s t rowna \ t %p \n\n", wsk, * wsk ) ; 31 3 return 0 ; 33 } Po skompilowaniu i uruchomieniu powy»szego programu zobaczymy: 05
11 Na obrazku / schemacie taki rozkªad adresów mo»na przedstawi nast puj co: Mo»na powiedzie,»e wska¹nik wsk1 wskazuje na zmienn a bezpo±rednio, natomiast wska¹nik wsk wskazuje na zmienn a po±rednio, za pomoc wska¹nika wsk1. Oczywi±cie mo»liwe jest zdeniowanie wska¹nika, który wskazuje na wska¹nik, wskazuj cy na wska¹nik, itd.... Mo»liwe jest równie» pobranie warto±ci zmiennej a za pomoc wska¹nika, który wskazuje na wska¹nik na zmienn a. 5 /* zwykla zmienna typu i n t */ 6 i n t a = 18; 7 8 /* wskaznik na typ int, n i e wskazuje na n i c */ 9 i n t * wsk1 = NULL ; /* wskaznik wsk wskazuje na zmienna a */ 1 wsk1 = &a ; /* wskaznik na wskaznik na zmienna int, n i e 15 wskazuje na n i c */ 16 i n t ** wsk = NULL ; /* wskaznik wsk wskazuje na wskaznik wsk1 */ 19 wsk = &wsk1 ; 0 1 printf ( "Wartosc zmiennej a j e s t rowna : \ t %d \n\n", ** wsk ) ; 3 return 0 ; 4 } 06
12 9.4 Operacje arytmetyczne na wska¹nikach Na wska¹nikach mog by wykonywane nast puj ce operacje: 1. przypisania: =. porównania: >, <, >=, <=, ==,!= 3. operacje powi kszania lub pomniejszania wska¹nika (+, -, ++, --, +=, -=) o liczb caªkowit (tylko dla wska¹ników zdeniowanych, czyli wskazuj cych ju» na co±) 4. operacje odejmowania wska¹ników tego samego typu - wyznaczenie odlegªo±ci pomi dzy dwoma adresami w pami ci Poni»ej przeanalizujemy i omówimy ka»d z mo»liwych operacji dost pnych dla wska¹ników. 1. Poniewa» wska¹niki przechowuj adresy, istnieje mo»liwo± przypisania jednej zmiennej adresowej do innej zmiennej adresowej. Oznacza to,»e je±li do jakiego± wska¹nika, np. wska¹nika wsk przypiszemy inny wska¹nik, np. wska¹nik wsk1, b dzie to oznacza, i» od tej pory wska¹nik wsk wskazuje na to samo, na co wskazuje wska¹nik wsk1 (oba wska¹niki przechowuj TEN SAM ADRES): 5 /* zwykla zmienna typu i n t */ 6 i n t a = 51; 7 8 /* wskazniki na zmienne typu i n t */ 9 i n t * wsk1, * wsk ; /* wskaznik wsk1 wskazuje na zmienna a */ 1 wsk1 = &a ; /* wskaznik wsk wskazuje na to samo, 15 co wskaznik wsk1, c z y l i wskaznik 16 wsk wskazuje t e r a z na zmienna a */ 17 wsk = wsk1 ; printf ( "*wsk1 = %d \ t \ t *wsk = %d \n\n", * wsk1, * wsk ) ; 0 printf ( " wsk1 = %p \ t wsk = %p \n\n", wsk1, wsk ) ; 1 return 0 ; 3 } 07
13 . Dost pne operatory porównania dla wska¹ników pozwalaj nam sprawdzi, czy dwa wska¹niki wskazuj te same zmienne (==), czy wskazuj na inne zmienne (!=), czy zmienna, na któr wskazuje jeden wska¹nik znajduje si w pami ci RAM wcze±niej / pó¹niej ni» inna zmienna, na któr wskazuje inny wska¹nik (>, <, >=, <=). Na poni»szym listingu zostaªy zaprezentowane przykªadowe wykorzystania operatorów porówania dla wska¹ników: 5 /* zwykla zmienna typu i n t */ 6 i n t a = 51; 7 /* zwykla zmienna typu i n t */ 8 i n t b = 51; 9 10 /* wskazniki na zmienne typu i n t */ 11 i n t * wsk1, * wsk ; 1 13 /* wskaznik wsk1 wskazuje na zmienna a */ 14 wsk1 = &a ; /* wskaznik wsk wskazuje na zmienna a */ 17 /* to samo mozna uzyskac p i s z a c : wsk = wsk1 */ 18 wsk = &a ; 19 0 /* spr czy oba wskazniki wskazuja na t e sama zmienna */ 1 i f ( wsk1 == wsk ) printf ( "Oba wskazniki wskazuja na t e sama zmienna \n\n" ) ; 3 4 /* t e r a z wskaznik wsk wskazuje na zmienna b */ 5 wsk = &b ; 6 7 /* spr czy oba wskazniki wskazuja na rozne zmienne */ 8 i f ( wsk1!= wsk ) 9 printf ( " Wskazniki wskazuja na rozne zmienne \n\n" ) ; i f ( wsk1 < wsk ) 3 printf ( "Zmienna b j e s t d a l e j w pamieci n i z zmienna a \n\n" ) ; 33 i f ( wsk1 <= wsk ) 34 printf ( "Zmienna b j e s t d a l e j w pamieci n i z zmienna a \n\n" ) ; printf ( "Sprawdzmy to, porownujac i c h adresy w RAMie: \ n\n" ) ; printf ( "wsk1 = %p \ t &a = %p \n", wsk1, &a ) ; 39 printf ( "wsk = %p \ t &b = %p \n", wsk, &b ) ; return 0 ; 4 } 08
14 3. Powi kszenie (pomniejszenie) wska¹nika o warto± N powoduje wyznaczenie adresu przesuni tego o N * sizeof(typ_zmiennej_wskazywanej) bajtów w kierunku rosn cych adresów, tj.: Dla przykªadu powy»ej: deniuj c wska¹nik na typ danych int wiemy, i» int zajmuje 4 bajty w pami ci RAM (mo»emy to sprawdzi za pomoc operatora sizeof(int) pisz c np.: printf("%d\n", sizeof(int));). Na powy»szym obrazku widzimy, iz na pocz tku wska¹nik w przechowywaª adres 36. Je±li zwi kszymy wska¹nik o N=1, czyli wykonamy instrukcj w ++ (lub w = w + 1, albo w += 1), wówczas zwi kszymy adres wska¹nika o 1 * 4 (skoro N = 1, a sizeof(int) = 4) który b dzie przechowywaª wówczas warto± 40 ( * 4 = 40). Sytuacja wygl da analogicznie w przypadku pomniejszania warto±ci wska¹nika. 5 /* zwykla zmienna typu i n t */ 6 i n t a = 51; 7 8 /* wskaznik na typ int, n i e wskazuje na n i c */ 9 i n t * wsk = NULL ; /* wskaznik wskazuje na zmienna a */ 1 wsk = &a ; printf ( " Aktualny adres zapisany we wskazniku : \ t \ t \ t %p \n", wsk ) ; 15 printf ( "Wartosc zmiennej wskazywanej przez wskaznik : \ t \ t %d \n", * wsk ) ; 16 printf ( " Aktualny adres zmiennej a : \ t \ t \ t \ t %p \n\n", &a ) ; /* zwiekszamy wskaznik o 1, przesuwamy adresy */ 19 /* t e r a z wskaznik n i e wskazuje juz na zmienna a, 0 t y l k o na inny adres w pamieci */ 1 wsk += 1 ; 3 printf ( " Aktualny adres zapisany we wskazniku : \ t \ t \ t %p \n", wsk ) ; 4 printf ( "Wartosc zmiennej wskazywanej przez wskaznik : \ t \ t %d \n", * wsk ) ; 5 printf ( " Aktualny adres zmiennej a : \ t \ t \ t \ t %p \n\n", &a ) ; 6 7 /* zmniejszamy wskaznik o 1, przesuwamy adresy */ 09
15 8 /* t e r a z wskaznik wskazuje juz na zmienna a */ 9 wsk = wsk 1 ; printf ( " Aktualny adres zapisany we wskazniku : \ t \ t \ t %p \n", wsk ) ; 3 printf ( "Wartosc zmiennej wskazywanej przez wskaznik : \ t \ t %d \n", * wsk ) ; 33 printf ( " Aktualny adres zmiennej a : \ t \ t \ t \ t %p \n\n", &a ) ; return 0 ; 36 } 4. Mo»liwe jest równie» sprawdzenie odlegªo±ci w pami ci RAM dwóch zmiennych - wykonujemy to równie» za pomoc wska¹ników, dzi ki którym mamy dost p do adresów zmiennych: 5 /* zwykla zmienna typu i n t */ 6 i n t a = 5. 1 ; 7 8 /* wskazniki na typ int, n i e wskazuja na n i c */ 9 i n t * wsk1 = NULL, * wsk = NULL ; /* wskaznik wsk1 wskazuje na zmienna a */ 1 wsk1 = &a ; wsk = wsk1 + ; printf ( " wsk1 = %p \ t wsk = %p \n\n", wsk1, wsk ) ; 17 printf ( " wsk wsk1 = %d \n", wsk wsk1 ) ; return 0 ; 0 } 10
16 9.5 Wska¹nik na staª Wska¹nik na staª, jak sama nazwa wskazuje, pokazuje na staª, której nie mo»emy zmieni. Mo»emy jednak zmieni to, na co wskazuje wska¹nik (adres). Nie mo»emy zmieni warto±ci zmiennej, na któr wskazuje wska¹nik. Istniej dwa sposoby deniowania wska¹ników na staªe: 1 const f l o a t * ptr = &zmienna ; f l o a t const * ptr = &zmienna ; Przykªad Nie mo»emy zmieni warto±ci, na któr wskazuje wska¹nik, je±li zechcemy to zrobi (linia 5) kompilator poinformuje nas o bª dzie. W poni»szym przykªadzie chcemy zmieni warto± zmiennej j z 666 na 45 - nie powiedzie sie to z wy»ej opisanych powodów: 3 i n t main ( i n t argc, char ** argv ) 5 // deklarujemy i definiujemy zmienna 6 const i n t i = 13, j = 666; 7 printf ( "zmienna = %d\n", i ) ; 8 9 // wskaznik wskazuje na s t a l a i 10 const i n t * ptr1 = &i ; 11 1 // wskaznik wskazuje na s t a l a i 13 i n t const * ptr = &i ; printf ( "* ptr1 = %d, * ptr = %d\n", * ptr1, * ptr ) ; // wskaznik moze wskazywac na inna s t a l a ptr = &j ; 19 0 printf ( "* ptr1 = %d, * ptr = %d\n", * ptr1, * ptr ) ; 1 //... a l e n i e mozemy zmienic wartosci, 3 // na ktora wskaznik wskazuje BLAD 4 // tu chcemy zmienic wartosc j z 666 na 45 5 * ptr = 4 5 ; 6 7 return 0 ; 8 } 9.6 Staªy wska¹nik Podobnie jak mo»emy deklarowa zwykªe staªe, tak samo mo»emy mie staªe wska¹niki. Staªy wska¹nik to taki, którego nie mo»na przestawi na inny adres. To wska¹nik, który ZAWSZE wskazuje na to samo 11
17 (na ten sam adres). Nie mo»emy zmieni adresu przechowywanego przez wska¹nik (wska¹nik zawsze b dzie wskazywaª na to samo, na t sam zmienn ), jednak mo»emy zmieni warto±c zmiennej, na któr ten wska¹nik wskazuje. Istniej dwa sposoby deniowania staªych wska¹ników: 1 i n t * const p = &zmienna ; const i n t * const *p = &zmienna ; Przykªad Kiedy spróbujemy zmieni adres wska¹nika (kiedy chcemy, aby wskazywaª na inn zmienn ), kompilator zawiadomi nas o bª dzie. 3 i n t main ( i n t argc, char ** argv ) 5 // deklarujemy i definiujemy zmienna 6 i n t i = 13; 7 printf ( "zmienna = %d\n", i ) ; 8 9 // deklarujemy i definiujemy wskaznik, 10 // ktory wskazuje na t e zmienna 11 i n t * wsk = &i ; 1 printf ( "*wsk = %d\n", * wsk ) ; // s t a l y wskaznik, wskazuje na zmienna 15 i n t * const p = &i ; 16 // to samo, co powyzej, s t a l y wskaznik 17 const i n t * const *r = &i ; i n t j = 987; 0 1 // BLAD wskaznik p wskazuje j u z na zmienna i // wiec n i e moze wskazywac na zmienna j 3 p = &j ; 4 5 // mozemy zmienic wartosc, na ktora 6 // wskazuje wskaznik 7 *p = 1040; 8 printf ( "zmienna = %d\n", i ) ; 9 30 return 0 ; 31 } 9.7 Operator sizeof Zanim nauczymy si tworzy dynamiczne tablice jednowymiarowe, musimy najpierw pozna dziaªanie operatora sizeof. Operator sizeof inaczej nazywany jest operatorem rozmiaru - operator ten dost pny jest w j zyku C i C++. Operatora u»ywamy podobnie jak funkcji, która jako argument pobiera (w naszym przypadku) nazw typu danych, którego rozmiar chcemy pozna, oraz zwraca jego rozmiar w bajtach. Przykªadowe u»ycie operatora zaprezentowano poni»ej: 1
18 5 i n t rozmiar = s i z e o f ( i n t ) ; 6 printf ( " Int zajmuje %d bajty w pamieci RAM\n", rozmiar ) ; 7 return 0 ; 8 } 9.8 Zwi zek pomi dzy wska¹nikiem a tablic Nale»y zapami ta, i» NAZWA TABLICY JEST WSKA NIKIEM DO PIERWSZEGO JEJ ELEMNETU. Oznacza to,»e mo»emy odnie± si do pierwszego elementu tablicy na dwa sposoby: ˆ za pomoc nazwy tablicy i indeksu o warto±ci 0 ˆ poprzez ten wska¹nik (sam nazw tablicy) W poni»szym kodzie korzystamy z tej wªasno±ci - skoro sama nzwa tablicy jest wska¹nikiem (do jej pierwszego elementu, elementu z pod indeksu 0), musimy do pobrania warto±ci ze wska¹nika u»y symbolu * (tak, jak robili±my to podczas pobierania warto±ci z danego adresu zapisanego we wska¹niku): 5 6 i n t tab [ ] = {104, 56, 384, 4096, 51}; 7 8 // odwolanie s i e za pomoca indeksu 9 printf ( "%d\n", tab [ 0 ] ) ; // odwolanie s i e za pomoca wskaznika ( samej nazwy t a b l i c y ) 1 printf ( "%d\n", * tab ) ; return 0 ; 15 } St d, tab[0] == *tab. Skoro tab (sama nazwa tablicy) jest wska¹nikiem na jej pierwszy element (czyli na element tab[0]) do wy±wietlenia warto±ci elementu musimy u»y symbolu *, który pozwala nam pobra warto± pod wskazanym adresem. Dlatego te» instrukcja printf("%d ",*tab); pokazuje warto± 13
19 pierwszego elementu tablicy (je±li tab to adres, wówczas *tab daje nam warto± z pod tego adresu): Mo»emy równie» wy±wietli adres pierwszego elementu tablicy, za pomoc samej jej nazwy (czyli wska¹nika, który przechowuje adres pierwszego jej elementu), lub pobieraj c adres zmiennej z tablicy z pod indeksu 0, u»ywaj c operatora pobrania adresu, &: 5 i n t n = 5 ; 6 i n t i ; 7 8 i n t tab [ ] = {104, 51, 56, 18}; 9 10 printf ( "%p\n", tab ) ; 11 printf ( "%p\n", &tab [ 0 ] ) ; 1 13 return 0 ; 14 } Poniewa» tablica w pami ci jest ci gªym obszarem, w którym kolejne elementy umieszczane s jeden po drugim, znaj c adres pierwszego elementu, mo»emy za pomoc wska¹nika uzyska dost p do jej kolejnych elementów. Pami tamy,»e na wska¹nikach mo»emy wykonywa operacj dodawania warto±ci do zmiennej wska¹nikowej, czyli przesuni cia wska¹nika na inny adres. Warto zauwa»y,»e w przypadku 14
20 elementów, które zajmuj np. 4 bajty pami ci (liczby typu int), b dziemy przy ka»dym zwi kszeniu wska¹nika przeskakiwa o te cztery bajty,»eby dosta si do nast pnej warto±ci tablicy. W przypadku tablicy typu char przeskok b dzie o jeden bajt - tyle ile zajmuje typ char. Reguªa ta dotyczy ka»dego innego typu. W poni»szym przykªadzie zadeklarowali±my tablic o elementach typu int. Za pomoc wska¹nika wy±iwetlamy adres jej pierwszego elementu. Aby wy±wietli adres kolejnego elementu do wska¹nika musimy doda warto± 1, czyli przesun wska¹nik na kolejny element tablicy: 5 i n t n = 5 ; 6 i n t i ; 7 8 i n t tab [ ] = {104, 51, 56, 18}; 9 10 /* wyswietlamy adres 1 go elementu t a b l i c y, elementu 104 */ 11 printf ( "%p\n", tab ) ; 1 printf ( "%p\n", &tab [ 0 ] ) ; /* przesuwamy wskaznik o 1 miejsce, c z y l i dla i n t a 4 bajty, 15 na element nastepny, ktorym j e s t 51 i wyswietlamy 16 adres go elementu t a b l i c y */ 17 printf ( "%p\n", tab+1) ; 18 printf ( "%p\n", &tab [ 1 ] ) ; 19 0 return 0 ; 1 } Poniewa» pod kolejnymi wska¹nikami kryj si elemnety tablicy, istnieje mo»liwo± pobrania ich warto±ci przy u»yciu operatora wyªuskania, czyli *: 15
21 5 i n t n = 5 ; 6 i n t i ; 7 8 i n t tab [ ] = {104, 51, 56, 18}; 9 10 /* wyswietlamy wartosc 1 go elementu t a b l i c y, elementu 104 */ 11 printf ( "%d\n", * tab ) ; 1 printf ( "%d\n", tab [ 0 ] ) ; /* przesuwamy wskaznik o 1 miejsce, c z y l i dla i n t a 4 bajty, 15 na element nastepny, ktorym j e s t 51 i wyswietlamy 16 wartosc go elementu t a b l i c y */ 17 printf ( "%d\n", *( tab+1) ) ; 18 printf ( "%d\n", tab [ 1 ] ) ; 19 0 return 0 ; 1 } Pisz c ogólnie, dla dowolnej tablicy: wska¹niki tab tab+1 tab+... tab+n-1 dane element pierwszy element drugi element trzeci... element n-1 indeksy n-1 Dzi ki temu, i» sama nazwa tablicy jest wska¹nikiem do 1-go jej elementu, mo»emy za pomoc przesuwania wska¹nika wy±wietli wszystkie elementy tablicy: 3 4 i n t main ( ) 5 { 6 i n t tab [ 1 0 ] = {1,,4, 5, 6, 4, 3,, 1, 0 } ; 7 i n t i ; 8 9 f o r ( i=0; i <10; i++) 16
22 10 printf ( "%d ", *( tab+i ) ) ; 11 1 printf ( "\n" ) ; f o r ( i=0; i <10; i++) 15 printf ( "%d ", tab [ i ] ) ; return 0 ; 18 } Poni»sze kody pokazuj ró»ne mo»liwe sposoby dost pu do elementów tablicy: ˆ Za pomoc operatora indeksu: 5 i n t tab [ 4 ] ; 6 i n t n = 4 ; 7 i n t i ; 8 9 f o r ( i=0;i<n ; i++) 10 { 11 scanf ( "%d", &tab [ i ] ) ; 1 } f o r ( i=0;i<n ; i++) 15 { 16 tab [ i ] *= ; 17 } f o r ( i=0;i<n ; i++) 0 { 1 printf ( "%d ", tab [ i ] ) ; } 3 4 return 0 ; 5 } ˆ Za pomoc indeksu i operatora wyªuskania: 5 i n t tab [ 4 ] ; 6 i n t n = 4 ; 7 i n t i ; 17
23 8 9 f o r ( i=0;i<n ; i++) 10 { 11 scanf ( "%d", ( tab+i ) ) ; 1 } f o r ( i=0;i<n ; i++) 15 { 16 *( tab+i ) *= ; 17 /* albo : */ 18 /* *( tab+i ) = * *( tab+i ) */ 19 } 0 1 f o r ( i=0;i<n ; i++) { 3 printf ( "%d ", *( tab+i ) ) ; 4 } 5 6 return 0 ; 7 } ˆ Za pomoc wska¹nika i operatora wyªuskania: 5 i n t tab [ 4 ] ; 6 i n t n = 4 ; 7 i n t i ; 8 i n t * wsk = NULL ; 9 10 f o r ( i=0, wsk=tab ; i<n ; i++, wsk++) 11 { 1 scanf ( "%d", wsk ) ; 13 } f o r ( i=0, wsk=tab ; i<n ; i++, wsk++) 16 { 17 * wsk *= ; 18 /* albo : */ 19 /* *wsk = * *wsk */ 0 } 1 f o r ( i=0, wsk=tab ; i<n ; i++, wsk++) 3 { 4 printf ( "%d ", * wsk ) ; 5 } 6 7 return 0 ; 8 } ˆ Za pomoc samych wska¹ników: (&tab[rozmiar] oraz tab+n oznaczaj adres ko«ca tablicy, ostatniego jej elementu, dzi ki czemu wska¹nik nie wyjdzie poza tablic ) 5 i n t tab [ 4 ] ; 6 i n t n = 4 ; 7 i n t i ; 8 i n t * wsk = NULL ; 9 10 f o r ( wsk=tab ; wsk < tab + n ; wsk++) 11 { 18
24 1 scanf ( "%d", wsk ) ; 13 } f o r ( wsk=tab ; wsk < tab + n ; wsk++) 16 { 17 * wsk *= ; 18 /* albo : */ 19 /* *wsk = * *wsk */ 0 } 1 f o r ( wsk=tab ; wsk < tab + n ; wsk++) 3 { 4 printf ( "%d ", * wsk ) ; 5 } 6 7 return 0 ; 8 } 5 i n t tab [ 4 ] ; 6 i n t n = 4 ; 7 i n t i ; 8 i n t * wsk = NULL ; 9 10 f o r ( wsk=tab ; wsk < &tab [ n ] ; wsk++) 11 { 1 scanf ( "%d", wsk ) ; 13 } f o r ( wsk=tab ; wsk < &tab [ n ] ; wsk++) 16 { 17 * wsk *= ; 18 /* albo : */ 19 /* *wsk = * *wsk */ 0 } 1 f o r ( wsk=tab ; wsk < &tab [ n ] ; wsk++) 3 { 4 printf ( "%d ", * wsk ) ; 5 } 6 7 return 0 ; 8 } 9.9 Wska¹niki i dynamiczne tablice jednowymiarowe Tablica dynamiczna (ang. dynamic array) jest tworzona w czasie uruchomienia programu. Jej rozmiar mo»e by wyliczany. Co wi cej, gdy przestanie by potrzebna mo»emy j usun z pami ci. Dzi ki tym wªasno±ciom program efektywniej wykorzystuje zasoby pami ciowe komputera. Aby utworzy tablic dynamiczn jednowymiarow liczb caªkowitych o rozmiarze (ilo±ci elementów) równej n, nale»y: 1. Zdeniowa zmienn wska¹nikow, która b dzie przechowywaªa adres pierwszego elementu tablicy. Jest to zwykªa denicja wska¹nika: 1 i n t * wsk ;. Przydzieli obszar pami ci dla tablicy. Nale»y zastosowa nast puj c konstrukcj : 1 i n t * tab = malloc ( n * s i z e o f ( i n t ) ) ; 19
25 Poniewa» nasza tablica ma przechowywa n elementów, a ka»dy z jej elementów ma by zmienn typu int, nale»y sprawdzi, ile bajtów w pami ci zajmuje int, a nast pni warto± t pomno-»y przez ilo± elementów tablicy - dzi ki temu przydzielimy pami na n elementów typu int - utworzymy tablic n-elementow liczb caªkowitych. 3. Do elementów tak utworzonej tablicy odwoªujemy si poprzez ich indeksy, na przykªad: 1 wsk [ 0 ], wsk [ 1 ], wsk [ ],... ogólnie: wsk[indeks], gdzie indeks - powinien by w zakresie od 0 do liczba_elementów - 1. Kompilator nie sprawdza, czy element o danym indeksie znajduje si faktycznie w tablicy. Nale»y zachowa ostro»no±, aby nie wyj± poza tablic. 4. Gdy tablica dynamiczna przestanie by potrzebna, usuwamy j z pami ci za pomoc instrukcji: 1 free ( wsk ) ; wsk = NULL ; Po tej operacji obszar pami ci zaj ty przez tablic zostaje zwrócony do systemu. Wska¹nik mo»na wykorzysta ponownie do innej tablicy wg powy»szych punktów. Tablicy dynamicznej u»ywamy tak samo jak zwykª tablice statyczn, nie trzeba operowa wska¹nikami (ale mo»na), wska¹niki potrzebne s przy jej deklaracji Tworzenie dynamicznej tablicy jednowymiarowej Przeanalizujmy poni»szy przykªad. Zaªó»my,»e chcemy stworzy dynamiczn, jednowymiarow tablic o ilo±ci elementów (rozmiarze) podanym przez u»ytkownika. Aby to zrobi, na pocz tku wczytujemy rozmiar tablicy, nast pnie przydzielamy dla niej pami... : 1 i n t n ; scanf ( "%d", &n ) ; 3 i n t * wski = NULL ; 4 wski = ( i n t *) malloc ( n * s i z e o f ( i n t ) ) ; 9.9. Dost p do elementów dynamicznej tablicy jednowymiarowej... zerujemy tablic, wy±wietlamy jej zawarto± (czyli uzyskujemy dost p do elmentów tablicy): 1 f o r ( i=0; i<n ; i++) wski [ i ] = 0 ; 3 4 f o r ( i=0; i<n ; i++) 5 printf ( "%d ", wski [ i ] ) ; 6 printf ( "\n" ) ; Usuwanie dynamicznej tablicy jednowymiarowej... i usuwamy przydzielon pami : 1 free ( wski ) ; wski = wski ; 0
26 9.9.4 Tworzenie, dost p do elementów oraz usuwanie dynamicznej tablicy jednowymiarowej Wszystkie powy»sze operacje, aby mogªy dziaªa jako program, zostaªy zebrane na listingu poni»ej. Zaprezentowany kod: 1. Wczytuje od u»ytkownika ilo± elementów tablicy. Deniuje wska¹niki na typy danych int, float, double, char 3. Korzystaj c ze wska¹ników przydziela pami dla ka»dej tablicy (dla tablicy elementów typu int, float, double, char) 4. Wypeªnia ka»d z tablic 5. Wy±wietla ka»d z tablic 6. Zwalnia pami na ka»d z przydzielonych tablic Podsumowuj c, na poni»szych przykªadach widzimy schematy tworzenia dynamicznych tablic jednowymiarowych o n elementach, dla ka»dego typu danych: 5 i n t i ; 6 7 /* i l o s c elementow t a b l i c y */ 8 i n t n ; 9 /* wczytanie i l o s c i elementow t a b l i c y */ 10 printf ( "Podaj i l o s c elementow t a b l i c y : \ n> " ) ; 11 scanf ( "%d", &n ) ; 1 13 /* wskaznik na zmienna typu i n t */ 14 i n t * wski = NULL ; /* p r z y d z i e l e n i e pamieci na n elemenotwa t a b l i c e intow */ 17 wski = ( i n t *) malloc ( n * s i z e o f ( i n t ) ) ; /* wyzerowanie t a b l i c y dynamicznej */ 0 f o r ( i=0; i<n ; i++) 1 wski [ i ] = 0 ; 3 /* w y s w i e t l e n i e t a b l i c y */ 4 f o r ( i=0; i<n ; i++) 5 printf ( "%d ", wski [ i ] ) ; 6 printf ( "\n" ) ; 7 8 /* z w o l n i e n i e pamieci p r z y d z i e l o n e j na t a b l i c e */ 9 free ( wski ) ; 30 wski = NULL ; 31 3 return 0 ; 33 } 5 i n t i ; 6 1
27 7 /* i l o s c elementow t a b l i c y */ 8 i n t n ; 9 /* wczytanie i l o s c i elementow t a b l i c y */ 10 printf ( "Podaj i l o s c elementow t a b l i c y : \ n> " ) ; 11 scanf ( "%d", &n ) ; 1 13 /* wskaznik na zmienna typu f l o a t */ 14 f l o a t * wsk = NULL ; /* p r z y d z i e l e n i e pamieci na n elemenotwa t a b l i c e f l o a t */ 17 wsk = ( f l o a t *) malloc ( n * s i z e o f ( f l o a t ) ) ; /* wyzerowanie t a b l i c y dynamicznej */ 0 f o r ( i=0; i<n ; i++) 1 wsk [ i ] = 0 ; 3 /* w y s w i e t l e n i e t a b l i c y */ 4 f o r ( i=0; i<n ; i++) 5 printf ( "%.1 f ", wsk [ i ] ) ; 6 printf ( "\n" ) ; 7 8 /* z w o l n i e n i e pamieci p r z y d z i e l o n e j na t a b l i c e */ 9 free ( wsk ) ; 30 wsk = NULL ; 31 3 return 0 ; 33 } 5 i n t i ; 6 7 /* i l o s c elementow t a b l i c y */ 8 i n t n ; 9 /* wczytanie i l o s c i elementow t a b l i c y */ 10 printf ( "Podaj i l o s c elementow t a b l i c y : \ n> " ) ; 11 scanf ( "%d", &n ) ; 1 13 /* wskaznik na zmienna typu double */ 14 double * wsk = NULL ; /* p r z y d z i e l e n i e pamieci na n elemenotwa t a b l i c e double */ 17 wsk = ( double *) malloc ( n * s i z e o f ( double ) ) ; /* wyzerowanie t a b l i c y dynamicznej */ 0 f o r ( i=0; i<n ; i++) 1 wsk [ i ] = 0 ; 3 /* w y s w i e t l e n i e t a b l i c y */ 4 f o r ( i=0; i<n ; i++) 5 printf ( "%.1 f ", wsk [ i ] ) ; 6 printf ( "\n" ) ; 7 8 /* z w o l n i e n i e pamieci p r z y d z i e l o n e j na t a b l i c e */ 9 free ( wsk ) ; 30 wsk = NULL ; 31 3 return 0 ; 33 }
28 5 i n t i ; 6 7 /* i l o s c elementow t a b l i c y */ 8 i n t n ; 9 /* wczytanie i l o s c i elementow t a b l i c y */ 10 printf ( "Podaj i l o s c elementow t a b l i c y : \ n> " ) ; 11 scanf ( "%d", &n ) ; 1 13 /* wskaznik na zmienna typu char */ 14 char * wsk = NULL ; /* p r z y d z i e l e n i e pamieci na n elemenotwa t a b l i c e char */ 17 wsk = ( char *) malloc ( n * s i z e o f ( char ) ) ; /* wyzerowanie t a b l i c y dynamicznej */ 0 f o r ( i=0; i<n ; i++) 1 wsk [ i ] = ' 0 ' ; 3 /* w y s w i e t l e n i e t a b l i c y */ 4 f o r ( i=0; i<n ; i++) 5 printf ( "%c ", wsk [ i ] ) ; 6 printf ( "\n" ) ; 7 8 /* z w o l n i e n i e pamieci p r z y d z i e l o n e j na t a b l i c e */ 9 free ( wsk ) ; 30 wsk = NULL ; 31 3 return 0 ; 33 } 9.10 Wska¹niki i funkcje Wska¹niki mog by argumentami funkcij. Je±li zechcemy napisa funkcj, która jako argument pobiera wska¹nik na zmienn caªkowit, i nie zwraca nic, jej nagªówek b dzie wygl daª nast puj co: void funkcja(int *wsk); Gdy funkcja pobiera wska¹nik do pierwszego elementu dynamicznie utworzonej jednowymiarowej tablicy (mówimy wówczas,»e funkcja pobiera jako argument dynamiczn tablic ), musimy jako kolejny argument poda ilo± jej elementów. Nagªówek takiej funkcji wygl da wi c nast puj co (funkcja nic nie zwraca): void fun(int *tab, int n);. Funkcja mo»e równie» zwraca wska¹nik (np. do pierwszego elementu utworzonej tablicy). Je±li w funkcji za pomoc wska¹ników tworzymy dynamiczn tablic elementów typu int a nast pnie zwracamy wska¹nik do pierwszego elementu, nagªówek funkcji b dzie wygl da nast puj co: int * fun(); (funkcja nie pobiera argumentów). Nale»y pami ta o tym, i» poniewa» wska¹nik ma dost p do oryginalnej zmiennej (za pomoc jej adresu), je±li do funkcji jako argument przeka»emy wska¹nik, który wskazuje na zmienn, a nast pnie za pomoc wska¹nika w funkcji zmodykujemy t zmienn, zmiana b dzie widoczna równie» po wyj±ciu z funkcji. Ta sama zasada obowi zuje podczas przekazywanie dynamicznych tablic (wska¹nika na pierwszy element tablicy). Prosz przeanalizowa poni»sze przykªady: #i n c l u d e <s t d l i b. h> 3 #i n c l u d e <s t r i n g. h> 4 5 void przypisz ( i n t *w ) 6 { 7 *w = 104; 3
29 8 } 9 10 i n t main ( ) 11 { 1 i n t a = 5 ; 13 i n t * wsk = &a ; printf ( "PRZED FUNKCJA: \ n\n" ) ; 16 printf ( "a = %d *wsk = %d\n", a, * wsk ) ; przypisz ( wsk ) ; 19 0 printf ( "\n" ) ; 1 printf ( "PO FUNKCJI: \ n\n" ) ; printf ( "a = %d *wsk = %d\n", a, * wsk ) ; 3 4 return 0 ; 5 } #i n c l u d e <s t d l i b. h> 3 #i n c l u d e <s t r i n g. h> 4 5 void zamien ( i n t * tab, i n t n ) 6 { 7 i n t i ; 8 f o r ( i=0; i<n ; i++) 9 tab [ i ] = 1000; 10 } 11 1 i n t main ( ) 13 { 14 i n t i ; 15 i n t *w = ( i n t *) malloc ( s i z e o f ( i n t ) * 4) ; f o r ( i=0; i<4; i++) 18 w [ i ] = i + 1 ; 19 0 printf ( "PRZED FUNKCJA: \ n\n" ) ; 1 f o r ( i=0; i<4; i++) 3 printf ( " tab[%d ] = %d\n", i, w [ i ] ) ; 4 5 zamien ( w, 4) ; 6 7 printf ( "\n" ) ; 8 printf ( "PO FUNKCJI: \ n\n" ) ; 9 f o r ( i=0; i<4; i++) 30 printf ( " tab[%d ] = %d\n", i, w [ i ] ) ; 4
30 31 3 free ( w ) ; return 0 ; 35 } Gdy w funkcji za pomoc wska¹nika utworzymy dynamiczn tablic, mo»emy z funkcji zwróci wska¹nik do pierwszego jej elementu, aby (przykªadowo) w funkcji main mie dost p do tak utworzonej tablicy. Ponizszy kod pokazuje, jak napisa funkcj, która pobiera jako argument ilo± elementów tablicy, nast pnie za pomoc wska¹nika dynamicznie j tworzy (przydziela jej pami ) i zwraca wska¹nik do niej (wska¹nik na dynamiczn tablic / wska¹nik do pierwszego elementu dynamicznej tablicy). Nast pnie w funkcji main wska¹nik zwrócony z funkcji zapisujemy do innego wska¹nika i wykonujemy operacje na tablicy, ostatecznie zwalniaj c przydzielon pami : #i n c l u d e <s t d l i b. h> 3 #i n c l u d e <s t r i n g. h> 4 5 f l o a t * alokuj ( i n t n ) 6 { 7 f l o a t *f = ( f l o a t *) malloc ( s i z e o f ( f l o a t ) * n ) ; 8 return f ; 9 } i n t main ( ) 1 { 13 i n t n ; 14 printf ( "Podaj i l o s c elementow t a b l i c y : \ n> " ) ; 15 scanf ( "%d", &n ) ; f l o a t * wsk = alokuj ( n ) ; i n t i=0; 0 f o r ( i=0; i<n ; i++) 1 { wsk [ i ] = i + 1 ; 3 printf ( "wsk[%d ] = %f \n", i, wsk [ i ] ) ; 4 } 5 6 free ( wsk ) ; 7 wsk = NULL ; 8 9 return 0 ; 30 } 5
31 9.11 Zadania do wykonania Wska¹niki Zadanie 0.0 Zadeklaruj zmienn typu caªkowitego, a. Zadeklaruj wska¹nik na zmienn typu caªkowitego, wa. Niech wska¹nik wa wskazuje na zmienn a. Wy±wietl warto± zmiennej a korzystaj c ze zmiennej i ze wska¹nika. Zmie«warto± zmiennej - ponownie wy±wietl warto± zmiennej a korzystaj c ze zmiennej i ze wska¹nika. Do warto±ci wskazywanej przez wska¹nik dodaj warto± 100 (skorzystaj z operatora *). Ponownie wy±wietl warto± zmiennej a korzystaj c ze zmiennej i ze wska¹nika. Zadanie 0.1 Zadeklaruj zmienn typu caªkowitego, a. Zadeklaruj dwa wska¹niki na zmienn typu caªkowitego, wa1 oraz wa. Niech wska¹nik wa1 wskazuje na zmienn a, natomiast wska¹nik wa wskazuje na wska¹nik wa1. Wy±wietl warto± zmiennej a korzystaj c ze zmiennej i z wska¹ników. Zmie«warto± zmiennej - ponownie wy±wietl warto± zmiennej a korzystaj c ze zmiennej i z wska¹ników. Do warto±ci wskazywanej przez wska¹nik wa dodaj warto± 100 (skorzystaj z operatora *). Ponownie wy±wietl warto± zmiennej a korzystaj c ze zmiennej i z wska¹ników. Zadanie 0. Zadeklaruj zmienn typu zmiennoprzecinkowego zm1. Zadeklaruj wska¹nik na zmienn typu zmiennoprzecinkowego, wsk. Niech wska¹nik wsk wskazuje na zmienn zm1. Za pomoc funkcji scanf i przy u»yciu wska¹nika, wczytaj warto± do zmiennej zm1. Wy±wietl warto± zmiennej zm1 korzystaj c ze zmiennej i ze wska¹nika. Zadanie 0.3 Napisz funkcj, która pobiera wska¹nik do zmiennej typu int, a nast pnie wpisuje do zmiennej wskazywanej przez wska¹nik warto± 104. Do funkcji dopisz program, w którym zadeklraujesz zmienn zm1, oraz wska¹nik wsk. Do zmiennej wpisz warto± 56, wy±wietl warto± zmiennej zm1 korzystaj c ze zmiennej i ze wska¹nika. Nast pnie wywoªaj funkcj, przeka» jej wska¹nik wsk, i ponownie wy±wietl warto± zmiennej zm1 korzystaj c ze zmiennej i ze wska¹nika. Zadanie 0.4 Zadeklaruj zmienn typu caªkowitego zm1. Zadeklaruj wska¹nik na zmienn typu caªkowitego, wsk. Niech wska¹nik wskazuje na zmienn. Za pomoc funkcji scanf i przy u»yciu wska¹nika, wczytaj warto± do zmiennej zm1. Zwi ksz warto± zmiennej zm1 korzystaj c ze wska¹nika i operatora ++. Ponownie wy±wietl warto± zmiennej zm1 korzystaj c ze zmiennej i ze wska¹nika. Zwi ksz warto± zmiennej zm1 korzystaj c ze wska¹nika i operatora. Ponownie wy±wietl warto± zmiennej zm1 korzystaj c ze zmiennej i ze wska¹nika. Zadanie 0.5 Zadeklaruj i ustaw warto±ci (ró»ne) dwóm zmiennych typu zmiennoprzecinkowego. Zadeklaruj te» dwa wska¹niki. Pierwszy wska¹nik pow inien wskazywa na pierwsz ze zmiennych. Drugi wska¹nik ustaw tak, by wskazywaª n a pierwszy. Wy±wietl warto± obu wska¹ników oraz warto±ci, na które wskazuj. Nast p nie pod pierwsz ze zmiennych (typu zmiennoprzecinkowego) podstaw drug i ponownie wy±w ietl informacje o wska¹nikach. Na ko«cu pierwszej ze zmiennych wska¹nikowych przypisz warto± 5 i znów wy±wietl informacje o wska¹nikach. Zadanie 1 Napisz funkcj otrzymuj c jako argumenty wska¹niki do dwóch zmiennych typu int, która 6
32 zamienia ze sob warto±ci wskazywanych zmiennych. Zadanie Napisz funkcj otrzymuj c jako argumenty wska¹niki do dwóch zmiennych typu int, która zamienia ze sob warto±ci wskazywanych zmiennych tylko wtedy gdy wskazywana przez drugi argument zmienna jest mniejsza od zmiennej wskazywanej przez pierwszy argument. Zadanie 3 Napisz funkcj, której argumentami s dwa wska¹niki typu int za± zwracan warto±ci jest suma warto±ci zmiennych wskazywanych przez argumenty. Zadanie 4 Napisz funkcj, której argumentami s i typu int oraz w wska¹nik do int, która przepisuje warto± i do zmiennej wskazywanej przez w. Zadanie 5 Napisz funkcj otrzymuj c jako argumenty wska¹niki do dwóch zmiennych typu int, która zwraca jako warto± mniejsz z liczb wskazywanych przez argumenty. Zadanie 6 Napisz funkcj otrzymuj c jako argumenty wska¹niki do dwóch zmiennych typu int, która zwraca jako warto± wska¹nik na zmienn przechowuj c mniejsz z liczb wskazywanych przez argumenty. Zadanie 7 Napisz funkcj double abs_diff(double *a, double *b), która zwraca warto± bezwzgl dn ró»nicy warto±ci wskazywanych przez parametry wej±ciowe a i b. Zadanie 8 Napisz funkcj, która dostaje jako argumenty dwa wska¹niki na liczby zmiennoprzecinkowe i zwraca jako warto± ten z otrzymanych wska¹ników, który wskazuje na warto± o wi kszej warto±ci bezwzgl dnej. Zadanie 9 Napisz funkcj, która dostaje jako argument wska¹nik na liczb caªkowit i zapisuje do zmiennej wskazywanej przez argument warto± wczytan ze standardowego wej±cia. Zadanie 10 int avg(int a, int b, float *result); Zaimplementuj funkcje avg, tak aby zwracaªa 0, je»eli zmienna result wskazuje na NULL. W przeciwnym przypadku funkcja ma zapisa w zmiennej wskazywanej przez result ±redni arytmetyczn liczb a i b oraz zwróci Wska¹niki i tablice Zadanie 11 Napisz bezargumentow funkcj, która rezerwuje pami dla pojedynczej zmiennej typu int i zwraca jako warto± wska¹nik do niej. Zadanie 1 Napisz bezargumentow funkcj, która rezerwuje pami dla pojedyn- czej zmiennej typu double i zwraca jako warto± wska¹nik do niej. Zadanie 13 Napisz funkcj dostaj c w argumencie dodatni liczb caªkowit n i zwracaj c wska¹nik do pierwszego elementu n-elementowej dynamicznej tablicy int-ów. Zadanie 14 Napisz funkcj, która dostaje jako argument tablic int-ów i zwalnia pami zajmowan przez przekazan w argumencie tablic. Zadanie 15 Napisz funkcj, która dostaje jako argument wska¹nik do tablicy int-ów i odwraca kolejno± elementów w tablicy nie korzystaj c z dost pu do elementów tablicy operatorami [ ] oraz (). Zadanie 16 Napisz funkcj int previous(int *a, int *b), która dostaje jako argu- menty wska¹niki do dwóch ró»nych elementów tej samej tablicy i zwraca warto± tego o wcze±niejszym indeksie. Zadanie 17 Napisz funkcj, która jako argument otrzymuje wska¹nik do liczby caªkowitej n, alokuje pami na n-elementow tablic liczb zmiennoprzecinkowych, a nast pnie zwraca jako warto± adres do 7
33 tak przydzielonego bloku pami ci. Zadanie 18 Napisz funkcj, która jako argument otrzymuje wska¹nik do liczby caªkowitej n, alokuje pami na n-elementow tablic liczb zmiennoprzecinkowych, a nast pnie zwraca jako warto± adres do tak przydzielonego bloku pami ci. W funkcji main wczytaj od u»ytkownika rozmiar tablicy (n), wywoªaj funkcj przekazuj c jej podane n, a nast pnie wypeªnij utworzon tablic zerami i j wy±wietl, kolejno zwolnij przydzielon dla niej pami. 8
7.3 Tablice jednowymiarowe dynamiczne
7.3 Tablice jednowymiarowe dynamiczne Tablice statyczne nie daj nam mo»liwo±ci decydowania o ich wymiarach podczas dziaªania programu. Oznacza to»e musimy zna wielko± tablicy na poziomie tworzenia aplikacji.
ˆ tablice statyczne (o staªej ilo±ci elementów) ˆ tablice dynamiczne (o zmiennej ilo±ci elementów) 7.1 Tablice jednowymiarowe statyczne
Rozdziaª 7 Tablice W niniejszym rozdziale zostan omówione tablice. Zostan zaprezentowane kody ¹ródªowe programów w j zyku C, pokazuj ce ich wykorzystanie w praktyce. Istnieje kilka rodzajów tablic w C,
Wska¹niki, tablice dynamiczne wielowymiarowe
Rozdziaª 11 Wska¹niki, tablice dynamiczne wielowymiarowe 11.1 Wst p Identycznie, jak w przypadku tablic statycznych, tablica dynamiczna mo»e by tablic jedno-, dwu-, trójitd. wymiarow. Tablica dynamiczna
1 Klasy. 1.1 Denicja klasy. 1.2 Skªadniki klasy.
1 Klasy. Klasa to inaczej mówi c typ który podobnie jak struktura skªada si z ró»nych typów danych. Tworz c klas programista tworzy nowy typ danych, który mo»e by modelem rzeczywistego obiektu. 1.1 Denicja
Lekcja 9 - LICZBY LOSOWE, ZMIENNE
Lekcja 9 - LICZBY LOSOWE, ZMIENNE I STAŠE 1 Liczby losowe Czasami spotkamy si z tak sytuacj,»e b dziemy potrzebowa by program za nas wylosowaª jak ± liczb. U»yjemy do tego polecenia: - liczba losowa Sprawd¹my
Lab 9 Podstawy Programowania
Lab 9 Podstawy Programowania (Kaja.Gutowska@cs.put.poznan.pl) Wszystkie kody/fragmenty kodów dostępne w osobnym pliku.txt. Materiały pomocnicze: Wskaźnik to specjalny rodzaj zmiennej, w której zapisany
P tle. Rozdziaª Wst p. 4.2 P tle P tla for(...);
Rozdziaª 4 P tle 4.1 Wst p Niniejszy rozdziaª zawiera opis p tli w j zyku C, wraz z przykªadowymi programami oraz ich obja±nieniem. 4.2 P tle P tla to element j zyka programowania, pozwalaj cy na wielokrotne,
1. Wprowadzenie do C/C++
Podstawy Programowania - Roman Grundkiewicz - 013Z Zaj cia 1 1 rodowisko Dev-C++ 1. Wprowadzenie do C/C++ Uruchomienie ±rodowiska: Start Programs Developments Dev-C++. Nowy projekt: File New Project lub
1. Wprowadzenie do C/C++
Podstawy Programowania :: Roman Grundkiewicz :: 014 Zaj cia 1 1 rodowisko Dev-C++ 1. Wprowadzenie do C/C++ Uruchomienie ±rodowiska: Start Programs Developments Dev-C++. Nowy projekt: File New Project lub
Listy i operacje pytania
Listy i operacje pytania Iwona Polak iwona.polak@us.edu.pl Uniwersytet l ski Instytut Informatyki pa¹dziernika 07 Który atrybut NIE wyst puje jako atrybut elementów listy? klucz elementu (key) wska¹nik
Wskaźniki i dynamiczna alokacja pamięci. Spotkanie 4. Wskaźniki. Dynamiczna alokacja pamięci. Przykłady
Wskaźniki i dynamiczna alokacja pamięci. Spotkanie 4 Dr inż. Dariusz JĘDRZEJCZYK Wskaźniki Dynamiczna alokacja pamięci Przykłady 11/3/2016 AGH, Katedra Informatyki Stosowanej i Modelowania 2 Wskaźnik to
1 Wska¹niki. 1.1 Wska¹nik typu VOID. Wska¹nik jest obiektem przechowuj cym adres (z pami ci) przypisanej do niego zmiennej.
1 Wska¹niki. Wska¹nik jest obiektem przechowuj cym adres (z pami ci) przypisanej do niego zmiennej. int a; int *b; a = 11; cout
Wskaźniki. Przemysław Gawroński D-10, p marca Wykład 2. (Wykład 2) Wskaźniki 8 marca / 17
Wskaźniki Przemysław Gawroński D-10, p. 234 Wykład 2 8 marca 2019 (Wykład 2) Wskaźniki 8 marca 2019 1 / 17 Outline 1 Wskaźniki 2 Tablice a wskaźniki 3 Dynamiczna alokacja pamięci (Wykład 2) Wskaźniki 8
ANALIZA NUMERYCZNA. Grzegorz Szkibiel. Wiosna 2014/15
ANALIZA NUMERYCZNA Grzegorz Szkibiel Wiosna 2014/15 Spis tre±ci 1 Metoda Eulera 3 1.1 zagadnienia brzegowe....................... 3 1.2 Zastosowanie ró»niczki...................... 4 1.3 Output do pliku
Lekcja 12 - POMOCNICY
Lekcja 12 - POMOCNICY 1 Pomocnicy Pomocnicy, jak sama nazwa wskazuje, pomagaj Baltiemu w programach wykonuj c cz ± czynno±ci. S oni szczególnie pomocni, gdy chcemy ci g polece«wykona kilka razy w programie.
Wskaźniki w C. Anna Gogolińska
Wskaźniki w C Anna Gogolińska Zmienne Zmienną w C można traktować jako obszar w pamięci etykietowany nazwą zmiennej i zawierający jej wartość. Przykład: kod graficznie int a; a a = 3; a 3 Wskaźniki Wskaźnik
Lekcja 9 Liczby losowe, zmienne, staªe
Lekcja 9 Liczby losowe, zmienne, staªe Akademia im. Jana Dªugosza w Cz stochowie Liczby losowe Czasami potrzebujemy by program za nas wylosowaª liczb. U»yjemy do tego polecenia liczba losowa: Liczby losowe
Wskaźniki a tablice Wskaźniki i tablice są ze sobą w języku C++ ściśle związane. Aby się o tym przekonać wykonajmy cwiczenie.
Część XXII C++ w Wskaźniki a tablice Wskaźniki i tablice są ze sobą w języku C++ ściśle związane. Aby się o tym przekonać wykonajmy cwiczenie. Ćwiczenie 1 1. Utwórz nowy projekt w Dev C++ i zapisz go na
Temat: Dynamiczne przydzielanie i zwalnianie pamięci. Struktura listy operacje wstawiania, wyszukiwania oraz usuwania danych.
Temat: Dynamiczne przydzielanie i zwalnianie pamięci. Struktura listy operacje wstawiania, wyszukiwania oraz usuwania danych. 1. Rodzaje pamięci używanej w programach Pamięć komputera, dostępna dla programu,
Co to jest sterta? Sterta (ang. heap) to obszar pamięci udostępniany przez system operacyjny wszystkim działającym programom (procesom).
Zarządzanie pamięcią Pamięć: stos i sterta Statyczny i dynamiczny przydział pamięci Funkcje ANSI C do zarządzania pamięcią Przykłady: Dynamiczna tablica jednowymiarowa Dynamiczna tablica dwuwymiarowa 154
Stałe, tablice dynamiczne i wielowymiarowe
Stałe, tablice dynamiczne i wielowymiarowe tylko do odczytu STAŁE - CONST tablice: const int dni_miesiaca[12]=31,28,31,30,31,30,31,31,30,31,30,31; const słowo kluczowe const sprawia, że wartość zmiennej
1 Bª dy i arytmetyka zmiennopozycyjna
1 Bª dy i arytmetyka zmiennopozycyjna Liczby w pami ci komputera przedstawiamy w ukªadzie dwójkowym w postaci zmiennopozycyjnej Oznacza to,»e s one postaci ±m c, 01 m < 1, c min c c max, (1) gdzie m nazywamy
ZASADY PROGRAMOWANIA KOMPUTERÓW
POLITECHNIKA WARSZAWSKA Instytut Automatyki i i Robotyki ZASADY PROGRAMOWANIA KOMPUTERÓW Język Język programowania: C/C++ Środowisko programistyczne: C++Builder 6 Wykład 9.. Wskaźniki i i zmienne dynamiczne.
Programowanie w C++ Wykład 5. Katarzyna Grzelak. 26 marca kwietnia K.Grzelak (Wykład 1) Programowanie w C++ 1 / 40
Programowanie w C++ Wykład 5 Katarzyna Grzelak 26 marca 2018 9 kwietnia 2018 K.Grzelak (Wykład 1) Programowanie w C++ 1 / 40 Pojęcia z poprzedniego wykładu Podział programu na funkcje podział na niezależne
DYNAMICZNE PRZYDZIELANIE PAMIECI
DYNAMICZNE PRZYDZIELANIE PAMIECI Pamięć komputera, dostępna dla programu, dzieli się na cztery obszary: kod programu, dane statyczne ( np. stałe i zmienne globalne programu), dane automatyczne zmienne
KURS C/C++ WYKŁAD 6. Wskaźniki
Wskaźniki KURS C/C++ WYKŁAD 6 Każda zmienna ma unikalny adres wskazujący początkowy obszar pamięci zajmowany przez tą zmienną. Ilość pamięci zajmowanej przez zmienną zależy od typu zmiennej. Adres można
> C++ dynamiczna alokacja/rezerwacja/przydział pamięci. Dane: Iwona Polak. Uniwersytet Śląski Instytut Informatyki
> C++ dynamiczna alokacja/rezerwacja/przydział pamięci Dane: Iwona Polak iwona.polak@us.edu.pl Uniwersytet Śląski Instytut Informatyki 1429536600 > Dzisiejsze zajęcia sponsorują słówka: new oraz delete
wykład II uzupełnienie notatek: dr Jerzy Białkowski Programowanie C/C++ Język C - funkcje, tablice i wskaźniki wykład II dr Jarosław Mederski Spis
i cz. 2 Programowanie uzupełnienie notatek: dr Jerzy Białkowski 1 i cz. 2 2 i cz. 2 3 Funkcje i cz. 2 typ nazwa ( lista-parametrów ) { deklaracje instrukcje } i cz. 2 typ nazwa ( lista-parametrów ) { deklaracje
Listy Inne przykªady Rozwi zywanie problemów. Listy w Mathematice. Marcin Karcz. Wydziaª Matematyki, Fizyki i Informatyki.
Wydziaª Matematyki, Fizyki i Informatyki 10 marca 2008 Spis tre±ci Listy 1 Listy 2 3 Co to jest lista? Listy List w Mathematice jest wyra»enie oddzielone przecinkami i zamkni te w { klamrach }. Elementy
Lab. 02: Algorytm Schrage
Lab. 02: Algorytm Schrage Andrzej Gnatowski 5 kwietnia 2015 1 Opis zadania Celem zadania laboratoryjnego jest zapoznanie si z jednym z przybli»onych algorytmów sªu» cych do szukania rozwi za«znanego z
x y x y x y x + y x y
Algebra logiki 1 W zbiorze {0, 1} okre±lamy dziaªania dwuargumentowe,, +, oraz dziaªanie jednoargumentowe ( ). Dziaªanie x + y nazywamy dodawaniem modulo 2, a dziaªanie x y nazywamy kresk Sheera. x x 0
wiczenie 1 Podstawy j zyka Java. Instrukcje warunkowe
wiczenie 1 Podstawy j zyka Java. Instrukcje warunkowe 1 Wprowadzenie 1.1 rodowisko programistyczne NetBeans https://netbeans.org/ 1.2 Dokumentacja j zyka Java https://docs.oracle.com/javase/8/docs/api/
1 Wskaźniki i zmienne dynamiczne, instrukcja przed zajęciami
1 Wskaźniki i zmienne dynamiczne, instrukcja przed zajęciami Celem tych zajęć jest zrozumienie i oswojenie z technikami programowania przy pomocy wskaźników w języku C++. Proszę przeczytać rozdział 8.
Przetwarzanie sygnaªów
Przetwarzanie sygnaªów Laboratorium 1 - wst p do C# Dawid Poªap Przetwarzanie sygnaªów Pa¹dziernik, 2018 1 / 17 Czego mo»na oczekiwa wzgl dem programowania w C# na tych laboratoriach? Dawid Poªap Przetwarzanie
Wskaźniki. Programowanie Proceduralne 1
Wskaźniki Programowanie Proceduralne 1 Adresy zmiennych Sterta 1 #include 2 3 int a = 2 ; 4 5 int main ( ) 6 { 7 int b = 3 ; 8 9 printf ( " adres zmiennej a %p\n", &a ) ; 10 printf ( " adres
> C++ wskaźniki. Dane: Iwona Polak. Uniwersytet Śląski Instytut Informatyki 26 kwietnia 2017
> C++ wskaźniki Dane: Iwona Polak iwona.polak@us.edu.pl Uniwersytet Śląski Instytut Informatyki 26 kwietnia 2017 >??? Co to jest WSKAŹNIK? ++ wskaźniki 2 / 20 >??? Co to jest WSKAŹNIK? To po prostu ADRES
Programowanie wspóªbie»ne
1 Zadanie 1: Bar Programowanie wspóªbie»ne wiczenia 6 monitory cz. 2 Napisz monitor Bar synchronizuj cy prac barmana obsªuguj cego klientów przy kolistym barze z N stoªkami. Ka»dy klient realizuje nast
Lekcja 6 Programowanie - Zaawansowane
Lekcja 6 Programowanie - Zaawansowane Akademia im. Jana Dªugosza w Cz stochowie Wst p Wiemy ju»: co to jest program i programowanie, jak wygl da programowanie, jak tworzy programy za pomoc Baltiego. Na
Programowanie w C++ Wykład 4. Katarzyna Grzelak. 19 marca K.Grzelak (Wykład 1) Programowanie w C++ 1 / 37
Programowanie w C++ Wykład 4 Katarzyna Grzelak 19 marca 2018 K.Grzelak (Wykład 1) Programowanie w C++ 1 / 37 Funkcje cd K.Grzelak (Wykład 1) Programowanie w C++ 2 / 37 Funkcja powtórzenie Funkcje == podprogramy
Zestaw 1 ZESTAWY A. a 1 a 2 + a 3 ± a n, gdzie skªadnik a n jest odejmowany, gdy n jest liczb parzyst oraz dodawany w przeciwnym.
ZESTAWY A Zestaw 1 Organizacja plików: Wszystkie pliki oddawane do sprawdzenia nale»y zapisa we wspólnym folderze o nazwie b d cej numerem indeksu, umieszczonym na pulpicie. Oddajemy tylko ¹ródªa programów
JAO - J zyki, Automaty i Obliczenia - Wykªad 1. JAO - J zyki, Automaty i Obliczenia - Wykªad 1
J zyki formalne i operacje na j zykach J zyki formalne s abstrakcyjnie zbiorami sªów nad alfabetem sko«czonym Σ. J zyk formalny L to opis pewnego problemu decyzyjnego: sªowa to kody instancji (wej±cia)
Języki i metodyka programowania. Wskaźniki i tablice.
Wskaźniki i tablice. Zmienna1 Zmienna2 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 Zmienna to fragment pamięci o określonym rozmiarze identyfikowany za pomocą nazwy, w którym może być przechowywana
Wskaźniki. Informatyka
Materiały Wskaźniki Informatyka Wskaźnik z punktu widzenia programisty jest grupą komórek pamięci (rozmiar wskaźnika zależy od architektury procesora, najczęściej są to dwa lub cztery bajty ), które mogą
Algorytmy zwiazane z gramatykami bezkontekstowymi
Algorytmy zwiazane z gramatykami bezkontekstowymi Rozpoznawanie j zyków bezkontekstowych Problem rozpoznawania j zyka L polega na sprawdzaniu przynale»no±ci sªowa wej±ciowego x do L. Zakªadamy,»e j zyk
Wskaźnik może wskazywać na jakąś zmienną, strukturę, tablicę a nawet funkcję. Oto podstawowe operatory niezbędne do operowania wskaźnikami:
Wskaźniki są nieodłącznym elementem języka C. W języku C++ także są przydatne i korzystanie z nich ułatwia pracę, jednak w odróżnieniu do C wiele rzeczy da się osiągnąć bez ich użycia. Poprawne operowanie
A = n. 2. Ka»dy podzbiór zbioru sko«czonego jest zbiorem sko«czonym. Dowody tych twierdze«(elementarne, lecz nieco nu» ce) pominiemy.
Logika i teoria mnogo±ci, konspekt wykªad 12 Teoria mocy, cz ± II Def. 12.1 Ka»demu zbiorowi X przyporz dkowujemy oznaczany symbolem X obiekt zwany liczb kardynaln (lub moc zbioru X) w taki sposób,»e ta
Vincent Van GOGH: M»czyzna pij cy li»ank kawy. Radosªaw Klimek. J zyk programowania Java
J zyk programowania JAVA c 2011 Vincent Van GOGH: M»czyzna pij cy li»ank kawy Zadanie 6. Napisz program, który tworzy tablic 30 liczb wstawia do tej tablicy liczby od 0 do 29 sumuje te elementy tablicy,
Tablice, funkcje, wskaźniki - wprowadzenie
Tablice, funkcje, wskaźniki - wprowadzenie Przemysław Gawroński D-10, p. 234 Wykład 4 19 listopada 2018 (Wykład 4) Tablice, funkcje, wskaźniki - wprowadzenie 19 listopada 2018 1 / 37 Outline 1 Tablice
Rekurencyjne struktury danych
Andrzej Jastrz bski Akademia ETI Dynamiczny przydziaª pami ci Pami, która jest przydzielana na pocz tku dziaªania procesu to: pami programu czyli instrukcje programu pami statyczna zwi zana ze zmiennymi
Programowanie i struktury danych
Programowanie i struktury danych Wykªad 3 1 / 37 tekstowe binarne Wyró»niamy dwa rodzaje plików: pliki binarne pliki tekstowe 2 / 37 binarne tekstowe binarne Plik binarny to ci g bajtów zapami tanych w
ARYTMETYKA MODULARNA. Grzegorz Szkibiel. Wiosna 2014/15
ARYTMETYKA MODULARNA Grzegorz Szkibiel Wiosna 2014/15 Spis tre±ci 1 Denicja kongruencji i jej podstawowe wªasno±ci 3 2 Systemy pozycyjne 8 3 Elementy odwrotne 12 4 Pewne zastosowania elementów odwrotnych
Język C zajęcia nr 11. Funkcje
Język C zajęcia nr 11 Funkcje W języku C idea podprogramów realizowana jest wyłącznie poprzez definiowanie i wywołanie funkcji. Każda funkcja musi być przed wywołaniem zadeklarowana. Deklaracja funkcji
Tablice, funkcje - wprowadzenie
Tablice, funkcje - wprowadzenie Przemysław Gawroński D-10, p. 234 Wykład 5 25 marca 2019 (Wykład 5) Tablice, funkcje - wprowadzenie 25 marca 2019 1 / 12 Outline 1 Tablice jednowymiarowe 2 Funkcje (Wykład
Ciaªa i wielomiany. 1 Denicja ciaªa. Ciaªa i wielomiany 1
Ciaªa i wielomiany 1 Ciaªa i wielomiany 1 Denicja ciaªa Niech F b dzie zbiorem, i niech + (dodawanie) oraz (mno»enie) b d dziaªaniami na zbiorze F. Denicja. Zbiór F wraz z dziaªaniami + i nazywamy ciaªem,
ARYTMETYKA MODULARNA. Grzegorz Szkibiel. Wiosna 2014/15
ARYTMETYKA MODULARNA Grzegorz Szkibiel Wiosna 2014/15 Spis tre±ci 1 Denicja kongruencji i jej podstawowe wªasno±ci 3 2 Systemy pozycyjne 8 3 Elementy odwrotne 12 4 Pewne zastosowania elementów odwrotnych
JĘZYKI PROGRAMOWANIA Z PROGRAMOWANIEM OBIEKTOWYM. Wykład 6
JĘZYKI PROGRAMOWANIA Z PROGRAMOWANIEM OBIEKTOWYM Wykład 6 1 SPECYFIKATOR static Specyfikator static: Specyfikator ten powoduje, że zmienna lokalna definiowana w obrębie danej funkcji nie jest niszczona
Lekcja 8 - ANIMACJA. 1 Polecenia. 2 Typy animacji. 3 Pierwsza animacja - Mrugaj ca twarz
Lekcja 8 - ANIMACJA 1 Polecenia Za pomoc Baltiego mo»emy tworzy animacj, tzn. sprawia by obraz na ekranie wygl daª jakby si poruszaª. Do animowania przedmiotów i tworzenia animacji posªu» nam polecenia
Liczby zmiennoprzecinkowe
Liczby zmiennoprzecinkowe 1 Liczby zmiennoprzecinkowe Najprostszym sposobem reprezentowania liczb rzeczywistych byªaby reprezentacja staªopozycyjna: zakªadamy,»e mamy n bitów na cz ± caªkowit oraz m na
2 Skªadnia polece«w pliku
Interpreter opisu dziaªa«platformy mobilnej wtyczki 1 Ogólny opis zadania Nale»y napisa program, który b dzie w stanie przeczyta z pliku tekstowego sekwencj polece«ruchu, a nast pnie zasymulowa dziaªanie
Wskaźniki, funkcje i tablice
, funkcje i tablice Zak lad Chemii Teoretycznej UJ 20 listopada 2008 wielowymiarowe 1 2 3 4 wielowymiarowe, funkcje i tablice Czym sa wskaźniki? Plan wielowymiarowe Zmienne wskaźnikowe wskazuja na inne
Lekcja 3 Banki i nowe przedmioty
Lekcja 3 Banki i nowe przedmioty Akademia im. Jana Dªugosza w Cz stochowie Banki przedmiotów Co ju» wiemy? co to s banki przedmiotów w Baltie potramy korzysta z banków przedmiotów mo»emy tworzy nowe przedmioty
Programowanie i struktury danych 1 / 44
Programowanie i struktury danych 1 / 44 Lista dwukierunkowa Lista dwukierunkowa to liniowa struktura danych skªadaj ca si z ci gu elementów, z których ka»dy pami ta swojego nast pnika i poprzednika. Operacje
Przykªadowe tematy z JiMP
Przykªadowe tematy z JiMP 1. Prosz napisa program, który dokona konwersji swojego argumentu wywoªania z punktw na centymetry, (77.27 pt = 1 cal = 2.54 cm) tzn. np. wywoªanie: c:\>pkt 144.54 = 5.08 cm spowoduje
Metody dowodzenia twierdze«
Metody dowodzenia twierdze«1 Metoda indukcji matematycznej Je±li T (n) jest form zdaniow okre±lon w zbiorze liczb naturalnych, to prawdziwe jest zdanie (T (0) n N (T (n) T (n + 1))) n N T (n). 2 W przypadku
WST P DO TEORII INFORMACJI I KODOWANIA. Grzegorz Szkibiel. Wiosna 2013/14
WST P DO TEORII INFORMACJI I KODOWANIA Grzegorz Szkibiel Wiosna 203/4 Spis tre±ci Kodowanie i dekodowanie 4. Kodowanie a szyfrowanie..................... 4.2 Podstawowe poj cia........................
Wstęp do programowania INP001213Wcl rok akademicki 2018/19 semestr zimowy. Wykład 4. Karol Tarnowski A-1 p.
Wstęp do programowania INP001213Wcl rok akademicki 2018/19 semestr zimowy Wykład 4 Karol Tarnowski karol.tarnowski@pwr.edu.pl A-1 p. 411B Plan prezentacji Tablice Wskaźniki Adresy pamięci Operator adresu
Proste modele o zªo»onej dynamice
Proste modele o zªo»onej dynamice czyli krótki wst p do teorii chaosu Tomasz Rodak Festiwal Nauki, Techniki i Sztuki 2018 April 17, 2018 Dyskretny model pojedynczej populacji Rozwa»my pojedyncz populacj
Typy danych i formatowanie
Typy danych i formatowanie Elwira Wachowicz elwira@ifd.uni.wroc.pl 28 marca 2013 Elwira Wachowicz (elwira@ifd.uni.wroc.pl) Typy danych i formatowanie 28 marca 2013 1 / 16 Sªowa kluczowe typów danych Pierwotne
Podstawy programowania 1
Podstawy programowania 1 Krzysztof Grudzień kgrudzi@kis.p.lodz.pl Wykład nr 2 1 Plan spotkań Wskaźniki Tablice jednowymiarowe & wska źniki. Programowanie w C. Wikibooks 2 Co to jest wskaźnik?? Wskaźnik
Rzut oka na zagadnienia zwi zane z projektowaniem list rozkazów
Rzut oka na zagadnienia zwi zane z projektowaniem list rozkazów 1 Wst p Przypomnijmy,»e komputer skªada si z procesora, pami ci, systemu wej±cia-wyj±cia oraz po- ª cze«mi dzy nimi. W procesorze mo»emy
Model obiektu w JavaScript
16 marca 2009 E4X Paradygmat klasowy Klasa Deniuje wszystkie wªa±ciwo±ci charakterystyczne dla wybranego zbioru obiektów. Klasa jest poj ciem abstrakcyjnym odnosz cym si do zbioru, a nie do pojedynczego
Kompilowanie programów
Rozdziaª 2 Kompilowanie programów 2.1 Wst p 2.2 Kompilatory, IDE Zacznijmy od podania kilku podstawowych informacji: ˆ Program - to ci g polece«(instrukcji) do wykonania dla komputera ˆ Program to algorytm
ARYTMETYKA MODULARNA. Grzegorz Szkibiel. Wiosna 2014/15
ARYTMETYKA MODULARNA Grzegorz Szkibiel Wiosna 2014/15 Spis tre±ci 1 Denicja kongruencji i jej podstawowe wªasno±ci 3 2 Systemy pozycyjne 8 3 Elementy odwrotne 12 4 Pewne zastosowania elementów odwrotnych
Podstawy programowania skrót z wykładów:
Podstawy programowania skrót z wykładów: // komentarz jednowierszowy. /* */ komentarz wielowierszowy. # include dyrektywa preprocesora, załączająca biblioteki (pliki nagłówkowe). using namespace
Ukªady równa«liniowych
dr Krzysztof yjewski Mechatronika; S-I 0 in» 7 listopada 206 Ukªady równa«liniowych Informacje pomocnicze Denicja Ogólna posta ukªadu m równa«liniowych z n niewiadomymi x, x, x n, gdzie m, n N jest nast
Wstęp do wskaźników w języku ANSI C
Wstęp do wskaźników w języku ANSI C / Materiał dydaktyczny pomocniczy do przedmiotu Informatyka sem.iii kier. Elektrotechnika/ 1. Wprowadzenie W języku ANSI C dla każdego typu X (wbudowanego, pochodnego,
Wst p do informatyki. Systemy liczbowe. Piotr Fulma«ski. 21 pa¹dziernika 2010. Wydziaª Matematyki i Informatyki, Uniwersytet Šódzki, Polska
Wst p do informatyki Systemy liczbowe Piotr Fulma«ski Wydziaª Matematyki i Informatyki, Uniwersytet Šódzki, Polska 21 pa¹dziernika 2010 Spis tre±ci 1 Liczby i ich systemy 2 Rodzaje systemów liczbowych
Informatyka I: Instrukcja 4.2
Informatyka I: Instrukcja 4.2 1 Wskaźniki i referencje - bezboleśnie Nauczyliśmy się do tej pory, że funkcje w języku C mogą zwracać wartość. Co jednak, gdybyśmy chcieli napisać funkcję, która rozwiąże
Aplikacje bazodanowe. Laboratorium 1. Dawid Poªap Aplikacje bazodanowe - laboratorium 1 Luty, 22, / 37
Aplikacje bazodanowe Laboratorium 1 Dawid Poªap Aplikacje bazodanowe - laboratorium 1 Luty, 22, 2017 1 / 37 Plan 1 Informacje wst pne 2 Przygotowanie ±rodowiska do pracy 3 Poj cie bazy danych 4 Relacyjne
WST P DO TEORII INFORMACJI I KODOWANIA. Grzegorz Szkibiel. Wiosna 2013/14
WST P DO TEORII INFORMACJI I KODOWANIA Grzegorz Szkibiel Wiosna 2013/14 Spis tre±ci 1 Kodowanie i dekodowanie 4 1.1 Kodowanie a szyfrowanie..................... 4 1.2 Podstawowe poj cia........................
ARYTMETYKA MODULARNA. Grzegorz Szkibiel. Wiosna 2014/15
ARYTMETYKA MODULARNA Grzegorz Szkibiel Wiosna 2014/15 Spis tre±ci 1 Denicja kongruencji i jej podstawowe wªasno±ci 3 2 Systemy pozycyjne 8 3 Elementy odwrotne 12 4 Pewne zastosowania elementów odwrotnych
W dowolnym momencie można zmienić typ wskaźnika.
c++ Wskaźniki mają jeszcze jedną przydatną cechę. W dowolnym momencie można zmienić typ wskaźnika. Robi się to za pomocą operatora rzutowania. Najpierw zdefiniujemy sobie wsk_uniwersalny mogący pokazywać
Wstęp do Programowania, laboratorium 02
Wstęp do Programowania, laboratorium 02 Zadanie 1. Napisać program pobierający dwie liczby całkowite i wypisujący na ekran największą z nich. Zadanie 2. Napisać program pobierający trzy liczby całkowite
6 Przygotował: mgr inż. Maciej Lasota
Laboratorium nr 6 1/5 Język C Instrukcja laboratoryjna Temat: Wskaźniki. 6 Przygotował: mgr inż. Maciej Lasota 1) Wskaźniki. Wskaźniki (zmienne wskaźnikowe) stanowią jedno z fundamentalnych pojęć języka
Metodydowodzenia twierdzeń
1 Metodydowodzenia twierdzeń Przez zdanie rozumiemy dowolne stwierdzenie, które jest albo prawdziwe, albo faªszywe (nie mo»e by ono jednocze±nie prawdziwe i faªszywe). Tradycyjnie b dziemy u»ywali maªych
19. Obiektowo± 1 Kacze typowanie. 2 Klasy
1 Kacze typowanie 19. Obiektowo± Sk d interpreter wie, jakiego typu s np. przekazywane do metody argumenty? Tak naprawd wcale nie musi wiedzie. Do poprawnego dziaªania programu istotne jest,»e przekazywany
Stałe, znaki, łańcuchy znaków, wejście i wyjście sformatowane
Stałe, znaki, łańcuchy znaków, wejście i wyjście sformatowane Stałe Oprócz zmiennych w programie mamy też stałe, które jak sama nazwa mówi, zachowują swoją wartość przez cały czas działania programu. Można
Relacj binarn okre±lon w zbiorze X nazywamy podzbiór ϱ X X.
Relacje 1 Relacj n-argumentow nazywamy podzbiór ϱ X 1 X 2... X n. Je±li ϱ X Y jest relacj dwuargumentow (binarn ), to zamiast (x, y) ϱ piszemy xϱy. Relacj binarn okre±lon w zbiorze X nazywamy podzbiór
Podstawy modelowania w j zyku UML
Podstawy modelowania w j zyku UML dr hab. Bo»ena Wo¹na-Szcze±niak Akademia im. Jan Dªugosza bwozna@gmail.com Wykªad 2 Zwi zki mi dzy klasami Asocjacja (ang. Associations) Uogólnienie, dziedziczenie (ang.
1. Odcienie szaro±ci. Materiaªy na wiczenia z Wprowadzenia do graki maszynowej dla kierunku Informatyka, rok III, sem. 5, rok akadem.
Materiaªy na wiczenia z Wprowadzenia do graki maszynowej dla kierunku Informatyka, rok III, sem. 5, rok akadem. 2018/2019 1. Odcienie szaro±ci Model RGB jest modelem barw opartym na wªa±ciwo±ciach odbiorczych
Wzorce projektowe strukturalne cz. 1
Wzorce projektowe strukturalne cz. 1 Krzysztof Ciebiera 19 pa¹dziernika 2005 1 1 Wst p 1.1 Podstawowe wzorce Podstawowe wzorce Podstawowe informacje Singleton gwarantuje,»e klasa ma jeden egzemplarz. Adapter
1 Metody iteracyjne rozwi zywania równania f(x)=0
1 Metody iteracyjne rozwi zywania równania f()=0 1.1 Metoda bisekcji Zaªó»my,»e funkcja f jest ci gªa w [a 0, b 0 ]. Pierwiastek jest w przedziale [a 0, b 0 ] gdy f(a 0 )f(b 0 ) < 0. (1) Ustalmy f(a 0
CCNA Subnetting Guide
CCNA Subnetting Guide Kataßzyna Mazur January 17, 2015 Contents Classful Networks (Sieci Klasowe) 2 Opis klas adresów 3 Subnetting Based on Network Requirements (Dzielenie sieci ze wzgl du na wymagan ilo±
Lekcja 3 - BANKI I NOWE PRZEDMIOTY
Lekcja 3 - BANKI I NOWE PRZEDMIOTY Wiemy ju» co to s banki przedmiotów i potramy z nich korzysta. Dowiedzieli±my si te»,»e mo»emy tworzy nowe przedmioty, a nawet caªe banki przedmiotów. Na tej lekcji zajmiemy
Podziaª pracy. Cz ± II. 1 Tablica sortuj ca. Rozwi zanie
Cz ± II Podziaª pracy 1 Tablica sortuj ca Kolejka priorytetowa to struktura danych udost pniaj ca operacje wstawienia warto±ci i pobrania warto±ci minimalnej. Z kolejki liczb caªkowitych, za po±rednictwem
Podstawy informatyki. Informatyka stosowana - studia niestacjonarne. Grzegorz Smyk. Wydział Inżynierii Metali i Informatyki Przemysłowej
Podstawy informatyki Informatyka stosowana - studia niestacjonarne Grzegorz Smyk Wydział Inżynierii Metali i Informatyki Przemysłowej Akademia Górniczo Hutnicza im. Stanisława Staszica w Krakowie, rok
Functionalization. Funkcje w C. Marcin Makowski. 30 listopada Zak lad Chemii Teoretycznej UJ
w C Zak lad Chemii Teoretycznej UJ 30 listopada 2006 1 2 3 Inicjalizacja zmiennych Zmienne jednowymiarowe można inicjować przy ich definicji. #include i n t x = 1 ; l o n g day = 1000L * 60L
Ekonometria - wykªad 8
Ekonometria - wykªad 8 3.1 Specykacja i werykacja modelu liniowego dobór zmiennych obja±niaj cych - cz ± 1 Barbara Jasiulis-Goªdyn 11.04.2014, 25.04.2014 2013/2014 Wprowadzenie Ideologia Y zmienna obja±niana
Techniki Programowania wskaźniki
Techniki Programowania wskaźniki Łukasz Madej Katedra Informatyki Stosowanej i Modelowania Wykłady opracowane we współpracy z Danutą Szeligą, Łukaszem Sztangretem Wskaźniki Dla typu T zapis T* oznacza
Laboratorium nr 9. Temat: Wskaźniki, referencje, dynamiczny przydział pamięci, tablice dynamiczne. Zakres laboratorium:
Laboratorium nr 9 Temat: Wskaźniki, referencje, dynamiczny przydział pamięci, tablice dynamiczne. Zakres laboratorium: wskaźniki referencje zastosowanie wskaźników wobec tablic dynamiczny przydział pamięci,