Tag: 函数指针

C中这个奇怪的函数指针声明是什么意思?

任何人都可以解释这个int ((*foo(int)))(int)吗? int (*fooptr)(int); int ((*foo(int)))(int); // Can’t understand what this does. int main() { fooptr = foo(0); fooptr(10); } 。

带有const参数的函数指针是否可以用作带有nonconst参数的函数指针?

也许标题本身并不清楚……我有一个函数f(由某些库提供),它将一个函数指针作为参数作为签名void g(int*) ,即ie void f(void (*g)(int*)); 但是,我想使用函数g (我定义)和签名void g(const int*)来使用它。 先验,我无法看到这是如何违反任何const正确性的,因为f所有签名都表示g只会被一个(非const ) int* (非常量)调用,事实上我可以使用非const int*参数调用void (const int*)函数。 但海湾合作委员会抱怨并说, expected ‘void (*)(int *)’, but argument is of type ‘void (*)(const int *)’ 我看不出这个投诉是如何合法的,所以有人知道我对此的理解是否错误,或者是否有办法解决?

If语句与函数指针

目标是更改事件循环中的行为,具体取决于是否打开或关闭复选框。 我能想到的最简单的方法就是每次运行循环时测试复选框状态。 // if-statement void action() { /* … */ } void someLoop() { if (checkboxTrue) { action(); } // … other stuff } 如果使用函数指针,代码是否会更高效,更清晰或更好? 像这样: // function pointer void action() { /* … */ } void empty() {} void (*actionPtr)(); void checkboxChanged(int val) { if (val == 1) actionPtr = &realAction; else actionPtr = […]

C – 地址运算符中的函数指针“不必要”

在C中使用qsort我们传递比较函数,例如 int cmp(const void*, const void*); qsort的protoype期望一个int(*)(const void *,const void *)所以我们调用: qsort(…, cmp); 但同样有效的是: qsort(…, &cmp); 如果我们在C ++中传入静态成员函数,这就是我们必须要做的。 Kernighan&Ritchie(第2版,5.11“Pointers To Functions”p119)声明“因为[cmp]已知是一个函数,所以&运算符不是必需的,就像在数组名称之前不需要它一样。 “ 是否有人对此感到有点不舒服(特别是关于型号安全性)?

用Objective-C包装C库 – function指针

我正在Objective-C中编写一个C库的包装器。 该库允许我在发生某些事件时注册回调函数。 register_callback_handler()函数将函数指针作为参数之一。 我对你的编程大师的问题是:我怎样才能将Objective-C方法调用/选择器表示为函数指针? NSInvocation会在这种情况下有用吗还是太高级别? 我是否会更好地编写一个在其中编写方法调用的C函数,然后将指针传递给该函数? 任何帮助都会很棒,谢谢。

在C中运行时生成函数

我想在C中运行时生成一个函数。我的意思是我本来想分配一些内存,指向它并通过函数指针执行它。 我意识到这是一个非常复杂的话题,我的问题是天真的。 我也意识到有一些非常强大的库可以做到这一点(例如nanojit )。 但我想从基础知识开始学习这项技术。 知识渊博的人能否在C中给我一个非常简单的例子? 编辑: 下面的答案是伟大的,但这是Windows的相同示例: #include #define MEMSIZE 100*1024*1024 typedef void (*func_t)(void); int main() { HANDLE proc = GetCurrentProcess(); LPVOID p = VirtualAlloc( NULL, MEMSIZE, MEM_RESERVE|MEM_COMMIT, PAGE_EXECUTE_READWRITE); func_t func = (func_t)p; PDWORD code = (PDWORD)p; code[0] = 0xC3; // ret if(FlushInstructionCache( proc, NULL, 0)) { func(); } CloseHandle(proc); VirtualFree(p, 0, MEM_RELEASE); return […]

凌乱的函数指针解释

我偶然遇到以下函数指针。 char (*(*x())[])(); 它看起来像以下格式的函数指针数组,但我看不出f – >(* x())的含义。 如何解释这个凌乱的函数指针? char (*f[])(); 添加 在John Bode的帮助下,我举了一个例子如下。 #include char foo() { return ‘a’; } char bar() { return ‘b’; } char blurga() { return ‘c’; } char bletch() { return ‘d’; } char (*gfunclist[])() = {foo, bar, blurga, bletch}; char (*(*x())[])() { static char (*funclist[4])() = {foo, bar, blurga, […]

function指针 – 自动解除引用

可能重复: 如何解除引用函数指针? void myprint(char* x) { printf(“%s\n”, x); } int main() { char* s = “hello”; void (*test)(char*); void (*test2)(char*); test = myprint; test2 = &myprint; test(s); (*test)(s); test2(s); (*test2)(s); } 任何人都可以向我解释为什么以上所有代码都有效? “你好”打印四次。 通过应用函数指针,它是否隐式解除了? 基本上我想知道函数指针是如何实际存储的,因为上面的内容有点令人困惑。

函数指针到底指向哪里?

鉴于所有原始数据类型和对象都分配了内存,因此直观地容易想象指向这些类型的指针。 但是函数指针究竟指向哪里? 鉴于指令被转换为机器代码并驻留在内存中,我们是否应该考虑它们指向与函数指令开头相对应的内存位置? 由于非法内存访问,我们在指针中面临许多错误。 当函数指针指向数据存储器而不是指令存储器时,是否会发生错误?

指针和指针变量之间有什么区别?

我知道这是非常基本的,但对我来说有点混乱。 我读了: 指针只不过是一个地址 ,而指针变量只是一个可以存储地址的变量。 当我们将变量i的地址存储在指针变量p ,我们说p 指向 i 。 int i, *p = &i; p指向i 。 为了访问指针指向的对象,我们使用* (间接)运算符。 如果p 是指针,则*p表示p当前指向的对象。 现在我很困惑,我应该将p – 指针或指针变量称为什么? 附加: 指针总是与地址相同吗?