Wstep do programowania 1
Transkrypt
Wstep do programowania 1
Wstep ˛ do programowania 1 Wstep ˛ do programowania 1 Bożena Woźna-Szcześniak [email protected] Jan Długosz University, Poland Wykład 5 Wstep ˛ do programowania 1 Typ zmiennoprzecinkowy Typy zmiennoprzecinkowy float Najmniejszy typ rzeczywisty w C. Dobry do obliczeń z dokładnościa˛ do 6 miejsc po przecinku. Obliczenia przy użyciu tego typu sa˛ szybkie, ale łatwo można uzyskać przepełnienie. Typowa wartość minimalna to 10−38 . Typowa wartość maksymalna to 1038 . double “Średni” typ rzeczywisty w C. Dobry do obliczeń z dokładnościa˛ do 12 miejsc po przecinku. Typowa wartość minimalna to 10−308 . Typowa wartość maksymalna to 10308 . Znacznie wolniejszy w obliczeniach od float, ale za to bardziej precyzyjny. Wstep ˛ do programowania 1 Typ zmiennoprzecinkowy Typy zmiennoprzecinkowy long double Najwiekszy ˛ typ rzeczywisty w C. Dobry do obliczeń z dokładnościa˛ do 18 miejsc po przecinku. Typowa wartość minimalna to 10−4000 . Typowa wartość maksymalna to 104000 . Obliczenia sa˛ najwolniejsze, ale najbardziej dokładne. float.h Zbiór nagłówkowy zawierajacy ˛ stałe zwiazane ˛ z typem zmiennoprzecinkowym. Wstep ˛ do programowania 1 Typ zmiennoprzecinkowy Typ zmiennoprzecinkowy - float.h 1 2 3 4 5 6 7 8 9 # include < s t d i o . h> # include < f l o a t . h> i n t main ( void ) { p r i n t f ( " f l o a t min=%g , max=%g \ n " , FLT_MIN ,FLT_MAX ) ; p r i n t f ( " double min=%l g , max=%l g \ n " , DBL_MIN ,DBL_MAX ) ; p r i n t f ( " l o n g double min=%Lg , max=%Lg \ n " , LDBL_MIN ,LDBL_MAX ) ; return 0; } float min=1.17549e-38, max=3.40282e+38 double min=2.22507e-308, max=1.79769e+308 long double min=3.3621e-4932, max=1.18973e+4932 Wstep ˛ do programowania 1 Typ zmiennoprzecinkowy double Typ zmiennoprzecinkowy - double %lf printf wyświetla liczbe˛ rzeczywista˛ z dokładnościa˛ do 6 miejsc po przecinku. %le printf wyświetla liczbe˛ rzeczywista˛ z dokładnościa˛ do 6 miejsc po przecinku, ale w notacji wykładniczej. Np., 1.200000e − 05 znaczy 1.2 · 10−5 . %lg printf wyświetla liczbe˛ rzeczywista˛ z pominieciem ˛ “zbednych” ˛ zer i w najkrótszej możliwej postaci. Np. Zamiast 0.000012 dostajemy 1.2e-05. %a.blf a (np., a=7) wskazuje szerokość liczby, b (np. b=2) wskazuje precyzje˛ (dokładność po przecinku). %.2le Dokładność do 2 miejsc po przecinku w formacie wykładniczym. %.4lg Dokładność do 4 miejsc po przecinku w “zwiezłym” ˛ formacie. Wstep ˛ do programowania 1 Typ zmiennoprzecinkowy double Typ zmiennoprzecinkowy - double - przykład 1 1 2 3 4 5 6 7 8 9 10 11 # include < s t d i o . h> # include < f l o a t . h> i n t main ( void ) { double f = 3.1416 , g = 1 .2 e−5, h = 5000000000.0; p r i n t f ( " f=% l f \ t g=% l f \ t h=% l f \ n " , f , g , h ) ; p r i n t f ( " f=%l e \ t g=%l e \ t h=%l e \ n " , f , g , h ) ; p r i n t f ( " f=%l g \ t g=%l g \ t h=%l g \ n " , f , g , h ) ; p r i n t f ( " f =%7.2 l f \ t g =%.2 l e \ t h =%.4 l g \ n " , f , g , h ) ; return 0; } Wstep ˛ do programowania 1 Typ zmiennoprzecinkowy double Typ zmiennoprzecinkowy - double - przykład 1, wykonanie 1 2 3 4 5 6 7 8 9 10 11 # include < s t d i o . h> # include < f l o a t . h> i n t main ( void ) { double f = 3.1416 , g = 1 .2 e−5, h = 5000000000.0; p r i n t f ( " f=% l f \ t g=% l f \ t h=% l f \ n " , f , g , h ) ; p r i n t f ( " f=%l e \ t g=%l e \ t h=%l e \ n " , f , g , h ) ; p r i n t f ( " f=%l g \ t g=%l g \ t h=%l g \ n " , f , g , h ) ; p r i n t f ( " f =%7.2 l f \ t g =%.2 l e \ t h =%.4 l g \ n " , f , g , h ) ; return 0; } f=3.141600 f=3.141600e+00 f=3.1416 f= 3.14 g=0.000012 g=1.200000e-05 g=1.2e-05 g=1.20e-05 h=5000000000.000000 h=5.000000e+09 h=5e+09 h=5e+09 Wstep ˛ do programowania 1 Typ zmiennoprzecinkowy float Typ zmiennoprzecinkowy - float - przykład 2 1 2 3 4 5 6 7 8 9 10 11 # include < s t d i o . h> # include < f l o a t . h> i n t main ( void ) { f l o a t f = 3.1416 f , g = 1 .2 e−5f , h = 5000000000.0 f ; p r i n t f ( " f=%f \ t g=%f \ t h=%f \ n " , f , g , h ) ; p r i n t f ( " f=%e \ t g=%e \ t h=%e \ n " , f , g , h ) ; p r i n t f ( " f=%g \ t g=%g \ t h=%g \ n " , f , g , h ) ; p r i n t f ( " f =%7.2 f \ t g =%.2e \ t h =%.4g \ n " , f , g , h ) ; return 0; } Wstep ˛ do programowania 1 Typ zmiennoprzecinkowy float Typ zmiennoprzecinkowy - float - przykład 2, wykonanie 1 2 3 4 5 6 7 8 9 10 11 # include < s t d i o . h> # include < f l o a t . h> i n t main ( void ) { f l o a t f = 3.1416 f , g = 1 .2 e−5f , h = 5000000000.0 f ; p r i n t f ( " f=%f \ t g=%f \ t h=%f \ n " , f , g , h ) ; p r i n t f ( " f=%e \ t g=%e \ t h=%e \ n " , f , g , h ) ; p r i n t f ( " f=%g \ t g=%g \ t h=%g \ n " , f , g , h ) ; p r i n t f ( " f =%7.2 f \ t g =%.2e \ t h =%.4g \ n " , f , g , h ) ; return 0; } f=3.141600 f=3.141600e+00 f=3.1416 f= 3.14 g=0.000012 g=1.200000e-05 g=1.2e-05 g=1.20e-05 h=5000000000.000000 h=5.000000e+09 h=5e+09 h=5e+09 Wstep ˛ do programowania 1 Typ zmiennoprzecinkowy float Typ zmiennoprzecinkowy - long double - przykład 3, wykonanie 1 2 3 4 5 6 7 8 9 10 11 # include < s t d i o . h> # include < f l o a t . h> i n t main ( void ) { long double f = 3.1416 L , g = 1 .2 e−5L , p r i n t f ( " f=%L f \ t g=%L f \ t h=%L f \ n " , f , g , p r i n t f ( " f=%Le \ t g=%Le \ t h=%Le \ n " , f , g , p r i n t f ( " f=%Lg \ t g=%Lg \ t h=%Lg \ n " , f , g , p r i n t f ( " f =%7.2 L f \ t g =%.2Le \ t h =%.4Lg \ n " return 0; } f=3.141600 f=3.141600e+00 f=3.1416 f= 3.14 h = 5000000000.0L ; h); h); h); , f , g, h); g=0.000012 g=1.200000e-05 g=1.2e-05 g=1.20e-05 h=5000000000.000000 h=5.000000e+09 h=5e+09 h=5e+09 Wstep ˛ do programowania 1 Typ wyliczeniowy Typ wiliczeniowy ◮ Typ wyliczeniowy to automatyczny mechnizm służacy ˛ do generowania stałych o konkretnych nazwach. ◮ Przykład: enum dzien { poniedzialek, wtorek, sroda, czwartek, piatek, sobota, niedziela } ◮ W typie wyliczeniowym pierwsza wartość domyślnie jest równa zero (patrz przykład 1). ◮ Każda nastepna ˛ ma wartość wieksz ˛ a˛ o jeden - chyba że zostanie zdefiniowana inaczej (patrz przykłady 2 i 3). ◮ Stałe definiowane przy pomocy enums sa˛ implementowane przez kompilator jako “typy calkowite”. Konkretny typ – int, long, long long – jest dobierany na podstawie wartości stałej. Wstep ˛ do programowania 1 Typ wyliczeniowy Typ wiliczeniowy ◮ Typ wyliczeniowy to automatyczny mechnizm służacy ˛ do generowania stałych o konkretnych nazwach. ◮ Przykład: enum dzien { poniedzialek, wtorek, sroda, czwartek, piatek, sobota, niedziela } ◮ W typie wyliczeniowym pierwsza wartość domyślnie jest równa zero (patrz przykład 1). ◮ Każda nastepna ˛ ma wartość wieksz ˛ a˛ o jeden - chyba że zostanie zdefiniowana inaczej (patrz przykłady 2 i 3). ◮ Stałe definiowane przy pomocy enums sa˛ implementowane przez kompilator jako “typy calkowite”. Konkretny typ – int, long, long long – jest dobierany na podstawie wartości stałej. Wstep ˛ do programowania 1 Typ wyliczeniowy Typ wiliczeniowy ◮ Typ wyliczeniowy to automatyczny mechnizm służacy ˛ do generowania stałych o konkretnych nazwach. ◮ Przykład: enum dzien { poniedzialek, wtorek, sroda, czwartek, piatek, sobota, niedziela } ◮ W typie wyliczeniowym pierwsza wartość domyślnie jest równa zero (patrz przykład 1). ◮ Każda nastepna ˛ ma wartość wieksz ˛ a˛ o jeden - chyba że zostanie zdefiniowana inaczej (patrz przykłady 2 i 3). ◮ Stałe definiowane przy pomocy enums sa˛ implementowane przez kompilator jako “typy calkowite”. Konkretny typ – int, long, long long – jest dobierany na podstawie wartości stałej. Wstep ˛ do programowania 1 Typ wyliczeniowy Typ wiliczeniowy ◮ Typ wyliczeniowy to automatyczny mechnizm służacy ˛ do generowania stałych o konkretnych nazwach. ◮ Przykład: enum dzien { poniedzialek, wtorek, sroda, czwartek, piatek, sobota, niedziela } ◮ W typie wyliczeniowym pierwsza wartość domyślnie jest równa zero (patrz przykład 1). ◮ Każda nastepna ˛ ma wartość wieksz ˛ a˛ o jeden - chyba że zostanie zdefiniowana inaczej (patrz przykłady 2 i 3). ◮ Stałe definiowane przy pomocy enums sa˛ implementowane przez kompilator jako “typy calkowite”. Konkretny typ – int, long, long long – jest dobierany na podstawie wartości stałej. Wstep ˛ do programowania 1 Typ wyliczeniowy Typ wiliczeniowy ◮ Typ wyliczeniowy to automatyczny mechnizm służacy ˛ do generowania stałych o konkretnych nazwach. ◮ Przykład: enum dzien { poniedzialek, wtorek, sroda, czwartek, piatek, sobota, niedziela } ◮ W typie wyliczeniowym pierwsza wartość domyślnie jest równa zero (patrz przykład 1). ◮ Każda nastepna ˛ ma wartość wieksz ˛ a˛ o jeden - chyba że zostanie zdefiniowana inaczej (patrz przykłady 2 i 3). ◮ Stałe definiowane przy pomocy enums sa˛ implementowane przez kompilator jako “typy calkowite”. Konkretny typ – int, long, long long – jest dobierany na podstawie wartości stałej. Wstep ˛ do programowania 1 Typ wyliczeniowy enum - przykład 1 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 # include < s t d i o . h> enum d z i e n { p o n i e d z i a l e k , wtorek , sroda , czwartek , p i a t e k , / / sobota , n i e d z i e l a } ; i n t main ( void ) { enum d z i e n d z i s = wtorek ; while ( d z i s != sobota ) { p r i n t f ( " Dzi ś j e s t %d d z i e n t y g o d n i a wiec s i e˛ ucze ! \ n " , d z i s + 1 ) ; d z i s ++; } p r i n t f ( " Dzi ś j e s t %d d z i e n ty g o d n i a , c z y l i sobota " ,++ d z i s ) ; p r i n t f ( " wi ec ˛ mam wolne : ) ! \ n " ) ; p r i n t f ( " J u t r o j e s t %d d z i e n ty g o d n i a , c z y l i n i e d z i e l a " ,++ d z i s ) ; p r i n t f ( " wi ec ˛ mam t e ż wolne : ) ! \ n " ) ; return 0; } Wstep ˛ do programowania 1 Typ wyliczeniowy enum - przykład, wykonanie e ucze ! Dziś jest 2 dzien tygodnia wiec si˛ Dziś jest 3 dzien tygodnia wiec si˛ e ucze ! Dziś jest 4 dzien tygodnia wiec si˛ e ucze ! Dziś jest 5 dzien tygodnia wiec si˛ e ucze ! Dziś jest 6 dzien tygodnia czyli sobota wi˛ ec mam wolne :)! Jutro jest 7 dzien tygodnia czyli niedziela wi˛ ec mam też wolne :)! Wstep ˛ do programowania 1 Typ wyliczeniowy enum - przykład 2 1 2 3 4 5 6 7 8 9 10 # include < s t d i o . h> enum m i e s i a c { s ty c z e n =1 , l u t y , marzec , kwiecien , maj , czerwiec , l i p i e c , / / s i e r p i e n , wrzesien , p a z d z i e r n i k , l i s t o p a d , g r u d z i e n } ; i n t main ( void ) { p r i n t f ( "%d , %d , %d , " , styczen , l u t y , marzec ) ; p r i n t f ( "%d , %d , %d , " , kwiecien , maj , c z e r w i e c ) ; p r i n t f ( " . . . , %d . \ n " , g r u d z i e n ) ; return 0; } 1, 2, 3, 4, 5, 6,..., 12. Wstep ˛ do programowania 1 Typ wyliczeniowy enum - przykład 2 1 2 3 4 5 6 7 8 9 10 # include < s t d i o . h> enum m i e s i a c { s ty c z e n =1 , l u t y , marzec , kwiecien , maj , czerwiec , l i p i e c , / / s i e r p i e n , wrzesien , p a z d z i e r n i k , l i s t o p a d , g r u d z i e n } ; i n t main ( void ) { p r i n t f ( "%d , %d , %d , " , styczen , l u t y , marzec ) ; p r i n t f ( "%d , %d , %d , " , kwiecien , maj , c z e r w i e c ) ; p r i n t f ( " . . . , %d . \ n " , g r u d z i e n ) ; return 0; } 1, 2, 3, 4, 5, 6,..., 12. Wstep ˛ do programowania 1 Typ wyliczeniowy enum - przykład 3 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 # include < s t d i o . h> enum d i r e c t i o n { n o r t h = 0 , e a s t = 90 , south = 180 , west = 270 } ; i n t main ( void ) { int n; do { p r i n t f ( " Podaj co pokazuje kompas : " ) ; s c a n f ( "%d " ,&n ) ; switch ( n ) { case n o r t h : p r i n t f ( " I d z na Polnoc ! \ n " ) ; break ; case e a s t : p r i n t f ( " I d z na Wschod ! \ n " ) ; break ; case south : p r i n t f ( " I d z na P o l u d n i e ! \ n " ) ; break ; case west : p r i n t f ( " I d z na Zachod ! \ n " ) ; break ; d e f a u l t : p r i n t f ( " Kierunek n i e p r a w i d ł o w y ! ! ! \ n " ) ; break ; } } while ( ! ( ( n== n o r t h ) | | ( n== e a s t ) | | ( n==south ) | | ( n==west ) ) ) ; return 0; } Wstep ˛ do programowania 1 Typ wyliczeniowy enum - przykład 3, przykładowe wykonanie Podaj co pokazuje kompas: 2 Kierunek nieprawidłowy !!! Podaj co pokazuje kompas: 4 Kierunek nieprawidłowy !!! Podaj co pokazuje kompas: 90 Idz na Wschod . Wstep ˛ do programowania 1 Typ wyliczeniowy typdef i enum ◮ Standardowa definicja typu wyliczeniowego, wymaga użycia słowa kluczowego enum przy definiowaniu zmiennych tego typu, przy przekazywaniu argumentów do funkcji, itd. (patrz przykład 1). ◮ Aby uniknać ˛ tak uciażliwego ˛ stosowania nowo zdefiniowanego typu, można wykorzystać instrukcje˛ typdef ◮ Przykład: typedef enum {poniedzialek, wtorek, sroda, czwartek, piatek, sobota, niedziela} dzien; dzien dzis = wtorek; Wstep ˛ do programowania 1 Typ wyliczeniowy typdef i enum ◮ Standardowa definicja typu wyliczeniowego, wymaga użycia słowa kluczowego enum przy definiowaniu zmiennych tego typu, przy przekazywaniu argumentów do funkcji, itd. (patrz przykład 1). ◮ Aby uniknać ˛ tak uciażliwego ˛ stosowania nowo zdefiniowanego typu, można wykorzystać instrukcje˛ typdef ◮ Przykład: typedef enum {poniedzialek, wtorek, sroda, czwartek, piatek, sobota, niedziela} dzien; dzien dzis = wtorek; Wstep ˛ do programowania 1 Typ wyliczeniowy typdef i enum ◮ Standardowa definicja typu wyliczeniowego, wymaga użycia słowa kluczowego enum przy definiowaniu zmiennych tego typu, przy przekazywaniu argumentów do funkcji, itd. (patrz przykład 1). ◮ Aby uniknać ˛ tak uciażliwego ˛ stosowania nowo zdefiniowanego typu, można wykorzystać instrukcje˛ typdef ◮ Przykład: typedef enum {poniedzialek, wtorek, sroda, czwartek, piatek, sobota, niedziela} dzien; dzien dzis = wtorek; Wstep ˛ do programowania 1 Typ wyliczeniowy typdef i enum - przykład 4 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 # include < s t d i o . h> typedef enum { p o n i e d z i a l e k , wtorek , sroda , czwartek , p i a t e k , / / sobota , n i e d z i e l a } d z i e n ; i n t main ( void ) { m i e s i a c d z i e n = wtorek ; while ( d z i s != sobota ) { p r i n t f ( " Dzi ś j e s t %d d z i e n t y g o d n i a wiec s i e˛ ucze ! \ n " , d z i s + 1 ) ; d z i s ++; } p r i n t f ( " Dzi ś j e s t %d d z i e n ty g o d n i a , c z y l i sobota " ,++ d z i s ) ; p r i n t f ( " wi ec ˛ mam wolne : ) ! \ n " ) ; p r i n t f ( " J u t r o j e s t %d d z i e n ty g o d n i a , c z y l i n i e d z i e l a " ,++ d z i s ) ; p r i n t f ( " wi ec ˛ mam t e ż wolne : ) ! \ n " ) ; return 0; } Wstep ˛ do programowania 1 L- i R-wartości L-wartości oraz R-wartości ◮ L-wartość to wyrażenie, które może stać po lewej stronie operatora przypisania. ◮ ◮ ◮ R-wartość to wyrażenie, które może stać po prawej stronie operatora przypisania. ◮ ◮ ◮ a = b + 25; tab[3] = 0; // b + 25 = a; // tab = 5; Każda L-wartość jest R-wartościa˛ Wstep ˛ do programowania 1 Wskaźniki Pamieć ˛ i adresy ◮ Pamieć ˛ i adresy. Adresy i zawartość. (p00.c) ◮ ◮ ◮ Wartości i ich typy. (p01.c) ◮ ◮ Każda lokalizacja w pamieci ˛ jest identyfikowana przez unikalny adres. Każda lokalizacja w pamieci ˛ zawiera pewna˛ wartość. Typ wartości nie może być określony jedynie przez sprawdzenie sekwencji bitów Zawartość zmiennej wskaźnikowej. ◮ Zawartościa˛ zmiennej wskaźnikowej jest adres. Wstep ˛ do programowania 1 Wskaźniki Pamieć ˛ i adresy p00.c #include <stdio.h> #include <string.h> int main(void) { int a = -1; printf("a = %d\n\n", a); unsigned b = 0; memcpy(&b, &a, sizeof(b)); printf("b = %u\n\n", b); float c = 3.14; printf("c = %f\n\n", c); unsigned d = 0; memcpy(&d, &c, sizeof(d)); printf("d = %u\n\n", d); int* p = &a; printf("p = %p, *p=%d\n\n", p,*p); float* q = &c; printf("q = %p\n\n", q); return 0; } Wstep ˛ do programowania 1 Wskaźniki Pamieć ˛ i adresy p01.c #include <stdio.h> #include <string.h> int main(void) { char a[4] = {’s’, ’l’, ’a’, ’x’}; printf("a = %c%c%c%c\n\n", a[0], a[1], a[2], a[3]); printf("%p = \n",a); int b; memcpy(&b, &a, sizeof(b)); printf("b = %d\n\n", b); unsigned c; memcpy(&c, &a, sizeof(c)); printf("c = %u\n\n", c); float d; memcpy(&d, &a, sizeof(d)); printf("d = %f\n\n", d); int* p; memcpy(&p, &a, sizeof(p)); printf("p = %p\n\n", p); return 0; } Wstep ˛ do programowania 1 Wskaźniki Operator dereferencji ◮ Operator dereferencji. ◮ ◮ ◮ ◮ ◮ ◮ Niezainicjalizowane i nieprawidłowe wskaźniki. ◮ ◮ ◮ int a = 10; int* p = &a; // p wskazuje na zmienna˛ a printf("%d\n", *p); // 10 *p = 20; // *p to zmienna, na która˛ wskazuje p printf("%d\n", a); // 20 int* q; // zmienna q ma przypadkowa˛ wartość *q = 10; Wskaźnik NULL. ◮ int* q = NULL; Wstep ˛ do programowania 1 Wskaźniki Operator dereferencji Wyrażenie a b c d p q *p *q R-wartość -1 4294967295 3.14 1078523331 0xbf9e3574 0xbf9e356c -1 3.14 Typ int unsigned float unsigned int* float* int float Wstep ˛ do programowania 1 Wskaźniki Dereferencja i L-wartości ◮ Wskaźniki, dereferencja i L-wartości. ◮ ◮ ◮ ◮ int a = 10; int* p = &a; *p = 10 - *p; // p = 10 - *p; Wyrażenie a p *p &a L-wartość Tak Tak Tak Nie Wskazywana lokalizacja a p a — Wstep ˛ do programowania 1 Wskaźniki Wskaźniki do wskaźników ◮ Wskaźniki, dereferencja i zmienne. ◮ ◮ ◮ Stałe wskaźnikowe. ◮ ◮ ◮ int a; *&a = 10; // *100 = 25; *(int*)100 = 25; Wskaźniki do wskaźników. ◮ ◮ ◮ ◮ ◮ int a = 10; int* p; p = &a; int** q; q = &p; Wstep ˛ do programowania 1 Wskaźniki Wskaźniki do wskaźników Wartoźci wyrażeń Wyrażenie Odpowiadajace ˛ mu wyrażenia a p *p q *q **q 10 &a a, 10 &p p, &a *p, a, 10 Wstep ˛ do programowania 1 Wskaźniki Operacje na wskaźnikach ◮ Operacje na wskaźnikach. ◮ ◮ char c = ’A’; char* p = &c; Wyrażenie c &c p &p *p p * + 1 *(p + 1) R-wartość ’A’ adres zmiennej c adres zmiennej c adres zmiennej p ’A’ ’B’ ? L-wartość Tak Nie Tak Nie Tak Nie Tak Wstep ˛ do programowania 1 Wskaźniki Operacje na wskaźnikach ◮ Operacje na wskaźnikach. ◮ ◮ char c = ’A’; char* p = &c; Wyrażenie ++p p++ *++p *p++ ++*p (*p)++ ++*++p ++*p++ R-wartość adres nast. znaku adres c ? ’A’ ’B’ ’A’ ?+1 ’B’ L-wartość Nie Nie Tak Tak Nie Nie Nie Nie Wstep ˛ do programowania 1 Arytmetyka wskaźników Wyrażenie p+1 p+2 p jest wskaźnikiem na char short int double char short int double sizeof(*p) 1 2 4 8 1 2 4 8 Wartościa˛ dodawana do wskaźnika 1 2 4 8 2 4 8 16