C 警告:格式‘;%d’;应为类型为‘;int’;,但参数2的类型为‘;int*’;
我不明白为什么会抛出错误C 警告:格式‘;%d’;应为类型为‘;int’;,但参数2的类型为‘;int*’;,c,C,我不明白为什么会抛出错误警告:格式“%d”要求参数类型为“int”,但参数2的类型为“int*”: int x = 5; int **y = &x; printf("%d", y); 这样做有效吗 int x = 5; int *y = &x; printf("%d", *y); 因为您在第二个版本中将y声明为指向整数的指针,所以编译器会感觉到*y是一个有效的整数 在第一个版本中,y被声明为指向整数指针的指针(不管怎样,我总是这么想的),因此*y应该解析为整数指针,而不是整数
警告:格式“%d”要求参数类型为“int”,但参数2的类型为“int*”
:
int x = 5;
int **y = &x;
printf("%d", y);
这样做有效吗
int x = 5;
int *y = &x;
printf("%d", *y);
因为您在第二个版本中将
y
声明为指向整数的指针,所以编译器会感觉到*y
是一个有效的整数
在第一个版本中,y
被声明为指向整数指针的指针(不管怎样,我总是这么想的),因此*y
应该解析为整数指针,而不是整数指针-编译器警告您,它可能与printf
中的%d
不一致
编辑感谢@Kierboromeo发现了我的一个愚蠢的打字错误。因为您将
y
定义为指向int的指针,所以您可以将指向int的指针的地址存储在y
上,但是你要做的是存储int
的地址,我认为第一个版本的问题是:y
的类型是指向整数的指针,而&x
是指向整数的指针。显然存在着不匹配
在第二个版本中,
y
的类型是一个指向整数的指针,因此程序在编译时没有警告。错误是不言自明的。您正在传递一个int*
,其中需要一个int
int x = 5;
int *y = &x;
printf("%d", y); // <-- y is an int* - ERROR
intx=5;
int*y=&x;
printf(“%d”,y);// 这是因为在您的代码中,x是一个整数,*y是指向整数的指针,因此**y是指向指向整数的指针的指针。这就像说*y=&&x
在第一个示例中,您是指int*y
而不是int**y
?两者都不正确;第一个是@psmears所说的,第二个是因为%d
是整数;int*
不是整数。使用%p
。我建议避免使用“双指针”;它也意味着double*
。感谢您的更正,我没有这样想过。它是int**y=&x代码>如果我没有弄错的话,这是OP代码中的一个输入错误x
是一个int
,&x
是一个int*
,但是int*
不能分配给int**
,所以y
必须是一个int*
而不是int**
。&d
应该是打字吗,先生?@KierBorromeo确实是的,谢谢你抓到了。
int x = 5;
int *y = &x;
printf("%d", *y); // <-- y is an int*, so *y is an int - OK