Advertisement
Heretiiik

ukazatele.cpp

Feb 16th, 2017
128
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.24 KB | None | 0 0
  1. #include <iostream>
  2. #include <conio.h>
  3.  
  4. // ukazkova struktura
  5. struct s {
  6.     float * a;
  7.     int b;
  8.  
  9.     // nazvěme to MAGIC, když to pošlu na výstup tak se to prostě vypíše obsah struktury
  10.     // když je a NULL tak to tam místo toho napíše NaN
  11.     friend std::ostream& operator<<(std::ostream& os, s& o) {
  12.         os << "struktura ( a = " << ((o.a == nullptr) ? NAN : *(o.a)) << ", b = " << o.b << ")";
  13.         return os;
  14.     };
  15.  
  16.     // tomu se říká konstruktor, další magic
  17.     // misto:
  18.     // a neco;
  19.     // neco.a = 5;
  20.     // neco.b = new float(3.14);
  21.     // lze:
  22.     // a neco(5, 3.14);
  23.     s(int ib) : b(ib) {
  24.         a = nullptr;
  25.     };
  26.  
  27.     s(int ib, float ia) : b(ib) {
  28.         a = new float(ia);
  29.     };
  30.  
  31.     s() {
  32.         a = nullptr;
  33.     }
  34. };
  35.  
  36.  
  37. int main()
  38. {
  39.     // prvni - lokalni, ukazatel ve strukture neiniciovany
  40.     s prvni(1);
  41.  
  42.     // druhy - lokalni, vše zadáno
  43.     s druha(2, 3.14f);
  44.  
  45.     // treti - ukazatel, ukazatel ve strukture neiniciovany
  46.     s * treti = new s(3);
  47.  
  48.     // ctvrta - ukazatel, vše zadáno
  49.     s * ctvrta = new s(4, 1.14f);
  50.  
  51.     // pata, po staru, ukazatel na float nechane prazdny
  52.     s * pata;
  53.     pata = new s();
  54.     (*pata).b = 5;
  55.     pata->a = nullptr;
  56.  
  57.     // sesta, použitý malloc, vše zadáno
  58.     s * sesta;
  59.     sesta = (s*)malloc(sizeof(s));
  60.     sesta->a = new float(1.01f);
  61.     (*sesta).b = 6;
  62.  
  63.     // exemplárně vypíšeme všechno co máme
  64.     std::cout << prvni << std::endl << druha << std::endl;
  65.     std::cout << treti << std::endl << ctvrta << std::endl;
  66.     std::cout << *treti << std::endl << *ctvrta << std::endl;
  67.     std::cout << pata << std::endl << sesta << std::endl;
  68.     std::cout << *pata << std::endl << *sesta << std::endl;
  69.  
  70.     // rozdil mezi new a malloc
  71.     // vždy kombinace new + delete nebo malloc(existuje ještě calloc, ale to je nepodstatný, FIY,) + free
  72.     // když cokoli ziniciuješ přes new/malloc, tak to tam zustane, dokud to neuvolníš
  73.     // nebo dokud nevypneš program. pokud něco neuvolníš bude to tam strašit. a může to dělat bordel.
  74.     // ukázka špatnýho chování
  75.  
  76.     int * cislo = new int(1); // iniciace ukazatele na int, s hodonou 1
  77.     std::cout << "adresa: " << cislo << " hodnota: " << *cislo << std::endl; // muzeme ho vypsat
  78.     cislo = new int(2); // nová iniciace ukaaztele, hodnota 2, timhle se ztrati ukazatel na ten predchozi, navzdy
  79.     std::cout << "adresa: " << cislo << " hodnota: " << *cislo << std::endl; // jina adresa
  80.     delete(cislo);
  81.     // ve vysledku jsi ztratil do konce programu (přibližně) 4B paměti, který už nikdy nezíkáš zpátky
  82.  
  83.     // teď k těm dereferencim. pouzivat budu jen jednu strukturu, ktera je cela zaplnena
  84.     // ve vysledku je jedno jak se ta struktura iniciaovala
  85.     // bude to ve tvaru "vyraz" - "vysledek"
  86.  
  87.     // sesta - adresa
  88.     std::cout << "sesta - " << sesta << std::endl;
  89.  
  90.     // *sesta - struktura (tady se zavolá ta magic funkce a vypíše co v ní je)
  91.     std::cout << "*sesta - " << *sesta << std::endl;
  92.  
  93.     // (*sesta).b - cislo 6
  94.     std::cout << "(*sesta).b - " << (*sesta).b << std::endl;
  95.  
  96.     // sesta->b - cislo 6 - shodne s predchozim
  97.     std::cout << "sesta->b - " << sesta->b << std::endl;
  98.  
  99.     // *sesta.b - cislo 6 - toto je chyba, nejde zkompilovat!
  100.     //std::cout << "*sesta.b - " << *sesta.b << std::endl;
  101.  
  102.     // sesta->b - cislo 6 - shodne s predchozim
  103.     std::cout << "sesta->b - " << sesta->b << std::endl;
  104.  
  105.     // (*sesta).a - adresa ukazatele ve strukture
  106.     std::cout << "(*sesta).a - " << (*sesta).a << std::endl;
  107.  
  108.     // sesta->a - adresa ukazatele ve strukture - shodne s predchozim
  109.     std::cout << "sesta->a - " << sesta->a << std::endl;
  110.  
  111.     // *(*sesta).a - cislo 1.01
  112.     std::cout << "*(*sesta).a - " << *(*sesta).a << std::endl;
  113.  
  114.     // *sesta->a - cislo 1.01 - shodne s predchozim
  115.     std::cout << "*sesta->a - " << *sesta->a << std::endl;
  116.  
  117.     // (*sesta).*a - toto nefunguje!, hvezdicku uplne na zacatek.
  118.     //std::cout << "*(*sesta).a - " << (*sesta).*a << std::endl;
  119.  
  120.     // sesta->*a - toto tez nefunguje!
  121.     //std::cout << "sesta->*a - " << sesta->*a << std::endl;
  122.  
  123.     // a magie nakonec, [] funguje jako dereference
  124.     // sesta[n] === *(sesta + n*sizeof(s)), pro n = 0 je to jen *(sesta)
  125.     // to n to posune o n délek té struktury v paměti, (zvýší se adresa)
  126.     // a formálně jsme iniciovali pole o velikosti 1, takže
  127.     // sesta[0].a[0] - cislo 1.01
  128.     std::cout << "sesta[0].a[0] - " << sesta[0].a[0] << std::endl;
  129.     _getch();
  130. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement