大多数高级语言(Python,Ruby,甚至Java)都使用pass-by引用.显然,我们在C中没有引用,但我们可以使用指针来模仿它们.这样做有一些好处.例如:
int findChar(char ch, char* in)
{
int i = 0;
for(i = 0; in[i] != '\0'; i++)
if(in[i] == ch)
return i;
return -1;
}
Run Code Online (Sandbox Code Playgroud)
这是一个常见的C范例:通过返回一些错误值来捕获异常或错误的情况(在这种情况下,-1如果字符不在字符串中则返回).
这个问题是:如果你想支持多于2^31 - 1字符的字符串怎么办?显而易见的解决方案是返回一个unsigned int但不适用于此错误值.
解决方案是这样的:
unsigned int* findChar(char ch, char* in)
{
unsigned int i = 0;
for(i = 0; in[i] != '\0'; i++)
if(in[i] == ch)
{
unsigned int index = (unsigned int*) malloc(sizeof(unsigned int));
*index = i;
return index;
}
return NULL;
}
Run Code Online (Sandbox Code Playgroud)
有一些明显的优化,我没有为简单起见,但你明白了; 返回NULL作为您的错误值.
如果对所有函数执行此操作,则还应将参数作为指针传递,以便可以将一个函数的结果传递给另一个函数的参数.
我缺少这种方法(除了内存使用情况)有什么缺点吗?
编辑:我想添加(如果我的问题不是很明显)我有一些C++的经验,但我几乎是C的初学者.
这是一个坏主意,因为调用者free对索引负责,否则你正在泄漏内存.或者你可以static int每次使用并返回它的地址 - 没有泄漏,但功能变得不可重入,这是有风险的(但如果你记住它可以接受).
更好的方法是返回指向char函数查找的指针,如果不存在则返回NULL.strchr()BTW 就是这样的方式.
编辑以反映原始帖子的变化.