gpt4 book ai didi

c - c中函数指针的用例

转载 作者:太空宇宙 更新时间:2023-11-04 05:51:25 26 4
gpt4 key购买 nike

我在阅读函数指针时遇到的一个常见用例是它们可用于使函数更加灵活,因为函数的一部分功能可以作为参数接受。一个例子是 qsort,我可以在其中创建一个比较函数来确定更大和更小(升序、降序、是等的倍数)的含义,并将比较函数指针传递给 qsort 函数。

这里,函数 repeat 以 addptr 作为参数,因此执行乘法。

int add(int a, int b)
{
return a+b;
}

int (*addptr)(int,int);

int repeat(int a,int b,int (*funcptr)(int,int))
{
int i,ans=0;
for(i=0;i<a;i++)
{
ans=(*funcptr)(ans,b);
}
return ans;
}


int main()
{
addptr=&add;
printf("%d\n",repeat(7,5,addptr));

return 0;

}

但是完全没有函数指针也可以完成同样的事情!

int add(int a, int b)
{
return a+b;
}


int repeat(int a,int b,int func(int,int))
{
int i,ans=0;
for(i=0;i<a;i++)
{
ans=func(ans,b);
}
return ans;
}


int main()
{
printf("%d\n",repeat(7,5,add));

return 0;

}

那么为什么这甚至是函数指针的用途之一呢?第一个代码比第二个有什么优势?

最佳答案

规则 C11 6.7.6.3/8 说如果你在参数列表中编写一个函数,它将被调整为指向该类型函数的指针:

A declaration of a parameter as ‘‘function returning type’’ shall be adjusted to ‘‘pointer to function returning type’’,

这类似于将数组作为函数参数编写时的工作方式,它会调整为指向第一个元素的指针。

话虽这么说,把函数写成参数并没有什么实际意义,只会让读者很困惑。请改用函数指针。


编辑

为了获得最大的可读性,我个人建议使用这种风格:

typedef int operation_t (int, int);

int repeat (int a, int b, operation_t* operation)
{ ...

虽然最常用的样式可能是这个:

typedef int (*operation_t) (int, int);

int repeat (int a, int b, operation_t operation)
{ ...

我更喜欢前者,因为将指针隐藏在 typedef 后面是个坏主意,而且这种风格使函数指针与常规指针保持一致。

关于c - c中函数指针的用例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40839810/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com