C语言中函数指针能不能作为返回类型使用?

作者&投稿:休娜 (若有异议请与网页底部的电邮联系)
c语言函数返回字符串时必须要用指针吗?如果返回结构体呢?函数在返回那些类型值时必须要用指针?~

所谓函数类型是指函数返回值的类型。在C语言中允许一个函数的返回值是一个指针(即地址),这种返回指针值的函数称为指针型函数。
定义指针型函数的一般形式为:
类型说明符 *函数名(形参表)
{
…… /*函数体*/
}
其中函数名之前加了“*”号表明这是一个指针型函数,即返回值是一个指针。类型说明符表示了返回的指针值所指向的数据类型。
如:
int *ap(int x,int y)
{
...... /*函数体*/
}
表示ap是一个返回指针值的指针型函数,它返回的指针指向一个整型变量。
【例】本程序是通过指针函数,输入一个1~7之间的整数,输出对应的星期名。
main(){
int i;
char *day_name(int n);
printf("input Day No:
");
scanf("%d",&i);
if(i<0) exit(1);
printf("Day No:%2d-->%s
",i,day_name(i));
}
char *day_name(int n){
static char *name[]={ "Illegal day",
"Monday",
"Tuesday",
"Wednesday",
"Thursday",
"Friday",
"Saturday",
"Sunday"};
return((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行是个条件语句,其语义是,如输入为负数(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
",s);
ave=s/5;
printf("average=%f
count=%d
",ave,c);
}

本程序中定义了函数ave,其形参为结构指针变量ps。boy被定义为外部结构数组,因此在整个源程序中有效。在main函数中定义说明了结构指针变量ps,并把boy的首地址赋予它,使ps指向boy数组。然后以ps作实参调用函数ave。在函数ave中完成计算平均成绩和统计不及格人数的工作并输出结果。
由于本程序全部采用指针变量作运算和处理,故速度更快,程序效率更高。

首先你要认识函数传参是怎么进行的

函数传参是复制形的,举个例子说:

void modify(int a)
{
a++;
}

void main()
{
int a=5;
modify(a);
printf("%d",a);
}
这个程序的答案还是5。为什么?
因为当调用modify(a)时,在执行modify函数时,是另外开辟了一个内存空间,将main中a的值复制过来,modify函数中所有的操作都是相对于这个新开辟的内存空间而言的,对原来的a没有任何改变。

现在就来说说指针,如果用指针传参的话那就完全不一样了,指针(pointer),说白了即是指向变量内存地址。同样上面的例子:
void modify(int * a)
{
(*a)++;
}

void main()
{
int a=5;
modify(&a);
printf("%d",a);
}
这个答案当然是6
因为你传进去的是a的地址,所以在modify函数中的操作都是对a地址上的内容进行操作,即是操作a所以modify函数不用返回这个数,main中a的值也会改变。因为大家都是操作同一个内存空间,而上面不用指针,modify操作的是另一个新开辟的内存空间,只是这个内存空间初始值和a一样。


现在来说说传参,其实你“为什么函数参数是字符串的多用指针?” 那句我不是很明白,C中的字符串传参好像就指针一种形式(除非用结构体)。
何时用指针,何时用拷贝。当传的参数是一个结构体,而这个结构体比较大,这时最好用指针,因为如果用拷贝的话,单单花在拷贝的时间就要浪费很多,而如果这个函数经常被调用,那么这效率问题就出现了。

你在子函数中要对你的主调用函数中变量进行操作时也可以用指针做参数,这样子函数就可以不用return 如果不是用指针的话,就要再子函数的未尾加上一条return x;把这个数返回当返回值。

多看点书,多写点程序,刚开始学都会对指针比较迷茫。写多了,自然而然就懂了。

可以,只是你的函数定义方式有问题
比如
char *strcpy(char *src,char *dest);
就是返回一个字符串类型的指针
int(*foo)(int,int);
是返回一个整形的函数指针

int(*foo)(int,int);


C语言中函数指针用法
函数在内存中有一个物理位置,而这个位置是可以赋给一个指针的。一零点函数的地址就是该函数的入口点。因此,函数指针可被用来调用一个函数。函数的地址是用不带任何括号或参数的函数名来得到的。(这很类似于数组地址的得到方法,即,在只有数组名而无下标是就得到数组地址。)怎样说明一个函数指针变量...

函数指针是否可以加加
但是函数指针可以比较大小,因为比较大小的操作仅仅是对地址进行比较,并不涉及指针的加减运算

C语言能在函数里改变指针所指的对象吗?
是的,不能,你的理解是对的。指针传递可以改变其指向地址的内容,但不能改变原指针的指向。如果需要改变指向,需要使用指向指针的指针作为参数。

c语言函数指针的作用。
C语言中函数指针与普通指针没什么差别,只是指向的内容不同而已。主要作用:1、实现面向对象编程中的多态性。2、回调函数。函数指针是指向函数的指针变量。因此“函数指针”本身首先应是指针变量,只不过该指针变量指向函数。这正如用指针变量可指向整型变量、字符型、数组一样,这里是指向函数。C在编译时,...

为什么c语言不能用指针?
C语言里,所有变量空间都是在程序运行之初向系统申请的,包括指针,除了一些动态申请方式如malloc函数。没有申请的空间系统是不允许读写的。那么如果一个数组大小是变量定义,则在程序运行前不能确定数组大小,也就无法申请,故不允许。所以,解决的办法便是通过malloc函数,即 int a[n];可改为 int* ...

c++的函数指针是怎么用的呀?
5) 在一个程序中,指针变量p可以先后指向不同的函数,但一个函数不能赋给一个不一致的函数指针(即不能让一个函数指针指向与其类型不一致的函数)。如有如下的函数:int fn1(int x, int y); int fn2(int x);定义如下的函数指针:int (*p1)(int a, int b); int (*p2)(int a);则 ...

c语言,在函数中创建的指针,在其他函数中能直接调用吗
能啊,在参数里调用指针其实只是用的只是地址,下面的程序就是调用数组a的首地址。int reform(int *q,int n){...} main(){ int a[10],*p;p=a;reform(p,10);}

c语言中函数指针是什么 有什么用 举个实例
函数指针是指向函数的指针变量。 因而“函数指针”本身首先应是指针变量,只不过该指针变量指向函数。这正如用指针变量可指向整型变量、字符型、数组一样,这里是指向函数。函数指针有两个用途:调用函数和做函数的参数。函数指针的声明方法为:返回值类型 ( * 指针变量名) ([形参列表]);如:int func(...

标题c语言中为什么要使用函数指针,直接调用函数不就可以吗?
函数指针一般用来做回调的,一般多线程用的多,因为线程之间,栈空间不一样。还有就是封装好的程序,做回调的,比如我写了一段程序,想要给你用,如果我内部没有回调,你就要改动我的程序。但我这样写,我的执行过程是123,二这个步骤,我用函数指针封装起来,如果等于空就不执行,然后你来用,只需要...

请教C++中函数型指针和指针型函数的用法和区别,谢谢
1 函数指针变量 在C语言中,一个函数总是占用一段连续的内存区,而函数名就是该函数所占内存区的首地址。我们可以把函数的这个首地址(或称入口地址)赋予一个指针变量,使该指针变量指向该函数。然后通过指针变量就可以找到并调用这个函数。我们把这种指向函数的指针变量称为“函数指针变量”。函数指针...

修水县15616702238: C语言中函数指针能不能作为返回类型使用? -
锐榕派扶: 可以,只是你的函数定义方式有问题比如char *strcpy(char *src,char *dest);就是返回一个字符串类型的指针int(*foo)(int,int);是返回一个整形的函数指针

修水县15616702238: c语言中函数能返回一个数组吗 -
锐榕派扶: 在C语言中,无法直接返回一个数组,但是可以通过返回对应类型指针的方式,返回数组. 在大多数情况下,一维数组和一维指针是可以通用的.比如,定义一个函数,申请一定长度的整型动态数组,其长度用参数传入,并将结果返回.如出错,返回空指针NULL. 代码可以写成如下形式: int *int_array_create(int n)//参数n为数组元素个数 { int *r; if(n<=0) return NULL;//参数错误 r = (int *)malloc(sizeof(int)*n);//申请内存空间,大小为n个int长度. return r;//返回得到的整型数组的指针. }

修水县15616702238: c++中,函数的返回类型可以是除了数组和什么的任何类型 -
锐榕派扶: 【正确答案】 函数【原话】 C++中,函数返回类型可以是C++中除【函数、数组】类型之外的任何一个合法的数据类型,包括普通类型、指针类型和引用类型等.【说明】 C++中,函数定义的一般形式如下: 返回类型 函数名(参数表列) ...

修水县15616702238: c语言函数怎么返回char[]类型 -
锐榕派扶: C语言中,函数的定义格式:函数返回值类型 函数名 (形参列表). 所以,返回值为char* 的函数指针的定义格式是: char* (*指针变量名)(函数形参列表) { 函数体; }

修水县15616702238: C语言中,怎样定义函数可以让函数返回一个指针数组? -
锐榕派扶: 返回它的地址不就行了么,指针数组的首地址就可以了 比如 有一个指针数组 char *p[10] = {这里面放的都是指针},那么p的类型就是char **类型 你定义一个函数,返回char **类型就行了 比如 char **fun() {char **s;returns; }

修水县15616702238: C语言中的函数的调用时,用一般的变量会有用RETURN,而用指针变量就没有用RETURN? -
锐榕派扶: 用指针变量相当于传址调用 (call by reference),会带出结果. 用一般的变量相当于传值调用 (call by value), 必须用return 返回结果.

修水县15616702238: c语言中能不能定义函数数组 -
锐榕派扶: 函数不可以定义为数组,可以用函数指针来操作. 1.函数指针的数组定义方法:返回值类型( * 指针变量名[Number]) (形参列表). 例如: double add(double a,double b){} double sub(double a,double b){} double mul(double a,double b){} ...

修水县15616702238: C语言怎么让“函数”返回“指针数组” -
锐榕派扶: 首先,你不应该返回局部变量的指针,因为局部变量在离开函数后就会被销毁.如果你想这样返回一个数组的话,你应该malloc出一个数组来返回. 至于应该return什么,return (malloc出来的那个指针)就可以了. 例如 int** foo() { int **p = (int **)malloc(sizeof(int *)*10); ... ... ... return p; } 这个p指向一个内存段,这个内存段存有十个int*类型的元素.

修水县15616702238: C语言中,定义一个函数时,要返回的是指针,该怎样表达呢?谢谢 -
锐榕派扶: 你把返回值写成指针型就可以了,具体得看你参数是怎样的,还有返回值是什么类型的指针:比如:int * scar(int ) 这个函数参数是一个整型,返回值是个整型指针.类比你可以写出来其他类型的函数

修水县15616702238: c语言函数返回字符串时必须要用指针吗?如果返回结构体呢?函数在返回那些类型值时必须要用指针? -
锐榕派扶: 所谓函数类型是指函数返回值的类型.在C语言中允许一个函数的返回值是一个指针(即地址),这种返回指针值的函数称为指针型函数.定义指针型函数的一般形式为: 类型说明符 *函数名(形参表){…… /*函数体*/ } 其中函数名之前加了“...

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网