无法理解这个错误

时间:2018-06-15 17:52:17

标签: c function pointers

因为我是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)

3 个答案:

答案 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;