当我读到其他人的代码时,我总是有点难过,这些代码的typedef用于指向带参数的函数的指针.我记得在尝试理解用C语言编写的数值算法时,我花了一些时间来解决这个定义.那么,您是否可以分享您关于如何编写好的typedef指向函数(Do和Do)的提示和想法,为什么它们有用以及如何理解其他人的工作?谢谢!
这是什么意思:int (*b)[100]以及为了产生这个结果,这段代码的澄清是什么?
#include <iostream>
void foo(int a[100])
{
a [1]= 30 ;
std::cout<<a[1]<< std::endl;
}
void boo(int a[100])
{
std::cout<<a[1]<< std::endl;
}
int main()
{
int (*b)[100] = (int (*) [100]) malloc(100 * sizeof(int));
*b[1] = 20;
std::cout<< *b[1] << "\t" << b[1] << std::endl;
foo(*b);
boo(*b);
std::cout<< *b[1] << "\t" << b[1] << std::endl;
}
Run Code Online (Sandbox Code Playgroud)
以上代码输出:
20 0x44ba430
30
30
20 0x44ba430
Run Code Online (Sandbox Code Playgroud) 是否可以创建指向函数指针的指针,即
int32_t (*fp[2])(void) = {test_function1, test_function_2}; // initialize a function pointer
<unknown> = fp;
Run Code Online (Sandbox Code Playgroud)
需要写什么来代替未知?使用"普通"数组,我可以这样做:
int a[2] = {0, 1};
int* p = a;
Run Code Online (Sandbox Code Playgroud)
提前谢谢了.
我在阅读函数指针时遇到的一个常见用例是,它们可以用来使函数更加灵活,因为函数功能的一部分可以作为参数使用.这方面的一个例子是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;
}
Run Code Online (Sandbox Code Playgroud)
但是在没有函数指针的情况下可以完成同样的事情!
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;
}
Run Code Online (Sandbox Code Playgroud)
那么为什么这甚至是函数指针的一个用途呢?第一个代码比第二个代码有什么优势?