Jak działają specyfikatory %p
i %Fp
w poniższym kodzie?% p Specyfikator formatu w c
void main()
{
int i=85;
printf("%p %Fp",i,i);
getch();
}
otrzymuję O/P jako 0000000000000055 0000000000000055
Jak działają specyfikatory %p
i %Fp
w poniższym kodzie?% p Specyfikator formatu w c
void main()
{
int i=85;
printf("%p %Fp",i,i);
getch();
}
otrzymuję O/P jako 0000000000000055 0000000000000055
Jeśli jest to o co prosicie,% P i% Fp wydrukować wskaźnik, w szczególności adres, na który wskaźnik odnosi, a ponieważ drukuje część architektury twojego komputera, robi to w szesnastkowym.
W języku C można rzutować między wskaźnikiem a int, ponieważ wskaźnik jest po prostu liczbą 32-bitową lub 64-bitową (w zależności od architektury komputera), odnosząc się do wspomnianego fragmentu pamięci.
Oczywiście 55 na heksie ma 85 cyfr dziesiętnych.
% Fp nie jest wskaźnikiem, w zależności od kompilatorów. W przypadku gcc/clang,% F jest dla float, podobnie jak% f z niewielką różnicą. Poniższe 'p' będzie traktowane jako normalny znak do wydrukowania. – halfelf
hmm, więc dlaczego on dostaje 000 .... 55 dwa razy i nie p? (Zgadzam się z tobą, ponieważ sam to zrobiłem) –
% p jest do drukowania wskaźnik adresu.
85 w systemie dziesiętnym wynosi 55 w systemie szesnastkowym.
Na swoich wskaźników systemowych 64bit, więc pełna reprezentacja szesnastkowym to: 0000000000000055
Oto wynik kompilacji z moim komputerze:
format.c: 7: 5: ostrzeżenie: format '% s' oczekuje argumentu typu 'void *', ale argumentem 2 ma typ int '' [ -Wformat]
format.c: 7: 5: Uwaga: Format '% F' oczekuje argumentu typu 'podwójne', ale argumentu 3 jest typu 'int' [-Wformat]
więc nie ma ostrzeżenia ale kompiluje się, a wyjście to: 0x55 0.000000p
Jestem zaskoczony, że nie dostajesz p na końcu. Czy jesteś pewien, że dopasowania kodu i wyjścia? Domyślam się, że adres i również nie może być 0x0 ... 055 ... ale coś tu wygląda nie tak.
btw: typowe użycie% p byłoby wydrukować adres tj & I w przeciwieństwie int
jego celem jest, aby wydrukować wartość wskaźnika w formacie realizacji zdefiniowane. Odpowiednim argumentem musi być wartość void *
.
I %p
służy do drukowania adresu wskaźnika adresy są zależne od naszego bitu systemowego.
oprócz tego, co @Myforwik powiedział
% p jest do drukowania wskaźnik adresu.
% Fp prawdopodobnie użyty do wyświetlania wskaźnika FAR który ma postać -> (0x1234 0x5678):
85 dziesiętnie jest 55 w zapisie szesnastkowym.
Mam nadzieję, że teraz będzie dobrze.
Referencje: http://www.lix.polytechnique.fr/~liberti/public/computing/prog/c/C/FUNCTIONS/format.html http://www.winehq.org/pipermail/wine-devel/2005-March/034390.html
działa tak, jak powinno być, a wskaźnik float, to w czym problem? – halfelf