le format ‘%d’ attend argument de type "int", mais l'argument 2 est de type ‘int *’
Chaque fois que je soumettre un programme sur hackerrank l'erreur suivante se produit.
solution.c: In function ‘main’:
solution.c:22:14: warning: format ‘%d’ expects argument of type ‘int’, but argument 2 has type ‘int *’ [-Wformat=]
printf("%d", &sum);
Il serait très utile si quelqu'un pouvait me dire ce que cela signifie?
Supprimer le & devant
Bienvenue sur StackOverflow. Veuillez prendre le tour, savoir poser les bonnes questions stackoverflow.com/help/how-to-ask, faire un un minimum de reproductibles exemple.
Vous confondez
poster votre code, sinon on ne peut point vous à l'endroit où le code est incorrect. Cependant, savez-vous la différence entre
sum
, puisque vous voulez donner printf de la valeur, pas l'adresse de la valeurBienvenue sur StackOverflow. Veuillez prendre le tour, savoir poser les bonnes questions stackoverflow.com/help/how-to-ask, faire un un minimum de reproductibles exemple.
Vous confondez
scanf
avec printf
...poster votre code, sinon on ne peut point vous à l'endroit où le code est incorrect. Cependant, savez-vous la différence entre
int
et int*
? Le int
est ce qui est prévu, mais votre code est un pointeur vers un int
. dans la ligne de code, l'adresse de sum
est passé à printf()
, Cependant, lors de l'appel de printf()
seulement besoin de passer un pointeur lorsque vous souhaitez afficher une adresse. Si la ligne doit être: printf("%d", sum);
<<-- remarquez, en passant, le contenu de sum
plutôt que l'adresse de la somme
OriginalL'auteur akanksha kumari | 2017-05-26
Vous devez vous connecter pour publier un commentaire.
Je suppose que vous avez déclaré
sum
comme unint
. Donc, l'appel correct pourprintf
est :comme
%d
spécificateur signifie que vous allez imprimer unint
, mais vous êtes de passage à laint
s'adresse, qui est un pointeur versint
, ouint *
.NOTE : Ne pas confondre
printf
avecscanf
, comme la deuxième a besoin d'un pointeur. Donc, pour la lecture de la variablesum
, vous pouvez utiliser :mais pour l'impression, la façon correcte est sans
&
, comme écrit ci-dessus.OriginalL'auteur Marievi
Si vous souhaitez imprimer l'adresse de la somme, vous pouvez utiliser
printf( "%p", &sum )
(void *)
avant de les imprimer avec%p
: "L'argument doit être un pointeur sur void."Comme ceci:
printf("%p", (void *)&sum)
?Oui, c'est vrai. À l'aide de la
%p
spécificateur est la bonne chose à faire lors de l'impression d'une adresse, et vous pouvez vous en sortir avec pas de faire le casting, mais il est nécessaire en fonction de la Norme.OriginalL'auteur Timʘtei
Int est un primitif, les primitives sont des données stockées dans la mémoire. chaque chunck est définie dans un bloc de mémoire, ces blocs a "des adresses de mémoire" qui parlent d'eux.
Si vous définissez
int i = 1
votre ordinateur alloue un nombre entier dans la mémoire (dans un bloc, avec une adresse de mémoire.f.e. 0xF00000) et définit sa valeur à 1.Lorsque vous vous référez à cette entier comme
i
, vous accédez à la valeur stockée dans 0xF00000, qui se trouvent être1
.En C, vous pouvez également obtenir le
i
de référence (l'adresse de la mémoire, il est attribué à) en préfixant avec & (esperluette), en faisant cela, vous obtiendrez l'adresse mémoire de la variable plutôt que de sa valeur.Cette adresse mémoire peut être affectée à un pointeur (une variable qui "pointe" à une adresse de mémoire, donc, n'ont pas de sa propre valeur) de sorte qu'il peut être accessible directement à trop un déréférencement il de sorte que vous pouvez recueillir la valeur à l'intérieur que le bloc de mémoire. Ceci est réalisé à l'aide de
*
Dans votre exemple, vous passez une référence à printf ("printf demande une valeur et reçoit une adresse de mémoire), donc ça ne marche pas.
Espère que cela vous aide à comprendre C et des pointeurs mieux
OriginalL'auteur PRDeving