格式“%d”需要“int”类型的参数,但参数 2 的类型为“int *”

Posted

技术标签:

【中文标题】格式“%d”需要“int”类型的参数,但参数 2 的类型为“int *”【英文标题】:format ‘%d’ expects argument of type ‘int’, but argument 2 has type ‘int *’ 【发布时间】:2017-05-26 08:11:57 【问题描述】:

每次我在hackerrank 上提交程序时都会出现以下错误。

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);

如果有人能告诉我这是什么意思会很有帮助?

【问题讨论】:

去掉sum前面的&,因为你要给printf值,而不是值的地址 欢迎来到 ***。请收下tour,学习提出好问题***.com/help/how-to-ask,发minimal reproducible example。 您将scanfprintf 混淆了... 发布您的代码,否则我们无法指出代码不正确的位置。但是,您知道intint* 之间的区别吗? int 是预期的,但您的代码有一个指向 int 的指针。在这行代码中,sum 的地址被传递给printf(),但是,当调用printf() 时,只需要传递一个指针,当你想显示一个地址。所以该行应该是:printf("%d", sum); sum的内容而不是sum的地址 【参考方案1】:

我假设您已将 sum 声明为 int。所以对printf 的正确调用是:

printf("%d", sum);

作为%d 说明符意味着您要打印int,但您传递的是int 的地址,它是指向intint * 的指针。


注意:不要将printfscanf 混淆,因为第二个确实需要指针。因此,要读取变量 sum,您可以使用:

scanf("%d", &sum);

但是对于打印来说,正确的方法是不用&,如上所述。

【讨论】:

【参考方案2】:

如果要打印 sum 的地址,可以使用printf( "%p", &sum )

【讨论】:

在使用%p打印之前需要将地址转换为(void *):"The argument shall be a pointer to void." @DavidBowling 像这样:printf("%p", (void *)&sum)? 是的,没错。在打印地址时,使用 %p 说明符是正确的做法,您可以不进行强制转换而侥幸,但根据标准这是必需的。【参考方案3】:

Int 是一个原语,原语是存储在内存中的数据。每个数据块都设置在特定的内存块中,这些块具有引用它们的“内存地址”。

如果您定义int i = 1,您的计算机会在内存中分配一个整数(在一个块中,内存地址为 f.e. 0xF00000)并将其值设置为 1。 当您将此整数称为i 时,您访问的是存储在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 和指针

【讨论】:

【参考方案4】:

#include<stdio.h>

int main()
    int var = 10;
    int* a = &var;
    printf("%d", a);
    return 0;

首先我使用"%d",它显示错误format ‘%d’ expects argument of type ‘int’, but argument 2 has type ‘int *’ 然后我将"%d" 替换为"%p" 并且它可以工作。

#include<stdio.h>

int main()
    int var = 10;
    int* a = &var;
    printf("%p", a);
    return 0;

你必须使用"%p" 来打印变量的地址。谢谢

【讨论】:

以上是关于格式“%d”需要“int”类型的参数,但参数 2 的类型为“int *”的主要内容,如果未能解决你的问题,请参考以下文章

C 语言:收到错误:警告:格式“%d”需要“int *”类型的参数,但参数 2 的类型为“int **”[-Wformat=]

警告:格式“%d”需要类型“int”,但参数 2 的类型为“int (*)(int *)”[关闭]

格式指定类型“int*”但参数类型为“int”

以下 C 代码显示:格式 '%s' 需要类型为 'char *' 的参数,但参数 3 的类型为 int

警告:格式“%ld”需要“long int”类型的参数,但参数的类型为“__builtin_neon_di”

格式指定类型“int”,但参数的类型为“UIViewContentMode”