2017-05-26 477 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和指針更好

相關問題