gpt4 book ai didi

c - 如何通过函数指针实现栈以及如何使用

转载 作者:行者123 更新时间:2023-11-30 21:39:34 25 4
gpt4 key购买 nike

我知道c中的struct仅由成员变量组成,但没有任何声明函数。是对的吗?
我们是否在结构体中使用函数指针而不是函数?

例如:
+ C++ 具有作为类成员的函数

class stack{
int[10] data;
int top;

public:
void init();
bool isEmpty();
bool isFull();
void push(int ivalue);
int pop();
}

+ 与 C,不能这样做。

    struct stack(
int[10] data;
int top;

void int(); // wrong here
....
)

那么我们是用函数指针来实现堆栈吗?
请给我一个例子以及如何使用它?
感谢您的帮助!

最佳答案

不可以,不能在 C 结构中声明函数成员(仅在 C++ 中)。约定是在进行面向对象编程时将结构体指针作为函数中的第一个参数传递。另外,C++ 确实做了同样的事情,“this”指针作为第一个参数传递,它只是被隐藏了。

struct stack{
int[10] data;
int top;
};

void stack_init(struct stack* stack);
int stack_isEmpty(struct stack* stack);
int stack_isFull(struct stack* stack);
void stack_push(struct stack* stack, int ivalue);
int stack_pop(struct stack* stack);

下面的这部分可能超出了您的要求,但是如果您希望函数更加“动态”,您可以将函数指针放入结构中以使它们“可变”,即模拟 virtual 关键字c++。

struct stack{
int[10] data;
int top;
int (*isEmpty)(struct stack* stack);
int (*isFull)(struct stack* stack);
void (*push)(struct stack* stack, int ivalue);
int (*pop)(struct stack* stack);
};

int stack_isEmpty1(struct stack* stack);
int stack_isFull1(struct stack* stack);
void stack_push1(struct stack* stack, int ivalue);
int stack_pop1(struct stack* stack);

void stack_init1(struct stack* stack)
{
stack->isEmpty = &stack_isEmpty1;
stack->isFull = &stack_isFull1;
stack->push = &stack_push1;
stack->pop = &stack_pop1;
...
}

int stack_isEmpty2(struct stack* stack);
int stack_isFull2(struct stack* stack);
void stack_push2(struct stack* stack, int ivalue);
int stack_pop2(struct stack* stack);

void stack_init2(struct stack* stack)
{
stack->isEmpty = &stack_isEmpty2;
stack->isFull = &stack_isFull2;
stack->push = &stack_push2;
stack->pop = &stack_pop2;
...
}

现在,如果您有 2 个堆栈对象,分别使用 stack_init1 和 stack_init2 进行初始化,它们每个都会调用自己的函数集。示例:

struct stack* a, b;
stack_init1(a);
stack_init2(b);

/* This will call stack_isEmpty1*/
a->isEmpty(a);

/* This will call stack_isEmpty2*/
b->isEmpty(b);

关于c - 如何通过函数指针实现栈以及如何使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31497643/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com