我已经创建了一个简单的测试程序来访问和增加存储在正确运行的内存地址的int,并在运行时输出1
,但是当我创建它时,我得到一个{{ 1}}说出以下内容:warning
但是,我无法看到问题是什么,因为我将地址传递给warning: passing argument 1 of ‘insert’ from incompatible pointer type
,声明接受指针。
insert
答案 0 :(得分:3)
&latestint
为int **
,而insert()
则为int *
至于为什么它正确运行,编译器隐式地将int **
强制转换为int *
,,因此latestint
的地址传递给insert()
,它的值为0,因此您可以巧合地获得输出。表格可以清楚地说明这一点。
+------------+------------+--------+-----------+
| Address | Value | Type | label |
+------------+------------+--------+-----------+
| 0x12345678 | 0x00000000 | int * | latestint |
| whatever | 0x12345678 | int ** | &latestint|
+------------+------------+--------+-----------+
答案 1 :(得分:1)
latestint
是指向int的指针。将其更改为int
类型。
答案 2 :(得分:0)
在C语言中,指针是一个变量。和任何变量一样,每个指针都有一个类型。在您的代码中,变量" latestint"是" int":
类型的指针int * latestint = 0;
值也有它们的类型(5是int,' a'是char等)。表达"& latestint"是变量" latestint"的地址。该地址是一个值(数字)。因为" latestint"是一个指针(一个包含另一个变量的地址的变量),"& latestint"是指针的地址(一个int指针),所以"& latestint"的类型。是int **。
然后,当你将& latestint传递给函数" insert()"时,编译器会告诉你"& latestint"是int **类型,但函数" insert()"等待int *。
你只需删除" *"在" latestint"的声明中然后是"& latestint"的类型将是" int *"。
(你也可以修改"插入"以便它等待一个int **。我猜它不是你想要做的,结果可能会令人惊讶)