指向c中函数的指针?

指向c中函数的指针?,c,function-pointers,C,Function Pointers,我正在学习c(在ANSI c->第五版中编程)并面临以下问题: 我正在用指向函数的指针实现一个程序 #include<stdio.h> //void swap (int *a, int *b); //function declaration int main() { int m = 25; int n = 100; printf("m is %d, n is %d\n", m, n); swap(&m, &

我正在学习c(在ANSI c->第五版中编程)并面临以下问题:

我正在用指向函数的指针实现一个程序

#include<stdio.h>

//void swap (int *a, int *b);                      //function declaration
int main() 
{
  int m = 25;
  int n = 100;

  printf("m is %d, n is %d\n", m, n);
  swap(&m, &n);                                    //calling a function
  printf("m is %d, n is %d\n", m, n);
  return 0;

}

void swap (int *a, int *b)                         //function implementation
{
  int temp;
  temp = *a;
  *a = *b;
  *b = temp;
}
问题是为什么不允许在上述程序中使用此选项

void swap (int, int);              //function declaration
并给出错误

错误:

“交换”的冲突类型 void swap(int*a,int*b)//函数实现

但书中的例子是允许的

此处main()之前的函数签名称为函数签名,该签名应与函数声明匹配 下面

但同样的函数签名也可以写成

void swap (int *, int *);
而不是

void swap (int , int ); //This will result in type mismatch
我想这就是你要问的


注意:转发声明在这里很重要,它允许您先声明,然后再定义,这有助于保持代码可读性。

函数必须在源文件中使用之前声明。注释
swap
的声明时,函数的定义直到
main()
之后。在这种情况下,编译器所做的是隐式地为您定义
swap
。(这需要一点C的历史,但是当对象类型未定义时,任何对象的类型都默认为
int
)在您的例子中,编译器提供了
int-swap(int*a,int*b)
的默认声明,这与您稍后对
无效交换(int*a,int*b)的定义相冲突
--这就是您收到警告的原因。对于第二个问题,
int
是与
int*
(指针指向-
int
)不同的类型,因此您对
交换
函数的两个声明完全不兼容。请不要将文本添加为图片。它们不是艺术品。简单地将纯文本复制粘贴到问题中是最好的。
void swap (int *a, int *b){
...
}
void swap (int *, int *);
void swap (int , int ); //This will result in type mismatch