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

时间:2014-12-12 23:01:33

标签: c

我很担心为什么会抛出错误warning: format ‘%d’ expects argument of type ‘int’, but argument 2 has type ‘int *’

int x = 5;
int **y = &x;
printf("%d", y);

虽然这有效吗?

int x = 5;
int *y = &x;
printf("%d", *y);

5 个答案:

答案 0 :(得分:1)

我认为第一个版本的问题是:y的类型是指向指向整数的指针的指针,而&x是一个地址可以看作指向整数的指针。显然存在不匹配。

在第二个版本中,y的类型是指向整数的指针,因此程序在没有警告的情况下编译。

答案 1 :(得分:1)

错误是不言自明的。您传递int*,预计会int

int x = 5;
int *y = &x;
printf("%d", y); // <-- y is an int* - ERROR

int x = 5;
int *y = &x;
printf("%d", *y); // <-- y is an int*, so *y is an int - OK

答案 2 :(得分:0)

因为您在第二个版本中将y声明为指向整数的指针,所以编译器会感到温暖而模糊,*y是一个有效的整数。

在第一个版本中,y被声明为指向整数指针的指针(这就是我总是在脑海中想到它的方式),所以*y应该解析为整数而不是整数的指针 - 编译器警告您它可能不会与%d中的printf对齐。

感谢@KierBorromeo在我身上发现了一个愚蠢的错字。

答案 3 :(得分:0)

因为你将y定义为指向int的指针,所以你可以在y上存储指向int的指针的地址,但你要做的是存储地址int

答案 4 :(得分:0)

那是因为在你的代码中,x是一个整数,* y是一个指向整数的指针,因此** y是一个指向整数的指针。它和*y = &&x;一样好。