- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我在阅读函数指针时遇到的一个常见用例是它们可用于使函数更加灵活,因为函数的一部分功能可以作为参数接受。一个例子是 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/
我最近购买了《C 编程语言》并尝试了 Ex 1-8这是代码 #include #include #include /* * */ int main() { int nl,nt,nb;
早上好!我有一个变量“var”,可能为 0。我检查该变量是否为空,如果不是,我将该变量保存在 php session 中,然后调用另一个页面。在这个新页面中,我检查我创建的 session 是否为空,
我正在努力完成 Learn Python the Hard Way ex.25,但我无法理解某些事情。这是脚本: def break_words(stuff): """this functio
我是一名优秀的程序员,十分优秀!