返回指针的函数
每个函数可返回一个值,返回值可以是char、int、float、double等类型,当将返回值类型设置为void时,表示函数没有返回值。在C语言中,还允许一个函数的返回值是一个指针(即地址),这种返回指针的函数称为指针型函数。
定义指针型函数的形式如下:
类型说明符 *函数名(形参表)
{
… /*函数体*/
}
其中函数名之前加了"*"号表明这是一个指针型函数,即返回值是一个指针。类型说明符表示了返回的指针值所指向的数据类型。一般用这种函数返回一个字符串常量的首地址。
编写一个函数,用于将阿拉伯数字表示的月份转换为对应的英文名称。函数一次只能返回一个值,若要返回一个字符串(由多个字符组成),用前面已介绍的方法可通过函数的形参返回多个字(包括一个字符串)。例如,用以下的函数头:
- void cmonth(int month, char s[])
要调用以上形式的函数,首先要定义一个数组,再将数组作为实参传给函数,最后将函数处理的结果用另一个语句输出。使用类似下面的程序:
- char s[20];
- cmonth(5, s]);
- printf("月份:%2d-->英文名称:%s\n",5,s);
如果函数能返回字符串,则可以使用以下方式调用函数,并输出返回值:
- printf("月份:%2d-->英文名称:%s\n",i,cmonth(i));
编写指针型函数可返回字符串的首地址,下面的程序演示指针型函数的编写方法。
【程序9-27】
#include <stdio.h> //头文件
#include <stdlib.h>
char *cmonth(int month);//函数声明
int main()
{
int i;
printf("输入月份数字:");
scanf("%d",&i); //输入月份
printf("月份:%2d-->英文名称:%s\n",i,cmonth(i));
system("pause");
return 0;
}
char *cmonth(int month)//自定义函数
{
char *str_month[]={//初始化
"Illegal Month",
"January",
"February",
"March",
"April",
"May",
"June",
"July",
"August",
"September",
"October",
"November",
"December"
};
char *p;
if(month>=1 && month<=12) //判断是否合法
p=str_month[month];
else
p=str_month[0];
return p;
}
执行这段程序,按照提示输入月份数字,得到如下结果,如图所示。
在该程序中,定义了函数cmonth(),该函数需要一个整型变量作为实参,返回一个字符型指针。在函数体内部定义指针数组,数组中的每个指针指向一个字符串常量。然后,判断实参month是否合法,若不合法则将第一个元素赋值给字符指针变量p,这样,指针变量p中的值就与指针数组中第一个元素中的值相同,即指向字符串常量"Illegal Month",如图9-54所示。当函数参数month为1~12之间的一个值时,即可使字符指针指向对应的字符串常量(变量p中保值的值是一个地址)。
main()函数中,在printf()函数输出列表中包括cmonth()函数的返回值(其返回值是一个字符串的首地址),printf()函数的格式字符"%s"从该首地址开始输出字符串。
![]() |
图9-53 执行结果 |
![]() |
图9-54 用指针操作字符串 |