因为我是C的初学者
当我运行以下C代码时:
#include<stdio.h>
void f(int *p)
{
*p=3;
}
int main()
{
int *p;
f(&p);
return 0;
}
我在编译后得到这些消息:
1)警告:从不兼容的指针类型f(&amp; p)传递'f'的arg 1
2)注意:预期'int *'但参数类型为'int **'void f(int * p)
答案 0 :(得分:0)
请注意:
&amp; p是变量
的内存地址* p是变量
的实际值所以你要做的是:
在main中:您正在生成变量指针p。并且您将此指针地址传递给函数f。
f认为它获取一个指针作为参数,但它获取了一个内存地址,并且显然无法处理它。
更多信息是here
希望我能帮忙!
答案 1 :(得分:0)
您将指针传递给指针作为期望指向int
的函数的参数。它们有两种不同的类型,编译器会抱怨。
还有另一个问题,你有指针&#39;到int
而不是分配用于存储它的空间。这种情况有几种解决方案。
1)
{
int q; // add a new int, to which p points to. this allocates memory for an int
int *p = &q;
f(p); // don't pass a pointer to a pointer, just the pointer
return 0;
}
2)
{
int p; // have p be the int in the first place, not a pointer
f(&p); // your original call is unchanged and works now
return 0;
}
答案 2 :(得分:0)
很难想到这一点,因为有多个指针级别。
这是一个更简单的例子。这就是我们可以称之为&#34;通过引用传递&#34;:
#include <stdio.h>
void f(int *ip)
{
*ip = 5;
}
int main(){
{
int i = 7;
printf("%d\n", i);
f(&i);
printf("%d\n", i);
}
函数f
接受指向int的指针。它修改了int。在main
中,我们有一个int变量i
。我们使用&
获取该变量的地址,并将结果指针传递给函数f
。通过这种方式,函数f
能够修改调用者中的i
。请注意,函数f
接受一个指向某个东西的指针,指针指向的是调用者中i
的类型 - 换句话说,指向int的指针。
现在让我们看看另一个例子。这次,我们不是通过引用操纵int
,而是操纵指针变量char *
。 (我们最终会处理指针指针。)
void g(char **sp)
{
*sp = malloc(10);
strcpy(*sp, "oranges");
}
int main(){
{
char *s = "apples";
printf("%s\n", s);
g(&s);
printf("%s\n", s);
}
同样,函数g
通过引用接受参数。同样,函数g
能够修改其调用者中的变量。同样,g
接受的指针类型是指向被操纵类型的指针。由于被操作的类型是&#34;指向char&#34;的指针,函数g
接受指向char的指针,或char **
。
但是你发布的代码有点混合了两者。你的函数f
接受一个int指针,就像我的一样,并且它试图使用那个int指针来修改调用者中的int变量。但是,在您的main
函数中,您尝试修改的变量不是int,它是指向int或int *
的指针。
致电时
f(&p);
你从一个指针指向p
开始,然后你用&
获取其地址,从而产生一个指向指针的指针INT。但接着你;重新调用函数f
,它需要一个指向int的指针。这就是编译器试图通过消息告诉你的内容
警告:传递&#39; f&#39;来自不兼容的指针类型
注意:预期&#39; int *&#39;但参数的类型为&#39; int **&#39;