NOVINKA: Získej 40 hodin praktických dovedností s AI – ZDARMA ke každému akreditovanému kurzu!
S účinností od 26. 3. jsme aktualizovali Zásady zpracování osobních údajů – doplnili jsme informace o monitorování telefonických hovorů se zájemci o studium. Ostatní části zůstávají beze změn.

Diskuze – Lekce 1 - Úvod do ukazatelů v C++

Zpět

Upozorňujeme, že diskuze pod našimi online kurzy jsou nemoderované a primárně slouží k získávání zpětné vazby pro budoucí vylepšení kurzů. Pro studenty našich rekvalifikačních kurzů nabízíme možnost přímého kontaktu s lektory a studijním referentem pro osobní konzultace a podporu v rámci jejich studia. Toto je exkluzivní služba, která zajišťuje kvalitní a cílenou pomoc v případě jakýchkoli dotazů nebo projektů.

Komentáře
Avatar
Miroslav Jaroš:3.2.2019 16:01

Ten obrazok na zaciatku ukazuje len 16 bitov, resp. su v kazdej adrese len polovicne bity. Preco? Co sa tyka tej hodnoty 56, tak ta je v dvoch "polovicnych adresach". Tomuto nechapem, cumim na to 10 minut.

 
Odpovědět
3.2.2019 16:01
Avatar
Imrich Vízi
Člen
Avatar
Odpovídá na Miroslav Jaroš
Imrich Vízi:11.5.2019 16:49

Ukazatelé (pointery) -> "Následně vypíšeme hodnotu ukazatele (což je nějaká adresa v paměti, obvykle vysoké číslo, zde ho vypisujeme v desítkové soustavě) a dále vypíšeme hodnotu, na kterou ukazatel ukazuje."

Nemala by byť miesto desiatkovej sústavy šestnástková ?

 
Odpovědět
11.5.2019 16:49
Avatar
Odpovídá na Imrich Vízi
Patrik Valkovič:11.5.2019 16:58

Díky, opraveno.

Odpovědět
11.5.2019 16:58
Nikdy neumíme dost na to, abychom se nemohli něco nového naučit.
Avatar
Ľuboslav Janíček:24.9.2020 13:09

Súhlasím s Miroslavom, ten obrázok asi nie je správne.

 
Odpovědět
24.9.2020 13:09
Avatar
DarkCoder
Člen
Avatar
DarkCoder:25.9.2020 2:46

Pro všechny co řeší obrázek v článku, jak je uložena hodnota v paměti.

Ano. Obrázek není správný a to z následujících důvodů:

  1. Neodpovídá počet bitů v rámci bloku paměti
  2. Hodnota je v paměti chybně reprezentována.
  3. Hodnota v paměti je zapisována od nejlevnějších bitů

Každý blok paměti (1 byte) odpovídá 8 bitům. Celočíselná hodnota typu int ve 32bit prostředí bude mít 32bitů, v 16bit prostředí 16bitů. Hodnota 56 se vejde do jednoho bytu (< 256), tedy není možné, aby jiný nežli nejnižší byte byl nenulový. Hodnota se do paměti zapisuje od nejdražšího bitu po nejlevnější (od nejnižší adresy po nejvyšší).

Mějme příklad kde zobrazíme celé číslo 25 typu int v paměti ve 32bit prostředí.
Dejme tomu, že číslo bude uloženo na adresách 150 až 153. To jak je hodnota uložena v paměti (viz.obrázek). Adresy stoupají zprava doleva. Bit úplně vpravo je nejdražší, bit úplně vlevo je nejlevnější.

Následující úryvek kódu vypíše adresy a hodnoty jednotlivých bytů na dané adrese :

int var = 25;
void *p = &var;

for (int i = 0; i < sizeof(int); i++) {
    printf("%p %d\n", (char*)(p) + i, *((char*)(p) + i));
}

Výstup:

012FF9B8 25
012FF9B9 0
012FF9BA 0
012FF9BB 0

Pozn: Když budete ukázku kódu spouštět, mohou se adresy ve Vašem případě lišit. Nebudou se však lišit hodnoty uložené na těchto adresách (4 hodnoty pro 32bit prostředí, 2 hodnoty pro 16bit prostředí). První hodnota bude 25, druhá (další) budou 0.

Odpovědět
25.9.2020 2:46
"I ta nejlepší poučka postrádá na významu, není-li patřičně předána." - DarkCoder
Avatar
Cunnedda
Člen
Avatar
Cunnedda:5.11.2021 9:48

V sekci Předávání referencí je překlep v textu:

Tomuto způsobu, kdy se hodnota proměnné do parametru funkce zkopíruje, říkáme předávání hodnodnou.

 
Odpovědět
5.11.2021 9:48
Avatar
Pavel Glosl
Člen
Avatar
Pavel Glosl:24.2.2022 22:13

Obrázek uložení proměnné v paměti RAM špatně zachycuje binární hodnotu (číslo) 111000 rozloženou mezi dvě různé políčka, adresy a tím pádem i dva bajty. Správně by měla být hodnota 111000 binárně == 56 desítkově uložena jen v jendom jediném byte (bajtu) a to asi na poslední adrese vpravo. :-)

Odpovědět
24.2.2022 22:13
V jednoduchosti je síla.
Avatar
Pavel Glosl
Člen
Avatar
Pavel Glosl:24.2.2022 22:26

Nemám co bych dodal. Všiml jsem si (doposud neopravené?) chybky v obrázku uložení proměnné v paměti RAM, ale to už DarkCoder v komentářích (níže) dovysvětlil. Ačkoliv je tu ještě Endianita (Big endian versus Little endian), ale to bych asi prozatím 'zanedbal'.. :-)

Odpovědět
24.2.2022 22:26
V jednoduchosti je síla.
Avatar
Marek Němec
Člen
Avatar
Marek Němec:4.11.2023 21:53

K prohození 2 proměnných vám stačí pouze ty 2 proměnné

int a = 10;
int b = 5;
b = b + a;
a = b - a;
b = b - a;
 
Odpovědět
4.11.2023 21:53
Avatar
DarkCoder
Člen
Avatar
DarkCoder:14. ledna 15:19

Vraťme se opět k našemu programu. Tentokrát si kromě proměnné a definujeme i ukazatel na proměnnou a. Ten bude také typu int, avšak před jeho názvem bude tzv. dereferenční operátor * (hvězdička).

Pokud se jedná o deklaraci ukazatele, pak hvězdička nepředstavuje operátor dereference!

Proč v článku není uvedena následující varianta pro předávání pole funkci?

Např.

void print_arr(int *arr, int size);
Odpovědět
14. ledna 15:19
"I ta nejlepší poučka postrádá na významu, není-li patřičně předána." - DarkCoder
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 10 zpráv z 25.