前面我们介绍过,所谓函数类型是指函数返回值的类型。在C语言中允许一个函数的返回值是一个指针(即地址),这种返回指针值的函数称为指针型函数。定义指针型函数的一般形式为:
类型说明符 *函数名(形参表)
{
/*函数体*/
}
其中函数名之前加了“*”号表明这是一个指针型函数,即返回值是一个指针。类型说明符表示了返回的指针值所指向的数据类型。如:
- int *ap(int x,int y)
- {
- /*函数体*/
- }
表示ap是一个返回指针值的指针型函数,它返回的指针指向一个整型变量。
【例10-32】本程序是通过指针函数,输入一个1~7之间的整数,输出对应的星期名。
1 main() 2 { 3 int i; 4 char *day_name(int n); 5 printf("input Day No:\n"); 6 scanf("%d",&i); 7 if(i<0) 8 exit(1); 9 printf("Day No:%2d-->%s\n",i,day_name(i)); 10 } 11 char *day_name(int n) 12 { 13 static char *name[]= 14 { "Illegal day", 15 "Monday", 16 "Tuesday", 17 "Wednesday", 18 "Thursday", 19 "Friday", 20 "Saturday", 21 "Sunday" 22 }; 23 return((n<1||n>7) ? name[0] : name[n]); 24 }
本例中定义了一个指针型函数day_name,它的返回值指向一个字符串。该函数中定义了一个静态指针数组name。name数组初始化赋值为八个字符串,分别表示各个星期名及出错提示。形参n表示与星期名所对应的整数。在主函数中,把输入的整数i作为实参,在printf语句中调用day_name函数并把i值传送给形参n。day_name函数中的return语句包含一个条件表达式,n值若大于7或小于1则把name[0]指针返回主函数输出出错提示字符串“Illegal day”。否则返回主函数输出对应的星期名。主函数中的第7行是个条件语句,其语义是,如输入为负数(i<0)则中止程序运行退出程序。exit是一个库函数,exit(1)表示发生错误后退出程序,exit(0)表示正常退出。
应该特别注意的是函数指针变量和指针型函数这两者在写法和意义上的区别。如int(*p)()和int *p()是两个完全不同的量。
int (*p)()是一个变量说明,说明p是一个指向函数入口的指针变量,该函数的返回值是整型量,(*p)的两边的括号不能少。
int *p()则不是变量说明而是函数说明,说明p是一个指针型函数,其返回值是一个指向整型量的指针,*p两边没有括号。作为函数说明,在括号内最好写入形式参数,这样便于与变量说明区别。
对于指针型函数定义,int *p()只是函数头部分,一般还应该有函数体部分。