2012-09-28 11 views
10

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

+0

działa tak, jak powinno być, a wskaźnik float, to w czym problem? – halfelf

Odpowiedz

16

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.

+1

% 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

+0

hmm, więc dlaczego on dostaje 000 .... 55 dwa razy i nie p? (Zgadzam się z tobą, ponieważ sam to zrobiłem) –

1

% 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

2

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

2

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.

Powiązane problemy