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

时间:2017-05-26 08:11:58

标签: c

每次我在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);

如果有人能告诉我这意味着什么会很有帮助吗?

4 个答案:

答案 0 :(得分:12)

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

printf("%d", sum);

作为%d说明符意味着您要打印int,但是您传递的是int地址,这是指向{{1}的指针},或int

注意 :请勿将int *printf混淆,因为第二个需要指针。因此,对于读取变量scanf,您将使用:

sum

但是对于打印,正确的方法是没有scanf("%d", &sum); ,如上所述。

答案 1 :(得分:4)

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

答案 2 :(得分:0)

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和指针

答案 3 :(得分:0)

#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" 来打印变量的地址。谢谢