我在下面列出了一些示例代码,问题是function_name是否有办法从struct_name访问number的值?
typedef struct struct_name {
int number
void (*func)();
} * struct_name_ptr;
void function_name() {
//access number from struct
}
main() {
struct_name_ptr newobject;
newobject->func=&function_name;
newobject->func(); //can it print the value of the number in the structure above?
}
答案 0 :(得分:4)
呃 - 不。
结构当然可以包含函数指针。但是你调用的函数不会对结构有任何了解。除非你将指针作为函数参数传递,否则使结构变为全局。
答案 1 :(得分:1)
由于我对编程知识有限,我认为这不可行。虽然struct包含一个函数指针,但是分配给它的函数的地址是不同的,我认为除非你把它作为参数传递,否则它无论如何都不会访问它。
答案 2 :(得分:1)
好吧,两件事,struct_name-> number应该有一个值,它需要与& function_name在同一范围内,或者需要显式传递。有两种方法可以做到:
/ *这是一个全局调用struct * /
#include<stdio.h>
typedef struct struct_name {
int number;
void (*func)();
} * struct_name_ptr;
struct struct_name newobject = { 0 };
void function_name() {
printf("%d",struct_name);
}
void main() {
struct struct_name_ptr newobject;
newobject->func=&function_name;
newobject->func();
}
/ *其中一个修改了function_name * /
#include<stdio.h>
typedef struct struct_name {
int number;
void (*func)();
} * struct_name_ptr;
void function_name(struct_name) {
printf("%d",struct_name);
}
void main() {
struct struct_name_ptr newobject;
newobject.number = 0;
newobject->func=&function_name;
newobject->func(newobject);
}
答案 3 :(得分:1)
不,比萨饼永远不会知道发送它的披萨送货员是什么样的。
常规函数只是内存中的一个地址。可以使用像这种情况下的函数指针来调用它。在任何情况下:该函数将不知道它是如何被调用的。特别是它不会知道它是使用函数指针调用的,该函数指针是(一段内存对应于某些结构)的一部分。
当使用像C ++这样的类的语言时,成员函数将有一个隐藏参数,该参数是指向类实例的指针。这就是成员函数如何了解他们的数据。
答案 4 :(得分:1)
您可以在普通C中“模拟”一个简单的OOP,例如:
typedef struct {
int number;
void (*func)();
} class;
void function_name(class *this) {
printf("%d",this->number);
}
#define CALL(c,f) c.f(&c)
int main() {
class object={12345,function_name};
CALL(object,func); // voilá
}