2011-04-28 16 views
5
struct counter{ 
    long long counter; 
} 

struct instruction{ 
    struct counter *counter 
    int repetitions; 
    void (*work_fn)(long long *); 
}; 

int ncounter; //number of counters 
struct counter *counter; //counter array 

int nthreads; //number of threads 
int *ninstructions; //number of instructions 

struct instruction **instructions; 

यह वास्तव में कैसे काम करता है? मुझे ** पॉइंटर्ससी डबल पॉइंटर

+2

प्रश्न कोड कोड में प्रश्न न डालना एक अच्छा विचार हो सकता है। – takrl

+3

कृपया सी # के साथ सी प्रश्नों को टैग न करें अगर आपको नहीं पता कि सी # क्या है। – BoltClock

+0

कृपया अपना प्रश्न कोड ब्लॉक के बाहर रखें अन्यथा लोग इसे नहीं देख पाएंगे। मैंने इसे संपादित कर लिया है और इसे अभी बाहर ले जाया है। –

उत्तर

10

** एक पॉइंटर के लिए केवल एक सूचक है। तो जहां instruction* में instruction संरचना का पता है, instruction** में instruction* का पता है जिसमें instruction ऑब्जेक्ट का पता है।

instruction तक पहुंचने के लिए instruction** द्वारा इंगित पॉइंटर द्वारा इंगित किया गया है, तो आप (**p).repetitions या कुछ समान की तरह केवल दो तारों का उपयोग करें।

आप इस तरह यह कल्पना कर सकते हैं:

instruction* ----> instruction 
instruction** ----> instruction* ----> instruction 

याद रखें, हालांकि, कि बस struct instruction** instructions; की घोषणा वास्तव में एक instruction struct नहीं बनाता है। यह सिर्फ एक सूचक बनाता है जिसमें कचरा मूल्य होता है। आप इसे प्रारंभ करना होगा:

struct instruction inst; 
// set members of inst... 
*instructions = &inst; 

... 

(*instructions)->repetitions++; // or whatever 

हालांकि, यह लगता है कि आप instruction* रों की एक सरणी को इंगित करने के लिए एक instruction** उपयोग कर रहे हैं। सरणी को प्रारंभ करने के लिए, आप एक for पाश की जरूरत है:

instructions = malloc(sizeof(struct instruction*) * num_of_arrays); 
for (i = 0; i < num_of_arrays; ++i) 
    instructions[i] = malloc(sizeof(struct instruction) * size_of_each_subarray); 

और फिर आप instructions[i]->datamember की तरह एक तत्व पहुँच सकते हैं।

+0

लेकिन कहें कि मैं संरचना काउंटर * काउंटर का उपयोग करता हूं और एक सरणी बना देता हूं। जब मैं तत्वों तक पहुंचता हूं, काउंटर [i] -> काउंटर ..... क्या वही बात नहीं है?! लेकिन काउंटर * नहीं हैं – Jono

+0

@ जोनो, यदि आप 'स्ट्रक्चर काउंटर * काउंटर' कहते हैं, जो 'काउंटर' के लिए पॉइंटर बनाता है। किसी तत्व को एक्सेस करने के लिए, आप 'काउंटर [i] .something' करते हैं। काउंटर [i] 'आपको' काउंटर 'देता है। हालांकि, यदि आप 'काउंटर काउंटर ** काउंटर' करते हैं, तो आपको 'काउंटर [i] -> कुछ' करना होगा, '' 'के बजाय' -> 'पर ध्यान दें।इस मामले में, 'काउंटर [i] 'आपको' काउंटर 'पर _pointer_ देता है, न कि वास्तविक' काउंटर '। –

1

struct instruction **instructions; // How does this actually works ? I am having trouble with ** pointers

मुझे यकीन है कि क्या असली मुद्दा है नहीं कर रहा हूँ, लेकिन मैं सवाल का जवाब देने की कोशिश करेंगे।

डबल पॉइंटर पॉइंटर के लिए एक सूचक है। उदाहरण के लिए पॉइंटर्स की सरणी के रूप में मुकदमा चलाया जा सकता है (यदि आप तदनुसार स्मृति आवंटित करते हैं)। उदाहरण के लिए:

instructions = malloc(5*sizeof(struct instruction*)); 
for (int i = 0; i < 5; i++) 
    instructions[i] = malloc(sizeof(struct instruction)); 

और आप अपने आप को 5 संकेत का अच्छा सरणी struct instruction का मौका मिला। इस तरह यह प्रयोग करें:

instructions[0]->repetitions = 0; 
0

instructionsstruct instruction के लिए सूचक के लिए सूचक है।

इसका मतलब है कि *instructions आपको struct instruction पर पॉइंटर देगा। इस तरह के निर्माण का उपयोग अक्सर कुछ यौगिक प्रकार के पॉइंटर्स की गतिशील सरणी बनाने के लिए किया जाता है।

संबंधित मुद्दे