c语言函数返回字符串时必须要用指针吗?如果返回结构体呢?函数在返回那些类型值时必须要用指针?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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(i<0) 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((n<1||n>7) ? 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行是个条件语句,其语义是,如输入为负数(i<0)则中止程序运行退出程序。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;i<5;i++,ps++)

s+=ps->score;
if(ps->score<60) c+=1;

printf("s=%f\n",s);
ave=s/5;
printf("average=%f\ncount=%d\n",ave,c);


本程序中定义了函数ave,其形参为结构指针变量ps。boy被定义为外部结构数组,因此在整个源程序中有效。在main函数中定义说明了结构指针变量ps,并把boy的首地址赋予它,使ps指向boy数组。然后以ps作实参调用函数ave。在函数ave中完成计算平均成绩和统计不及格人数的工作并输出结果。
由于本程序全部采用指针变量作运算和处理,故速度更快,程序效率更高。
参考技术A (1)也可以返回字符串对象
(2)可以返回结构体对象,但效率不高,有更好的方式
(3)这个依赖于函数设计者的意图,没有哪种类型是必须要用指针来返回的。

函数设计除了实现正确功能的同时,提高函数效率也是非常必要的,尤其是该函数被频繁调用。而函数的返回方案设计好坏往往影响着函数的效率,也体现了设计者的水平。

没有什么是必须的,只有最优的和最好的。

这个问题实际上不是那么简单可以说清楚的,你可以hi我,我给你举些例子,不过你要有给我加分的思想准备。
参考技术B 在函数体内出现动态分配内存的情况,就需要考虑返回指针。
比如上述函数返回类型为字符串,实际一般是返回一个char指针,因为如果是用string来代替返回,在这个字符串相当庞大的时候将会造成很大的临时空间开销。

C语言如何写有返回值的函数

C语言怎么写有返回值的函数呢?
如何写有返回值的函数
如果有多个返回值该怎么写呢?

C语言,有返回值的处理,可以分两种情况,1,返回一个值,可以用:
返回类型 函数名([参数列表])


return (返回值);

多个返回值,可以返回一个自定义结构体,
返回结构体 函灵敏名([参数列表])

return (结构体名);

也可用指针的形式,直接操作,此时,接收返回值变量的地址,可以以指针的形式,传递给函数),进行操作,具体方法和实例.
参考技术A 举个例子:
返回double型值
double Func(……)

double r;
……
return r;

多个返回值则可用数组按址传递(程序内对数组操作会改变数组值)。若返回值类型不同则可考虑用自定义变量。
参考技术B 可以嘛?我觉得好像在C中只能返回一个值,但我在VC++中做题目的时候,发现可以返回数组。呵呵。我们老师也很无奈。
如果想返回多个值用指针好像可以做到。
参考技术C 楼上回答的都不错,我补一点,还可通过参数返回值~你应该学了吧!

以上是关于c语言函数返回字符串时必须要用指针吗?如果返回结构体呢?函数在返回那些类型值时必须要用指针?的主要内容,如果未能解决你的问题,请参考以下文章

C语言返回结构体函数返回值应定义哪种类型?

C语言返回结构体函数返回值应定义哪种类型?

c语言函数能不能返回结构体

C语言中,return语句怎么样返回一个数组?

C语言如何写有返回值的函数

求高手指教c语言函数怎么返回结构体