【问题标题】:Error code: %d expected type int, but argument has type int *错误代码:%d 应为 int 类型,但参数的类型为 int *
【发布时间】:2014-02-07 20:41:28
【问题描述】:

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

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

我不知道int 和int * 之间的区别。我不知道int有不同的类型,也找不到关于printf和scanf关键字母的网页。

代码如下:

#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)。但这给出了一个更奇怪的错误代码:
format %f 需要 double 类型,但参数 2 的类型为 float *

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

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

【问题讨论】:

  • 第一个错误包括int和int *类型,而不是int和int...
  • int 是整数类型。 int* 是指针类型。 int 类型的对象包含一个整数值。 int* 类型的对象包含 int 类型的某个对象的地址(或不指向任何内容的空指针)。
  • 当您复制并粘贴错误消息时,一些非 ASCII 字符被错误地呈现(可能某些转换被错误地执行了两次)。我已经清理了一下。

标签: c


【解决方案1】:

问题是您试图将指针传递给printf 函数。您的代码如下所示:

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

A 是 int 变量,但 &amp;A 是指向 int 变量的指针。你想要的是这样的:

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

【讨论】:

    【解决方案2】:

    int* 表示指向 int 对象的 指针。这就是您得到的结果,因为您在变量名之前使用了 &(即代码中的 &A)

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

    【讨论】:

    • int 不是对象,它是原始类型。所以说“int object”是不正确的。
    • @Gavin: int 是一种类型。 An int 是一个类型为int 的对象。 int* 对象或值指向int 类型的对象——即int 对象。
    • @KeithThompson 我认为这取决于您对“对象”的定义。从技术上讲,在 C 语言中,没有什么是对象,因为它不是面向对象的语言。如果我们正在研究面向对象的语言,通常会有一些包装类将原始类型包装在对象中,但int 本身将是原始类型,而不是对象。
    • @Gavin:C 标准将“对象”一词定义为“执行环境中的数据存储区域,其内容可以表示值”。 C++ 标准的定义类似,与面向对象编程无关。给定int n;,int 是一个类型,n 是一个对象的名称。
    【解决方案3】:

    为什么要传递指向 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*'
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多