C指针问题“int”,但参数2具有类型“int**”

6yoyoihd  于 2023-01-12  发布在  其他
关注(0)|答案(3)|浏览(197)

我目前正在做指针。我已经编程很长时间了,但不是用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前面放一个&来让它打印这个值,但是我收到了这个错误,
一个二个一个一个
我的知识漏洞在哪里?在处理这个问题时有什么关键的技巧或策略吗?我不知道为什么我觉得这个问题如此抽象。谢谢,
我希望值能按预期打印出来,但却遇到了错误。

kdfy810k

kdfy810k1#

%d是错误的指针格式说明符。这可能适用于更宽松或不兼容的实现,但您应该使用%p来打印指针值。

evrscar2

evrscar22#

警告不是错误,你收到的是一个 warning,它不会停止你的程序,因为打印说明符%d(即printf("%d"))是用来显示整数的,而你给它一个int*类型的非整数参数。
这里的问题不在于参数,而在于打印说明符。您试图修复的只是将int*更改为int**,它仍然与格式说明符%d不匹配。请改用%p,它是指针的说明符,将修复警告,并以十六进制表示法打印地址。
您也可以通过一系列从int*int的显式转换来抑制警告,但是内存地址的整数表示通常比十六进制表示少得多。

pengsaosao

pengsaosao3#

注意在printf()中使用错误的格式说明符会导致undefined behaviour 1)。打印指针的正确格式说明符是%p说明符。
请记住,格式说明符%p要求参数是指向void的指针,因此您应该键入cast pointer argument to void *。打印指针p的正确语句应该是:

printf("%p\n", (void *)p);
  1. C11#7.21.6.1p9 [着重号是后加的]
    9如果转换规范无效,则行为未定义。282)如果任何参数不是对应转换规范的正确类型,则行为未定义

相关问题