如何在 c/cpp 中传递指向函数的指针

How to pass a pointer to function in c/cpp?

本文关键字:函数 指针 cpp      更新时间:2023-10-16

我想传递一个指向函数的指针。假设我正在创建一个结构并声明指向该结构的指针。我将内存分配给该指针,然后我想将该指针"传递"到一个函数,以便我可以对该内存块执行操作。我是怎么做到的?

它与传递普通变量的方式相同。你不应该认为指针与变量有任何不同,因为指针是一个变量(虽然有点特殊(。

假设您有一个整数和一个指向该整数的指针:

int a = 0;
int * ptr = &a;

请注意,ptra 都是变量,在这种情况下,我们使用引用运算符 & 来引用 a by &a,它给出了a的地址——这是一个指向a的指针。

现在假设您有两个函数:

void foo(int i){}
void bar(int * p){} 

现在这两个函数做同样的事情(什么都不做(,但一个取int,一个取指向int的指针,int *。如果您调用foo(a)并修改了ii将在函数体中修改,但对a没有影响。如果您调用bar(ptr)并使用取消引用运算符*修改ptr指向的值,则类似于*ptr = 1,它将修改ptr指向的值,在这种情况下,该值将a

在您的情况下,传递struct是一样的。假设你有一个结构

struct MyStruct { int b; };

并且还有两个功能

void structFoo(struct MyStruct m) {}
void structBar(struct MyStruct * mp) {}

您可以按照与上述intint *函数相同的方式处理指针,尽管您现在还必须通过使用 (*mp).b 或速记版本mp->b取消引用结构来访问结构组件。

为了便于使用,您可能还想做类似的事情

typedef struct MyStruct MyStruct;

这将允许您使用 MyStruct 作为类型名称,而不是像上述函数中那样要求struct MyStruct,尽管您可能希望避免这样做,直到您完全了解正在发生的事情并克服指针的困难。

希望这能让您对正在发生的事情有所了解,尽管关于指针的C++教程提供了比我所能提供的更深入的讨论。

创建一些小程序并在打印结果时弄乱指针和常规类型以帮助了解在哪里发生的情况是一个很好的练习。您应该记住,要分配指针,您需要使用 newmalloc() ,否则您将遇到SEGFAULT错误。在引用我&a上面声明的变量时,这不是问题,因为在进行诸如int a之类的声明时已经分配了内存。指针的声明为该指针分配内存,但不分配它指向的内存。这最终导致了堆栈和堆之间的差异,尽管在您非常彻底地了解指针之前,我不会考虑这一点。

c/cpp 中的结构与所有其他类型类似。你可以使用 & 和 *,就像你对 int 一样。