2012-02-04 23 views
6

स्टैनफोर्ड Programming Abstractions पाठ्यक्रम के माध्यम से सुन, वहीं मैं कोड के कुछ टुकड़े कि निम्नलिखित की तरह दिखता है के पार चलो।समारोह

void plot(double start, double end, double (fn)(double)) { 
    double i; 
    for (i = start; i <= end; i += 1) 
     printf("fn(%f) = %f\n", i, fn(i)); 
} 

double plus1(double x) { 
    return x + 1; 
} 

int main(void) { 
    plot(1, 10, plus1); 
    return 0; 
} 

मैंने जीसीसी का उपयोग करके अपने सिस्टम पर कोड संकलित किया, फिर जी ++; वे दोनों पूरी तरह से चलाते हैं।

मुझे पता है कि एक समारोह के रूप में void func1(int a) में एक int i = 2 गुजर जबकि void func2(int *a) को &i गुजर केवल समारोह func2i का पता दे देंगे कि समारोह के लिए कि i की एक नई प्रतिलिपि कर देगा।

तो क्या कोई मुझे बता सकता है कि fn से plot पास करने के लिए तंत्र क्या है और यह फ़ंक्शन पॉइंटर को पैरामीटर के रूप में पास करने से अलग कैसे है?

उत्तर

7

इसमें void foo(double fn(double)) और void foo(double (*fn)(double)) बीच कोई अंतर नहीं है। दोनों फ़ंक्शन घोषित करते हैं जो पैरामीटर के रूप में फ़ंक्शन में पॉइंटर लेते हैं।

यह कैसे वहाँ void bar(double arr[10]) और void bar(double* arr) बीच कोई अंतर नहीं के समान है।

+0

आप अपने दूसरे सरणियों के विषय में दावे के लिए एक संदर्भ है? खासकर जब यह सी ++ है? – krlmlr

+0

पूर्व में थोड़ा अंतर है, नहीं है, 'fn' implcitly कार्य करने के लिए एक सूचक है, और बाद' fn' में स्पष्ट रूप से कार्य करने के लिए –

+3

@ user946850 सूचक घोषित किया जाता है: '§8.3.5/5': ... के बाद प्रत्येक पैरामीटर के प्रकार का निर्धारण, प्रकार "टी की सरणी" या "फ़ंक्शन रिटर्निंग टी" के किसी भी पैरामीटर को क्रमशः "टी को पॉइंटर" या "टर्निंग फ़ंक्शन टू टी के लिए सूचक" के रूप में समायोजित किया जाता है। ... – Mankarse

0

अपनी गलती के लिए खेद है।

void foo(int (fn)(int)){} 
void bar(int (*fn)(int)){} 

इस तरह कोड ऊपर संकलन:

जीसीसी एस sample.c

तुम वहाँ कोई अंतर नहीं है कि मिल जाएगा। बस अलग कोडिंग शैली।

आप संकलन और चलाने के लिए इस कोड के साथ-साथ की कोशिश कर सकते हैं:

#include <stdio.h> 
void foo(int (fn)(int)) 
{ 
    printf("foo: %x.\n",fn); 
} 
void bar(int (*fn)(int)) 
{ 
    printf("bar: %x.\n",fn); 
} 
int main(int argc) 
{ 
    foo(main); 
    bar(main); 
    return 0; 
} 
+0

कृपया मेरा प्रश्न फिर से पढ़ें। मैंने एक पैरामीटर सूची में फ़ंक्शन पॉइंटर के बीच अंतर को पैरामीटर सूची में फ़ंक्शन प्रोटोटाइप बनाम के लिए कहा। – MrOrdinaire

+0

मेरी गलती। मैंने एक नया जवाब लिखा। – for1096

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