Porównaj ceny domen i usług IT, sprzedawców z całego świata

Formatowanie printf (% d vs.% u)


Jaka jest różnica między
% d
a
% u
podczas drukowania adresów wskaźników?
Na przykład:
int a = 5;
// check the memory address
printf("memory address = %d\n", &a);// prints "memory address = -12"
printf("memory address = %u\n", &a);// prints "memory address = 65456"

Zaproszony:
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Na

ta strona
http://www.cplusplus.com/refer ... intf/
możesz znaleźć listę formatowania znaków specjalnych.
% d
to liczba całkowita ze znakiem, a
% u
to liczba całkowita bez znaku. Wskaźniki (gdy są postrzegane jako liczby) są zwykle nieujemne.
Jeśli naprawdę chcesz wyświetlić wskaźnik, użyj specyfikatora formatu
% p
.
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:


%u

zwraca liczbę całkowitą bez znaku

%d

wyprowadza liczbę całkowitą ze znakiem
aby uzyskać adres użycia wskaźnika

%p


Kolejna lista formatowania znaków specjalnych:
>
Oto pełna lista formatowania znaków specjalnych. Podaję tylko zrzut ekranu z

tej strony
http://www.cplusplus.com/reference/cstdio/printf/
https://i.stack.imgur.com/VRH1V.png
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Jeśli dobrze rozumiem twoje pytanie, potrzebujesz
% p
, aby pokazać adres, którego używa wskaźnik, na przykład:
int main() {
int a = 5;
int *p = &a;
printf("%d, %u, %p", p, p, p); return 0;
}

wyświetli coś takiego:
-1083791044, 3211176252, 0xbf66a93c
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

% u jest używane dla liczby całkowitej bez znaku. Ponieważ adres pamięci określony przez adres w postaci liczby całkowitej ze znakiem% d wynosi -12, kompilator zwraca wartość całkowitą bez znaku dla tego adresu, aby uzyskać tę wartość w postaci liczby całkowitej bez znaku.
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Różnica jest prosta: powodują pojawienie się różnych komunikatów ostrzegawczych podczas kompilacji:
<pre class="lang-none prettyprint-override">
1156942.c:7:31: warning: format ‘%d’ expects argument of type ‘int’, but argument 2 has type ‘int *’ [-Wformat=]
printf("memory address = %d\n", &a);// prints "memory add=-12"
^
1156942.c:8:31: warning: format ‘%u’ expects argument of type ‘unsigned int’, but argument 2 has type ‘int *’ [-Wformat=]
printf("memory address = %u\n", &a);// prints "memory add=65456"
^

Jeśli przekażesz wskaźnik jako
void *
i użyjesz
% p
jako specyfikatora konwersji, nie otrzymasz żadnego komunikatu o błędzie:
#include <stdio.h>int main()
{
int a = 5;
// check the memory address
printf("memory address = %d\n", &a);/* wrong */
printf("memory address = %u\n", &a);/* wrong */
printf("memory address = %p\n", (void*)&a);/* right */
}

Aby odpowiedzieć na pytania, Zaloguj się lub Zarejestruj się