Co znamená (int *) p?


Nejlepší odpověď

(int *) p je explicitní přetypování hodnoty uložené v proměnné p na typ ukazatele, jehož adresa ukazuje na celé číslo. Hodnota, kterou p ukládá, je adresa paměti prvního bajtu ze 4, které se používají k uložení uvedeného 32bitového (4 bajtového) celého čísla.

Ukazatel ukládá číslo, které měla by být adresa konkrétního umístění v paměti (halda nebo zásobník). Typ dat uložených v tomto umístění může být cokoli , a v tomto výrazu specifikujeme (nebo spíše předpokládáme), že se jedná o 4 bajtové celé číslo.

Hodnotu p lze před přidělením jinému ukazateli typicky vyslat –

int *c = (int *) p;

Nebo může být dereferencováno načíst hodnotu uloženou na adrese, kterou má p jako takovou –

int c = *((int *) p);

Nebo je-li p skutečně ukazatel sám, lze jej bez něj dereferencovat je výslovně vysíláno typicky, protože víme, že v něm uložená hodnota je 4 bajtové celé číslo.

Kvůli jednoduchosti jsem null nekontroloval ukazatele. Je nejdůležitější zkontrolovat, zda ukazatel nemá hodnotu null, protože zrušení odkazu na ukazatel null má za následek selhání.

Příklad hodnoty null zkontrolovat –

if (p != null)

printf(“int is ‘\%d’”, *p);

Nyní za předpokladu address is correct and that the pointer is not null, and that the data type stored in the memory location is in actually an integer, your console will print it correctly .

Zde je podrobný a dobře vysvětlený článek, na který jsem narazil před několika lety, o tom, jak číst ukazatele v c – ve směru hodinových ručiček / spirálové pravidlo

Odpověď

Abychom pochopili, co tam (int *) dělá, je užitečné pochopit, co dělá malloc (sizeof (int)). Rozdělte to zprava doleva.

Nejprve máme sizeof (int). Toto je hodnota představující počet bajtů požadovaný k reprezentaci celého čísla v paměti. Může to být 4 nebo jiné číslo podle toho, na jaký počítač programujeme.

Takže funkce malloc () ve skutečnosti získává parametr jako 4, a la malloc (4). Knihovna C někde v paměti a vyčlenit 4 bajty (což je shodná velikost přesně tak, aby obsahovala celé číslo).

Nyní funkce malloc vždy vrátí adresu této paměti. Připomeň si ten počítač paměť je uspořádána sériově a každá adresa v paměti je jedinečná. Nyní malloc () není moc chytrá funkce – řeknete jí, kolik paměti chcete, a řekne „tady to je“. Neví, co chcete vložit do této paměti – pouze ví, kolik paměti jste požadovali.

Protože malloc () neví, co chcete do této paměti vložit, vrátí typ s názvem (void *), tj. libovolná adresa paměti, jinak známá jako ukazatel. U většiny moderních počítačů je adresa 64bitová hodnota, kterou lze vyjádřit v 8 bajtech paměti – počítače se však liší r a různé počítače mohou vracet různé velikosti. Malloc () tedy může vrátit 8 bajtů dat ve formátu (void *).

Nakonec se musíme dostat dovnitř té paměti, kterou nám malloc () poskytl, abychom s ní mohli zacházet jako s obsahem celé číslo. Jak to děláme? malloc () nám právě dal ukazatel na nějakou paměť někde ve vesmíru. Děláme to tím, že řekneme kompilátoru, že adresa paměti, kterou jsme dostali zpět z malloc (), je opravdu adresa celého čísla. Odtud tedy váš (int *).

Nyní jste tím vším prošli, překladač pak plně chápe, co jste chtěli, protože jste si udělali tu námahu popsat každý krok: chcete osmibajtový adresa ukazující na čtyřbajtové místo v paměti, které zase obsahuje celé číslo.

A to znamená celý tento výraz!

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *