首页 > C语言的函数在什么场景下需要返回一个指针?

C语言的函数在什么场景下需要返回一个指针?

除了返回函数指针之外。谢谢!


C语言一样可以用面向对象的思想编程,尽管语法没那么优雅,但只要符合一定的规范编程,一样可以做到优雅的内存管理。
等等,我真的没跑题,请读下去。
很多开放框架就是面向对象思想设计的C接口,例如OpenGL,这样的设计里返回指针非常常见,形式看起来是这样的:

void* NewObject(); //创建对象
void DestroyObject(void* object); //销毁对象
void DoSomething(void* object, int arg); //方法

如果要允许用户有更优雅的内存管理,还可以加入引用计数:

void* NewObject(); //创建对象,引用计数=1
void Retain(void* object); //引用计数++
void Release(void* object); //引用计数--,如果等于0则销毁对象
void DoSomething(void* object, int arg); //方法

OpenGL就是这样设计的,所以返回指针未必是愚蠢的做法,相反,有时候是非常高大上的设计。

那为什么这样的代码不用C++啊?因为C的兼容性和性能都无与伦比啊!但这不会意味着我们不需要面向对象,面向对象依然是大型项目非常重要的设计基础,所以大家都应该学学这种C语言的设计模式。


返回链表的头指针之类的


上面的回答只提到了创建对象,其实还有很多技法:
1、创建对象时,就如@傅里叶变黄油猫的回答
2、使用函数状态机时,返回函数指针,用于指示当前状态下的对应处理函数
3、用于标记当前处理的位置,起到index的作用,类似strcpy、FindNode

等等


当一系列(一个或多个)的函数组成一个完整的模块(库)的时候,
如hash表,每个函数都是为一个对象服务的,每个函数处理完这个对象,既可以返回这个对象的指针,也可以什么都不返回,因为所有函数作用的就是这个对象本身。


从效率方面考虑,应该是在返回的结果(结构体)内存占用大小超过一个指针的长度的时候(一个字长)。

与栈的返回值处理方式有关。


个人还用过这种返回指针的 C 函数:使用 C 来模拟面向对象编程的时候。每个对象都是 malloc 的,也自然都适用指针。


居然这么多人都没有提到,我也是醉了

不要返回在函数中malloc的指针不要返回局部变量的指针有人提了我就不说了)

也就是说,函数中malloc的内存一定要在函数返回前free掉
因为C不会回收内存,调用你这个函数的人也不清楚你这个函数是不是分配了内存,什么时候该free
所以最好的方法就是,让别人传一个指针进去,分配内存的事情在函数外面做

这正是为什么C标准库没有itoa的原因

至于什么情况下要返回指针,可以参考C标准库中的strcat或strcpy

char *strcpy(char *_Dest,const char *_Source);

它实际上返回的正是你传进去的_Dest,这里返回完全是为了可以链式调用,否则返回类型为void也可以

还有对于用struct实现的复杂的数据结构(比如链表、树),在查找的时候可以返回一个指向结果的指针,比如这样

TreeNode *findMinNode(TreeNode *root);

大概就这样


这种情况挺多的,比如malloc就是返回一个void *

返回指针的情形一般是:
1. 该函数在堆上分配了一段内存或者一个对象
2. 返回一个指向全局对象的(或某个全局对象的成员)的指针

欢迎补充。


当函数返回内存资源的大小由函数内部确定,调用者无法得知的时候,一般直接由函数返回指针较好。
返回方式有两种
1. 内存分配+初始化 一步到位,全在一个函数里
2. 内存分配是一个函数,返回资源指针,初始化在后续的操作里


C 语言函数返回指针注意一点:不要返回局部变量的指针


可以用作链式表达式
像string.h里面的函数, 都是返回第一个字符串的指针

char *strcat(char *dest, const char *src);

链式表达式可以这样用

strcpy(strcat(s1, s2), s3);
【热门文章】
【热门文章】