2014-02-07 51 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*' 
相关问题