格式’%d’需要’int’类型的参数,但参数2的类型为’int *’
每次我在hackerrank上提交程序时都会发生以下错误。
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);
如果有人能告诉我这意味着什么会很有帮助吗?
我假设您已将sum
声明为int
。 所以对printf
的正确调用是:
printf("%d", sum);
因为%d
说明符意味着你要打印一个int
,但是你要传递int
的地址,这是一个指向int
或int *
的指针。
注意 :不要将printf
与scanf
混淆,因为第二个需要指针 。 因此,对于读取变量sum
,您将使用:
scanf("%d", &sum);
但是对于打印,正确的方法是没有&
,如上所述。
如果要打印sum的地址,可以使用printf( "%p", &sum )
Int是原语,原语是存储在内存中的数据。 每个数据块都设置在特定的存储块中,这些块具有引用它们的“存储器地址”。
如果定义int i = 1
计算机在内存中分配一个整数(在块中,内存地址为0xF00000)并将其值设置为1.当您将此整数称为i
,您将访问存储在0xF00000中的值,恰好是1
。
在C中,您还可以通过在&前加上&(和号)来获取i
引用(它分配的内存地址),通过这样做,您将获得变量的内存地址而不是其值。
i === 1; // true &i === 1; //false &i === 0xF00000; //true
这个内存地址可以分配给一个指针(一个’指向’内存地址的变量,因此没有它自己的值),所以可以直接访问它 ,也可以取消引用它,这样你就可以在该内存块中收集值。 这是通过使用*
实现的
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);
在您的示例中,您正在传递对printf的引用(printf请求值并且正在接收内存地址),因此它不起作用。
希望这有助于您更好地理解C和指针