无法理解这个错误

问题描述 投票:-5回答:3

因为我是C的初学者

当我运行以下C代码时:

#include<stdio.h>

void f(int *p)
{
    *p=3;
}

int main()
{
    int *p;
    f(&p);
    return 0;
}

我在编译后得到这些消息:

1)警告:从不兼容的指针类型f(&p)传递'f'的arg 1

2)注意:期望'int *'但参数的类型为'int **'void f(int * p)

c function pointers
3个回答
0
投票

请注意:

&p是变量的内存地址

* p是变量的实际值


所以你要做的是:

在main中:您正在生成变量指针p。并且您将此指针地址传递给函数f。

f认为它获取一个指针作为参数,但它获取一个内存地址,并且很可能无法处理它。

更多信息是here


希望我能帮忙!


0
投票

你将一个指向指针的指针作为一个函数的参数传递给一个期望指向int的指针。它们是两种不同的类型,编译器会抱怨。

还有另一个问题,你有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;
}

0
投票

很难想到这一点,因为有多个级别的指针。

这是一个更简单的例子。这就是我们所谓的“通过引用传递”:

#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接受的指针类型是指向被操纵类型的指针。由于被操作的类型是“指向char的指针”,函数g接受指向char或char **的指针。

但是你发布的代码有点混合了两者。你的函数f接受一个int指针,就像我的一样,它试图使用那个int指针来修改调用者中的int变量。但是,在你的main函数中,你试图修改的变量不是int,它是指向int或int *的指针。

你打电话的时候

f(&p);

你开始使用指向int的指针,p,并且你用&获取它的地址,从而产生一个指针到指针的指针。但是你呢;重新调用函数f,它需要一个指向int的指针。这就是编译器试图用消息告诉你的

警告:从不兼容的指针类型传递'f'的arg 1 注意:预期'int *'但参数类型为'int **'

© www.soinside.com 2019 - 2024. All rights reserved.