无法理解这个错误
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了无法理解这个错误相关的知识,希望对你有一定的参考价值。
因为我是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)
请注意:
&p是变量的内存地址
* p是变量的实际值
所以你要做的是:
在main中:您正在生成变量指针p。并且您将此指针地址传递给函数f。
f认为它获取一个指针作为参数,但它获取一个内存地址,并且很可能无法处理它。
更多信息是here
希望我能帮忙!
你将一个指向指针的指针作为一个函数的参数传递给一个期望指向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;
}
很难想到这一点,因为有多个级别的指针。
这是一个更简单的例子。这就是我们所谓的“通过引用传递”:
#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 **'
以上是关于无法理解这个错误的主要内容,如果未能解决你的问题,请参考以下文章