2017-05-26 68 views
2

每次我在hackerrank上提交程序时都会发生以下错误。格式'%d'需要'int'类型的参数,但参数2的类型为'int *'

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

这将是非常有益的,如果有人能告诉我这是什么意思?

+4

之前'sum'取出和,因为你想给printf的价值,而不是价值 – Ctx

+0

欢迎StackOverflow上的地址。 请参考[游览], 学习问好问题stackoverflow.com/help/how-to-ask, 做个[mcve]。 – Yunnosch

+1

您将'scanf'与'printf'混淆在一起... – LPs

回答

7

我假设您已将sum声明为int。因此,要printf正确的调用是:

printf("%d", sum); 

%d符意味着你要打印int,但你传递int的地址,这是一个指向int,或int *


:不要混淆scanfprintf,作为第二确实需要一个指针。所以,阅读变量sum,你可以使用:

scanf("%d", &sum); 

但是对于打印,正确的做法是不&,因为上面写的。

2

如果你想打印总和可以使用printf("%p", &sum)

+0

您需要将地址转换为'(void *) '用'%p'打印之前:[“参数应该是指向void的指针。”](http://port70.net/~nsz/c/c11/n1570.html#7.21.6.1p8) –

+0

@DavidBowling像这样:'printf(“%p”,(void *)&sum)'? –

+0

是的,没错。在打印地址时使用'%p'说明符是正确的,你可以不用做演员,但是根据标准它是必需的。 –

0

诠释的地址是一种原始,基元是存储在内存中的数据。每个数据块都被设置在一个特定的存储器块中,这些块具有引用它们的“存储器地址”。

如果定义int i = 1计算机分配在存储器中的整数(在一个块中,与存储器地址FE 0xF00000)和当引用该整数作为i,正在访问所存储的值将其值设置为1。 在0xF00000中,碰巧是1

在C中,您还可以通过在&(与符号)前加上i引用(它分配的内存地址),通过这样做,您将获得变量的内存地址而不是其值。

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

该内存地址可以分配给一个指针(一个变量,“点”到一个内存地址,从而,有没有它自己的价值),所以它可以直接访问过dereferencing it这样你就可以收集值在那个内存块里面。这是使用*

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和指针更好

相关问题