错误代码:%d期望类型为int,但参数的类型为int *

时间:2014-02-07 20:41:28

标签: c

我有一个我不明白的错误代码:

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&#39>:

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

此外,该程序最初使用浮点数编写(将X,Y,A和D声明为浮点数并使用%f)。但这给出了一个更奇怪的错误代码:
格式%f期望类型为double,但参数2的类型为float *

我知道%f用于双打和浮动,所以我无法理解为什么会出现这个错误。在我得到关于浮点数/双打的错误代码后,我尝试将所有内容更改为int(如上面的代码所示),只是为了检查。但是这个帖子的顶部提供了错误代码,我也不明白。

我一直在使用gcc编译器。 有人会解释做错了什么吗?

3 个答案:

答案 0 :(得分: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 :(得分:1)

int *表示int对象的指针。这就是你得到的,因为你使用&amp;变量名之前(即代码中的&amp; A)

您可以阅读this以了解有关指针和参考的更多信息,但基本上如果省略&amp;在变量名之前,它会正常工作。

答案 2 :(得分:0)

为什么将指针传递给printf(“...%d ...”,&amp; 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*'