我很担心为什么会抛出错误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);
答案 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;
一样好。