c语言函数加上指针吗 c 语言 函数指针

c语言函数返回字符串时必须要用指针吗?如果返回结构体呢?函数在返回那些类型值时必须要用指针?所谓函数类型是指函数返回值的类型 。在C语言中允许一个函数的返回值是一个指针(即地址),这种返回指针值的函数称为指针型函数 。
定义指针型函数的一般形式为:
类型说明符 *函数名(形参表)
{
……/*函数体*/
}
其中函数名之前加了“*”号表明这是一个指针型函数,即返回值是一个指针 。类型说明符表示了返回的指针值所指向的数据类型 。
如:
int *ap(int x,int y)
{
....../*函数体*/
}
表示ap是一个返回指针值的指针型函数,它返回的指针指向一个整型变量 。
【例】本程序是通过指针函数 , 输入一个1~7之间的整数,输出对应的星期名 。
main(){
int i;
char *day_name(int n);
printf("input Day No:\n");
scanf("%d",i);
if(i0) exit(1);
printf("Day No:%2d--%s\n",i,day_name(i));
}
char *day_name(int n){
static char *name[]={ "Illegal day",
"Monday",
"Tuesday",
"Wednesday",
"Thursday",
"Friday",
"Saturday",
"Sunday"};
return((n1||n7) ? name[0] : name[n]);
}
本例中定义了一个指针型函数day_name , 它的返回值指向一个字符串 。该函数中定义了一个静态指针数组name 。name数组初始化赋值为八个字符串,分别表示各个星期名及出错提示 。形参n表示与星期名所对应的整数 。在主函数中 , 把输入的整数i作为实参,在printf语句中调用day_name函数并把i值传送给形参n 。day_name函数中的return语句包含一个条件表达式 , n值若大于7或小于1则把name[0]指针返回主函数输出出错提示字符串“Illegal day” 。否则返回主函数输出对应的星期名 。主函数中的第7行是个条件语句,其语义是,如输入为负数(i0)则中止程序运行退出程序 。exit是一个库函数 , exit(1)表示发生错误后退出程序,exit(0)表示正常退出 。
应该特别注意的是函数指针变量和指针型函数这两者在写法和意义上的区别 。如int(*p)()和int *p()是两个完全不同的量 。
int (*p)()是一个变量说明,说明p是一个指向函数入口的指针变量 , 该函数的返回值是整型量,(*p)的两边的括号不能少 。
int *p()则不是变量说明而是函数说明,说明p是一个指针型函数,其返回值是一个指向整型量的指针 , *p两边没有括号 。作为函数说明 , 在括号内最好写入形式参数,这样便于与变量说明区别 。
对于指针型函数定义,int *p()只是函数头部分,一般还应该有函数体部分 。
在ANSI C标准中允许用结构变量作函数参数进行整体传送 。但是这种传送要将全部成员逐个传送,特别是成员为数组时将会使传送的时间和空间开销很大,严重地降低了程序的效率 。因此最好的办法就是使用指针,即用指针变量作函数参数进行传送 。这时由实参传向形参的只是地址,从而减少了时间和空间的开销 。
【例】计算一组学生的平均成绩和不及格人数 。用结构指针变量作函数参数编程 。
struct stu
{
int num;
char *name;
char sex;
float score;}boy[5]={
{101,"Li ping",'M',45},
{102,"Zhang ping",'M',62.5},
{103,"He fang",'F',92.5},
{104,"Cheng ling",'F',87},
{105,"Wang ming",'M',58},
};
main()
{
struct stu *ps;
void ave(struct stu *ps);
ps=boy;
ave(ps);
}
void ave(struct stu *ps)
{
int c=0,i;
float ave,s=0;
for(i=0;i5;i++,ps++)
{

推荐阅读