el formato ‘% d’ espera un argumento de tipo ‘int’, pero el argumento 2 tiene el tipo ‘int *’

Cada vez que envío un progtwig en hackerrank se produce el siguiente error.

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); 

¿Sería muy útil si alguien pudiera decirme qué significa esto?

Supongo que usted ha declarado la sum como un int . Así que la llamada correcta a printf es:

 printf("%d", sum); 

como %d especificador significa que va a imprimir un int , pero está pasando la dirección del int , que es un puntero a int , o int * .


NOTA : No confunda printf con scanf , ya que el segundo requiere un puntero . Entonces, para leer la sum variables, usarías:

 scanf("%d", &sum); 

pero para la impresión, la forma correcta es sin & , como está escrito anteriormente.

Si desea imprimir la dirección de la sum, puede usar printf( "%p", &sum )

Int es una primitiva, las primitivas son datos almacenados en la memoria. cada chunck de datos se establece en un bloque de memoria específico, esos bloques tienen “direcciones de memoria” que se refieren a ellos.

Si define int i = 1 su computadora asigna un número entero en la memoria (en un bloque, con una dirección de memoria fe 0xF00000) y establece su valor en 1. Cuando se refiere a este número entero como i , está accediendo al valor almacenado en 0xF00000 , que pasa a ser 1 .

En C, también puede obtener la referencia i (la dirección de memoria en la que está asignada) prefijándola con & (ampersand), al hacer esto obtendrá la dirección de memoria de la variable en lugar de su valor.

 i === 1; // true &i === 1; //false &i === 0xF00000; //true 

Esta dirección de memoria puede asignarse a un puntero (una variable que ‘apunta’ a una dirección de memoria, por lo tanto, no tiene su propio valor), por lo que se puede acceder directamente a ella para que no pueda hacer referencia al valor dentro de ese bloque de memoria. Esto se logra usando *

 int i = 1; //this allocates the int *ptr = &i; //defines a pointer that points to i address /* now this works cause i is a primitive */ printf("%d", i); /* this works also cause ptr is dereferenced, returning the value from the address it points, in this case, i's value */ printf("%d", *ptr); 

En su ejemplo, está pasando una referencia a printf (printf solicita un valor y está recibiendo una dirección de memoria) por lo que no funciona.

Espero que esto te ayude a entender C y los punteros mejor.