2014-02-07 71 views
0

我有一個錯誤代碼,我不明白:錯誤代碼:%d預計int類型,但是參數的類型爲int *

format %d expects type int, but argument 2 has type int * 

我不知道intint *之間的差異。我不知道有int的不同類型,並且在關鍵字printfscanf的網頁上找不到任何關於它的註釋。

的代碼如下:

#include <stdio.h> 
#include <math.h> 

int main(void) 
{ 
    int X = 0, Y = 0, A = 0, D = 0;   
    printf("This program computes the area of a rectangle "); 
    printf("and its diagonal length."); 
    printf("Enter Side 1 dimentions: "); 
    scanf("%d", &X); 
    printf("Enter Side 2 dimentions: "); 
    scanf("%d", &Y); 

    /* Calc */ 
    A = X * Y; 
    D = pow(X,2) + pow(Y,2);  
    D = pow(D, 1/2);  

    /* Output */ 
    printf("Rectangle Area is %d sq. units.", &A); 
    printf(" Diagonal length is %d.", &D); 
    return 0; 
} 

錯誤引用過去兩年的printf的:

printf("Rectangle Area is %d sq. units.", &A); 
printf(" Diagonal length is %d.", &D); 

此外,此方案是使用花車最初寫(聲明X,Y,A,和D作爲浮點數並使用%f)。但是,這給了一個更奇怪的錯誤代碼:
格式%F預計double類型,但參數2的類型爲浮動*

我知道,%F是對雙打和花車,所以我不明白爲什麼我有這個錯誤。當我得到關於浮動/雙打的錯誤代碼後,我嘗試將所有內容都更改爲int(如上面的代碼所示),只是爲了檢查。但是,在這篇文章的頂部提供了錯誤代碼,我也不明白。

我一直在使用gcc編譯器。 有人會解釋什麼是做錯了嗎?

+0

第一誤差包括類型'int'和'INT *','不int'和'int' ... –

+0

'int'是一個整數類型。 'int *'是一個指針類型。類型爲「int」的對象包含一個整數值。一個'int *'類型的對象包含一些'int'類型的對象的地址(或者一個空指針,它不指向任何東西)。 –

+0

複製並粘貼錯誤消息時,某些非ASCII字符渲染不正確(可能某些轉換錯誤地執行了兩次)。我已經清理了一下。 –

回答

4

問題是您正試圖將指針傳遞給printf函數。這裏是你的代碼看起來像:

printf("Rectangle Area is %d sq. units.", &A); 
printf(" Diagonal length is %d.", &D); 

A是int變量,但&A是指向int變量。你想要的是這樣的:

printf("Rectangle Area is %d sq. units.", A); 
printf(" Diagonal length is %d.", D); 
1

INT *意味着指針爲int的對象。這就是你,因爲你的變量名(即&一個在你的代碼)之前使用&

您可以閱讀this更多地瞭解指針和引用,但基本上如果你在變量名前省略了&,它將正常工作。

+0

一個'int'不是一個對象,它是一個原始類型。所以你說「int object」的地方是不正確的。 – Gavin

+2

@Gavin:'int'是一個類型。 * An *'int'是一個類型爲「int」的對象。一個int *對象或值指向一個「int」類型的對象 - 即一個「int」對象。 –

+0

@KeithThompson我認爲這取決於你對「對象」的定義。從技術上講,在C語言中,沒有什麼是對象,因爲它不是面向對象的語言。如果我們查看面向對象的語言,通常會有一些包裝類將對象中的原始類型封裝起來,但是「int」本身就是原始類型,並不是對象。 – Gavin

0

爲什麼要傳遞指向printf的指針(「...%d ...」,& D)?

看一看的指針解釋: http://www.codeproject.com/Articles/627/A-Beginner-s-Guide-to-Pointers

並能簡化printf()的手冊: http://www.cplusplus.com/reference/cstdio/printf/

int d = 1; 
printf("I'm an integer: %d", 42);   // OK, prints "...42" 
printf("I'm an integer too: %d", d);  // OK, prints "...1" 
printf("I'm a pointer, I have no idea why you printing me: %p", (void*)&d); // OK, prints "...<address of d>", probably not what you want 

printf("I'm compile-time error: %d", &d); // Fail, prints comiper error: 'int' reqired, but &d is 'int*' 
相關問題