如何在 c/cpp 中传递指向函数的指针
How to pass a pointer to function in c/cpp?
我想传递一个指向函数的指针。假设我正在创建一个结构并声明指向该结构的指针。我将内存分配给该指针,然后我想将该指针"传递"到一个函数,以便我可以对该内存块执行操作。我是怎么做到的?
它与传递普通变量的方式相同。你不应该认为指针与变量有任何不同,因为指针是一个变量(虽然有点特殊(。
假设您有一个整数和一个指向该整数的指针:
int a = 0;
int * ptr = &a;
请注意,ptr
和 a
都是变量,在这种情况下,我们使用引用运算符 &
来引用 a
by &a
,它给出了a
的地址——这是一个指向a
的指针。
现在假设您有两个函数:
void foo(int i){}
void bar(int * p){}
现在这两个函数做同样的事情(什么都不做(,但一个取int
,一个取指向int
的指针,int *
。如果您调用foo(a)
并修改了i
,i
将在函数体中修改,但对a
没有影响。如果您调用bar(ptr)
并使用取消引用运算符*
修改ptr
指向的值,则类似于*ptr = 1
,它将修改ptr
指向的值,在这种情况下,该值将a
。
在您的情况下,传递struct
是一样的。假设你有一个结构
struct MyStruct { int b; };
并且还有两个功能
void structFoo(struct MyStruct m) {}
void structBar(struct MyStruct * mp) {}
您可以按照与上述int
和int *
函数相同的方式处理指针,尽管您现在还必须通过使用 (*mp).b
或速记版本mp->b
取消引用结构来访问结构组件。
为了便于使用,您可能还想做类似的事情
typedef struct MyStruct MyStruct;
这将允许您使用 MyStruct
作为类型名称,而不是像上述函数中那样要求struct MyStruct
,尽管您可能希望避免这样做,直到您完全了解正在发生的事情并克服指针的困难。
希望这能让您对正在发生的事情有所了解,尽管关于指针的C++教程提供了比我所能提供的更深入的讨论。
创建一些小程序并在打印结果时弄乱指针和常规类型以帮助了解在哪里发生的情况是一个很好的练习。您应该记住,要分配指针,您需要使用 new
或 malloc()
,否则您将遇到SEGFAULT
错误。在引用我&a
上面声明的变量时,这不是问题,因为在进行诸如int a
之类的声明时已经分配了内存。指针的声明为该指针分配内存,但不分配它指向的内存。这最终导致了堆栈和堆之间的差异,尽管在您非常彻底地了解指针之前,我不会考虑这一点。
c/cpp 中的结构与所有其他类型类似。你可以使用 & 和 *,就像你对 int 一样。
- QMetaObject invokeMethod的基于函数指针的语法
- C++-试图将函数指针推回到另一个CPP文件中的矢量时出错
- c++r值引用应用于函数指针
- 模板函数指针和lambda
- 是否可以将llvm::FunctionType转换为C/C++原始函数指针
- 带有类的函数指针
- () 函子后面的括号,而不是函数指针?
- 全局作用域中函数指针的赋值
- 使用"Task"函数指针队列定义作业管理器
- 将成员函数指针作为参数传递给模板方法
- 如何创建对象函数指针C++映射?
- 匹配函数指针作为模板参数?
- 通过函数指针定义类范围之外的方法
- 存储在类中的函数指针
- C++从函数指针数组调用函数
- 将返回值存储在函数指针数组的指针中是如何工作的?
- 整数键映射到头文件中的成员函数指针
- 从类成员函数到类 C 函数指针的转换
- 如何将内联匿名函数分配给C++函数指针
- 将字符缓冲区强制转换为函数指针