Nejlepší odpověď
Pokud potřebujete vytisknout adresu něčeho nebo obsah proměnné ukazatele, jediný skutečně přenosný způsob, jak to udělat, je použít specifikátor formátu\% p. Standard C uvádí, že vytištěné znaky jsou definované implementací, ale v praxi většina implementací knihovny C generuje sekvenci hexadecimálních číslic představujících adresu.
Specifikátoři formátu\% u a\% x očekávají celé číslo bez znaménka a vytiskněte hodnotu v desítkovém a šestnáctkovém pořadí. Neočekávají adresu .
Pokud použijete\% u nebo\% x (nebo cokoli jiného než\% p) k pokusu o vytiskne adresu, se může zdát, že funguje v některých prostředích, ale ve skutečnosti to bude nedefinované chování a nepřenosné . Nelze předpokládat, že velikost ukazatele je stejná jako velikost nepodepsaného celého čísla (nebo jiného celočíselného datového typu). Například v mnoha 64bitových prostředích je celé číslo bez znaménka 32 bitů. Pokud počet bitů v ukazateli neodpovídá počtu bitů v celé číslo bez znaménka ve vašem prostředí a pokusíte se použít\% u nebo\% x k tisku adresy, dostanete nesprávný výstup a výstup následujících položky ve stejném volání printf mohou být také nesprávné.
Takže pokud chcete tisknout adresu, vždy použijte specifikátor formátu\% p pro přenosný kód, který se vyhne nedefinovanému chování. Nikdy nepředpokládejte, že velikost ukazatele je stejná jako velikost jakéhokoli jiného datového typu C.
Odpovědět
Pouze \%p
převod správně chápe ukazatel. Konverze \%p
vytiskne ukazatel konkrétním způsobem implementace.
\%u
a \%x
převody jsou pro unsigned int
nebo int
typy, které mohou nebo nemusí mít stejnou velikost jako typ ukazatele. Konverze \%u
vytiskne desetinné celé číslo bez znaménka, zatímco \%x
vytiskne šestnáctkové celé číslo bez znaménka.
Komu vytisknout ukazatel buď \%u
nebo \%x
, budete muset vrhnout ukazatel na int
nebo unsigned int
. Toto obsazení může přijít o informace, pokud sizeof(void *) > sizeof(int)
.
Viz také: printf, fprintf, sprintf, snprintf, printf\_s , fprintf\_s