web-dev-qa-db-fra.com

% p Spécificateur de format en c

Comment sont les spécificateurs %p et %Fp vous travaillez dans le code suivant?

void main() 
{
    int i=85;

    printf("%p %Fp",i,i);

    getch();   
}

J'obtiens l'o/p comme 0000000000000055 0000000000000055

13
poorvank

Si c'est ce que vous demandez,% p et% Fp impriment un pointeur, en particulier l'adresse à laquelle le pointeur se réfère, et puisqu'il imprime une partie de l'architecture de votre ordinateur, il le fait en hexadécimal.

En C, vous pouvez effectuer une conversion entre un pointeur et un int, car un pointeur est simplement un nombre 32 bits ou 64 bits (selon l'architecture de la machine) se référant au bloc de mémoire susmentionné.

Et bien sûr, 55 en hexadécimal est 85 en décimal.

20
David Christo

% p sert à imprimer une adresse de pointeur.

85 en décimal est 55 en hexadécimal.

Sur votre système, les pointeurs sont 64 bits, la représentation hexadécimale complète est donc: 0000000000000055

2
Myforwik

Son but est d'imprimer une valeur de pointeur dans un format défini par l'implémentation. L'argument correspondant doit être un void * valeur.

Et %p est utilisé pour imprimer l'adresse d'un pointeur dont les adresses dépendent de notre bit système.

2
reegan vijay

Voici la sortie de compilation de ma machine:

format.c: 7: 5: avertissement: le format ‘% p’ attend un argument de type ‘void *’, mais l’argument 2 a le type ‘int’ [-Wformat]

format.c: 7: 5: avertissement: le format "% F" attend un argument de type "double", mais l'argument 3 a le type "int" [-Wformat]

donc il y a des avertissements mais il compile et la sortie est: 0x55 0.000000p

Je suis surpris que vous n'obteniez pas un p à la fin. Êtes-vous sûr que le code et la sortie correspondent? Je suppose qu'il n'est pas impossible que l'adresse de i soit également 0x0 ... 055..mais quelque chose ne va pas ici.

btw: l'utilisation typique de% p serait d'imprimer une adresse, c'est-à-dire & i, par opposition à un int

2
user657862

%p sert à imprimer une adresse mais vous devez utiliser le ampersand c'est-à-dire & opérateur avant i pour obtenir l'adresse de i

Donc pour obtenir l'adresse de la variable i le format correct sera:

void main() 
{
    int i=85;

    printf("%p %Fp", &i, &i);

    getch();   
}

si vous n'utilisez pas & alors u obtiendra juste la valeur contenue dans i qui dans ce cas est 85 ou 55 en hex

1
imtiaj sreejon

Ajout à ce que @Myforwik a dit

% p sert à imprimer une adresse de pointeur.

% Fp est probablement utilisé pour formater un pointeur FAR qui a la forme -> (0x1234: 0x5678)

et 85 en décimal est 55 en hexadécimal.

J'espère que ça va maintenant.

Références: http://www.lix.polytechnique.fr/~liberti/public/computing/prog/c/C/FUNCTIONS/format.htmlhttp: //www.winehq .org/pipermail/wine-devel/2005-mars/034390.html

1
Saurabh Rana