2011-03-26 7 views
7

कार्यक्रमउपयोग

#include<stdio.h> 
int main(){ 
    int *p[10]; 
    printf("%ld %ld\n",sizeof(*p),sizeof(p)); 
} 

निम्न में से उत्पादन

8 <--- sizeof(*p) gives size of single element in the array of int *p[10] 
80 <--- sizeof(p) gives size of whole array which is 10 * 8 in size. 

अब निम्नलिखित कार्यक्रम

#include<stdio.h> 
#define TOTAL_ELEMENTS (sizeof(array)/sizeof(array[0])) 
int array[] = {23,34,12,17,204,99,16}; 

    int main() 
    { 
     int d; 
     printf("sizeof(array) = %ld \n",sizeof(array)); 
     printf("sizeof(array[0]) = %ld \n",sizeof(array[0])); 
     printf("sizeof int %ld\n",sizeof(int)); 
     printf("TOTAL_ELEMENTS=%ld \n",TOTAL_ELEMENTS); 
     for(d=-1;d <= (TOTAL_ELEMENTS-2);d++) 
      printf("%d\n",array[d+1]); 

     return 0; 
    } 

देखना है

sizeof(array) = 28 
sizeof(array[0]) = 4 <--here 
sizeof int 4 
TOTAL_ELEMENTS=7 

जो मैं समझ नहीं पा रहा हूं वह आकार (सरणी [0]) दोनों आउटपुट में अलग क्यों है।

+2

मुझे लगता है कि एक एक 64 बिट मशीन, 32 बिट के लिए एक दूसरे के लिए संकलित किया गया है - बाइट्स

संभावना है कि आप AMD64 मशीन है कर रहे हैं। – groovingandi

+0

@groovingandi int में 64-बिट मशीनों पर भी 4 बाइट हैं –

+0

@ ग्रोविंगंडी नहीं, ये दोनों कार्यक्रम एक ही मशीन पर चल रहे थे। –

उत्तर

11

int *p[10]; पॉइंटर्स की एक श्रृंखला है।

*p पॉइंटर्स की उस सरणी का पहला तत्व है। तो यह एक पूर्णांक के लिए एक सूचक है। यह एक पूर्णांक नहीं है।

int array[] = {23,34,12,17,204,99,16}; पूर्णांक की एक सरणी है। तो array[0] उस सरणी का पहला तत्व है। तो यह एक पूर्णांक है।

एक पूर्णांक के लिए सूचक का आकार (*p) और एक पूर्णांक (array[0]) अलग हैं।

तो sizeof(*p) और sizeof(array[0]) अलग हैं।

sizeof(p) पॉइंटर्स की सरणी का आकार देता है। तो यह है: 10 x 8 = 80
अर्थात (तत्वों की संख्या) x

sizeof(array) (एक तत्व की आकार) पूर्णांकों की सरणी के आकार देता है। तो यह है: 7 x 4 = 28.

+0

* पी के बारे में समाशोधन के लिए धन्यवाद आकार (पी) का मूल्यांकन किया जा रहा है और सरणी के बारे में क्या है [0]? –

+0

@ पंजीकृत मैंने कुछ और जानकारी जोड़ा। देखें कि वे सहायक हैं या नहीं। –

+0

हाँ आपकी जानकारी में मदद मिली। यदि संभव हो तो इस जानकारी के लिए कुछ लिंक दें। –

1

पहले मामले में, आप संकेत int करने के लिए की एक सरणी बना लिया है, तो उनके आकार 8, नहीं 4.

3

पहले उदाहरण में है, तत्व, इंट के लिए सूचक है दूसरे में जबकि उदाहरण यह सिर्फ int है। आप देख सकते हैं कि पॉइंटर में 8 बाइट्स हैं, int केवल 4 बाइट्स हैं।

+0

लालिंस्की वास्तव में मैं इस अवधारणा को आसानी से समझने में सक्षम नहीं हूं, अगर मैं कुछ लिंक दे सकता हूं तो मैं कर्निंगन रिची को पढ़ और पढ़ सकता हूं अच्छा होगा। –

1

पहले उदाहरण में पॉइंटर का आकार उपयोग किया जाता है और दूसरे में पूर्णांक का आकार होता है। उनके पास विशेष रूप से 64 बिट सिस्टम पर विभिन्न आकार हो सकते हैं।

1

array[0] टाइप int

*p टाइप int*

यह शायद

int *p[10] ; 
बजाय

लिखने की शैलीगत मूर्खता दर्शाता है है
int* p[10] ; 

जहां दूसरा यह स्पष्ट करता है कि int * घोषित किया जा रहा सरणी का प्रकार है।

+0

आकार के बारे में कुछ उपयोगी जानकारी है I आज तक कभी नहीं आया * आज तक मैंने हमेशा int * p का उपयोग किया है, क्या आप मुझे कुछ दे सकते हैं आपने जो कहा उससे लिंक? –

+0

@ पंजीकृत उपयोगकर्ता: वे वाक्य रचनात्मक रूप से समान हैं, जैसा कि मैंने बताया है कि यह एक स्टाइलिस्ट पसंद है। हालांकि 'int *' डेटा प्रकार का वर्णन करता है, इसलिए पहचानकर्ता 'पी' के बजाए प्रकार के संशोधक '*' को इसके मूल प्रकार' int' में cuddling करके स्पष्ट करना समझ में आता है - यह पहचानकर्ता का हिस्सा नहीं है। – Clifford

+0

@ पंजीकृत: पीएस: बहुत से लोग मुझसे असहमत होंगे, लेकिन यह शैली यहां बजेर्न स्ट्रॉस्ट्रप द्वारा उदाहरणबद्ध है: http://www2.research.att.com/~bs/bs_faq2.html (मुझे पता है कि सी ++ है, लेकिन यह शैली पसंद सी पर भी लागू होता है)। – Clifford

0

64-बिट वातावरण सेट 32 बिट और लंबी और सूचक को 64 बिट्स .. करने के लिए int

* p एक सूचक है - 8 बाइट्स
sizeof (पी) 10 संकेत के -is आकार - तो 80 (अन्य विकल्प भी शामिल है) जानकारी के लिए इस जाँच http://gcc.gnu.org/onlinedocs/gcc/i386-and-x86_002d64-Options.html