函数具有“int”类型的参数,但传递了一个“int*”类型的参数

Function has parameter of type `int`, but gets passed an argument of type `int*`

我对术语有疑问。考虑一个一元函数。我 read in this thread 该函数的参数是其声明中使用的 'variable' , 'argument' 是调用函数时传递给函数的变量的实际值。 然而,考虑这个简单的函数:

void f(int *p){};

它有一个 *p 类型的 int 参数。但是,调用函数时我可以做

v = 25;
int* w = &v;
f(w);

即,我将类型为 int* 的参数传递给函数,这意味着我传递的参数类型与参数类型不同。

我将函数视为一个映射 f:A->B,其域 A 决定参数和实参的类型,即它们应该相等。我的推理有什么问题?

*int 是语法错误,不是类型。 int * 是一种类型。

参数名称是p,不是*p。参数 p 的类型是 int *。在您的示例代码中,您为 int * 类型的参数传递了 int * 类型的参数,这很好。

一般来说,参数类型可以不同于参数类型,前提是允许使用该参数初始化参数类型的变量。例如,您可以将 5int)传递给参数类型为 longfloat 的函数。

您的函数有一个类型为 int* 的参数 p。您向它传递一个 int* 类型的参数 w* 的位置在句法层面造成了一些尴尬,但出于类型检查的目的,您应该将其视为类型的一部分。