2015-10-14 11 views
5

नीचे कोड स्निपेट है। मैं जानना चाहता हूं कि line no. 17 टाइपकास्टिंग सी में वैध और उचित है या नहीं?पॉइंटर को एक सरणी में पॉइंटर पर

#include <stdio.h> 

typedef int twoInts[2]; 

void print(twoInts *twoIntsPtr); 
void intermediate (twoInts twoIntsAppearsByValue); 

int main() { 
    twoInts a; 
    a[0] = 0; 
    a[1] = 1; 
    print(&a); 
    intermediate(a); 
    return 0; 
} 
void intermediate(twoInts b) { 
    print((int(*)[])b); // <<< line no. 17 <<< 
} 

void print(twoInts *c){ 
    printf("%d\n%d\n", (*c)[0], (*c)[1]); 
} 
इसके अलावा

, जब मैं परिभाषा intermediate

void intermediate(twoInts b) { 
    print(&b); 
} 

को मैं चेतावनी नीचे हो रही है, जबकि संकलन और ओ/p उचित नहीं है बदल जाते हैं।

1.c:17:11: warning: passing argument 1 of print from incompatible pointer type 
    print(&b); 
     ^
1.c:5:6: note: expected int (*)[2] but argument is of type int ** 
void print(twoInts *twoIntsPtr); 

मेरी समझ के अनुसार, सरणी funtion बहस में pointer to int को खस्ताहाल है। सही कारण क्या है?

+3

मुझे बस इसे जोड़ने दें: 'शून्य प्रिंट (दो इंच * दो इंट्सपीआरटी);' 'शून्य प्रिंट (int (* twoIntsPtr) [2]); या दूसरे शब्दों में, सरणी को छिपाएं और typedefs के पीछे पॉइंटर्स। – this

+2

समस्या का सबसे अच्छा और उचित समाधान, वास्तव में किसी टाइपिफ़ के पीछे एक सरणी को छिपाना नहीं है। फिर आप प्रोग्राम को विस्मरण करने के लिए प्रोग्राम को खराब करने की आवश्यकता के बिना सादा 'int * 'पॉइंटर्स का उपयोग कर सकते हैं। – Lundin

+0

मैं कहूंगा कि 'प्रिंट ((दो इंच *) &b);' करना चाहिए। – alk

उत्तर

3

a एक सरणी है। तो जब आप इसे intermediate() पर पास करते हैं, तो इसे अपने पहले तत्व (उर्फ "सरणी क्षय") में एक सूचक में परिवर्तित कर दिया जाता है।

तो, b में:

void intermediate(twoInts b) { 
    print(&b); 
} 

टाइप int*, नहीं int[2] के रूप में आप की उम्मीद करने लग सकता है। इसलिए, &bint**int (*)[2] के बजाय print() फ़ंक्शन की अपेक्षा है। इसलिए, प्रकार मेल नहीं खाते हैं।

आप के लिए intermediate() को बदलते हैं:

void intermediate(twoInts *b) { 
    print(b); 
} 

तो आप और &b का पता पारित करने के लिए की जरूरत नहीं होगी यह उम्मीद के रूप में होगा और प्रकार के सही ढंग से मेल खाएगा।

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