我目前正在做指针。我已经编程很长时间了,但不是用C/C ++。话虽如此,我的指针知识糟透了。目前,我正在遵循YouTube上的一个指南,他打印了下面的代码。
int main() {
int a = 5;
int *p;
p = &a;
printf("%d\n", p);
}
这对他来说打印成功了,他看到了一个内存位置。对我来说,我看到了错误
warning: format '%d' expects argument of type 'int', but argument 2 has type 'int *'
从这里,我希望我需要在p前面放一个&
来让它打印这个值,但是我收到了这个错误,
一个二个一个一个
我的知识漏洞在哪里?在处理这个问题时有什么关键的技巧或策略吗?我不知道为什么我觉得这个问题如此抽象。谢谢,
我希望值能按预期打印出来,但却遇到了错误。
3条答案
按热度按时间kdfy810k1#
%d
是错误的指针格式说明符。这可能适用于更宽松或不兼容的实现,但您应该使用%p
来打印指针值。evrscar22#
警告不是错误,你收到的是一个 warning,它不会停止你的程序,因为打印说明符
%d
(即printf("%d")
)是用来显示整数的,而你给它一个int*
类型的非整数参数。这里的问题不在于参数,而在于打印说明符。您试图修复的只是将
int*
更改为int**
,它仍然与格式说明符%d
不匹配。请改用%p
,它是指针的说明符,将修复警告,并以十六进制表示法打印地址。您也可以通过一系列从
int*
到int
的显式转换来抑制警告,但是内存地址的整数表示通常比十六进制表示少得多。pengsaosao3#
注意在
printf()
中使用错误的格式说明符会导致undefined behaviour 1)。打印指针的正确格式说明符是%p
说明符。请记住,格式说明符
%p
要求参数是指向void
的指针,因此您应该键入cast pointer argument tovoid *
。打印指针p
的正确语句应该是:9如果转换规范无效,则行为未定义。282)如果任何参数不是对应转换规范的正确类型,则行为未定义。