2012-05-27 48 views
1

我在下面列出了一些示例代碼,問題是如果有一種方法讓函數名從struct_name訪問數值的值?函數指針:訪問結構中的數據?

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? 
} 
+1

除非你改變'func'的簽名就可以接受參數是不可能的。 – UmNyobe

+0

看到這個問題[如何在C中模擬OO風格的多態?](http://stackoverflow.com/questions/524033/how-can-i-simulate-oo-style-polymorphism-in-c) –

+0

這不能工作;你已經將'struct_name_ptr'聲明爲一個指針,'newobject'指向未定義的內存,一個解引用是未定義的行爲 – user411313

回答

4

呃 - 沒有。

一個struct肯定可以包含一個函數指針。但是你調用的函數不會有任何有關結構的知識。除非你傳遞一個指針作爲函數參數,或者使struct爲全局的。

1

由於我對編程知識有限,我不認爲這是可能的。雖然結構體包含一個函數指針,但分配給它的函數的地址是不同的,我不認爲它會有任何訪問它的地方,除非你將它作爲參數傳遞。

1

好吧,兩件事情,struct_name->數量應該有一個價值,它要麼必須在相同的範圍內&函數名,或者需要明確地傳遞。兩種方法可以做到這一點:

/*這裏是一個全球性的呼叫結構*/

#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(); 
} 

/*和一個與修改前執行*/

#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); 
} 
1

不,比薩餅韓元我不知道送達它的披薩送貨員是什麼樣的。

常規函數只是內存中的一個地址。可以使用像這種情況下的函數指針來調用它。在任何情況下:函數將不知道它是如何被調用的。特別是它不會知道它是使用一個函數指針調用的,這個函數指針是某個struct的一部分內存(一段內存)。

當像C++這樣的類使用語言時,成員函數將有一個隱藏的參數,它是一個指向類實例的指針。這就是成員職能如何瞭解他們的數據。

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á 
}