2012-03-21 20 views
15

जहां तक ​​मुझे डेटा प्रकार के बारे में पता है, एक चर घोषित करते समय, हमें इसके डेटा प्रकार की घोषणा करने की आवश्यकता है, जो संकलक को तदनुसार स्मृति में बाइट्स की संख्या आरक्षित करने के लिए कहता है।पॉइंटर घोषणा में डेटा प्रकार की आवश्यकता क्यों है?

लेकिन संकेत के मामले में, हम जानते हैं कि उनके आकार 2 बाइट्स की हमेशा होता है (टर्बो संकलक में) हमेशा चर यह इशारा कर रही है की डेटा प्रकार पर ध्यान दिए बिना।

मेरा प्रश्न है, तो समय उन्हें घोषित डेटा प्रकार उल्लेख की जरूरत क्या है अगर संकेत हमेशा 2 बाइट्स ले, है? या पॉइंटर्स के बारे में मेरी समझ गलत है?

+1

डेटा प्रकार निर्दिष्ट नहीं * * बिंदु क्या है? यदि आप पॉइंटर के साथ कुछ भी करने की योजना बना रहे हैं, तो आपको उस डेटा प्रकार को जानना होगा जो इसे इंगित करता है। – tenfour

+0

@ कंधरा: किस बारे में (शून्य *)? – Malkocoglu

उत्तर

24

पॉइंटर को डिफ्रेंस करते समय डेटा प्रकार की आवश्यकता होती है, इसलिए यह जानता है कि इसे कितना डेटा पढ़ना चाहिए। उदाहरण के लिए एक चार सूचक को संदर्भित करने से एड्रेस से अगला बाइट पढ़ना चाहिए, यह इंगित कर रहा है कि एक इंट पॉइंटर को 2 बाइट्स पढ़ना चाहिए।

+0

यह एक अच्छा जवाब है! मैं अंततः समझ गया है कि। – Jeyekomon

+0

सरल अभी तक सहज ज्ञान युक्त स्पष्टीकरण। –

5

पॉइंटर्स के सभी आकार और प्रतिनिधित्व के पहले aren't always the same for different types। यह कुछ ऐसा है जो कई कार्यान्वयन पर होता है।

दूसरा, पॉइंटर्स का उपयोग करते समय आपको पॉइंटर्स के आकार की परवाह नहीं है। आपको की ओर इशारा करते हुए का आकार चाहिए।

उदाहरण के लिए, इस प्रयास करें:

int var[5]; 
char *c = (char *)var; 
int *x = var; 

printf("%p\n%p\n", p + 1, x + 1); 

आप देखेंगे सूचक अंकगणित दृढ़ता से उठाई प्रकार के आकार पर निर्भर करता है।

5

समस्या पॉइंटर आकार के बारे में नहीं है लेकिन पॉइंटर डीरफ्रेंसिंग है। (सी या सी में मौसम ++)

आप कहते हैं:

int* someint; 
float* somefloat; 

*someint संदर्भ sizeof(int) की स्मृति आकार, जबकि *somefloat संदर्भ जो अलग हैं sizeof(float) की स्मृति आकार।

1

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

पॉइंटर्स के लिए डेटा प्रकार की आवश्यकता क्यों है क्योंकि संकलक को पता होना चाहिए कि स्मृति कक्ष का आकार दूसरों के बीच क्या है, सूचक इंगित कर रहा है। इसके अलावा सुरक्षा टाइप करें w/o प्रकार को सुनिश्चित नहीं किया जा सकता है। इसके अलावा, पॉइंटर से संरचनाओं तक पहुंचने पर आपको प्रत्येक पॉइंटर टाइप करना होगा।

आप void पॉइंटर का उपयोग भी कर सकते हैं और सबकुछ हाथ से कर सकते हैं। लेकिन आपको यह क्यों चाहिए?

0

यह सी ++ में उपयोग की जाने वाली एक मजबूत टाइपिंग की अवधारणा है। सूचक का आकार समान हो सकता है लेकिन बिंदु प्रकार का आकार भिन्न हो सकता है। आप हमेशा एक प्रकार के सूचक को किसी अन्य प्रकार के सूचक में डाल सकते हैं।

1

मान लें कि इस कोड को त्रुटि के बिना संकलित (के रूप में आप चाहते हैं):

int a; 
int b = 42; 
void * d = &b; 

a = *d; 

एक का मूल्य क्या होना चाहिए?

इस एक साथ

अब:

int a; 
float b = 42.0; 
void * d = &b; 

a = *d; 

आप एक में क्या उम्मीद करते हैं?

दरअसल प्रकार निर्दिष्ट करता है कि बिंदु क्षेत्र को कैसे समझाया जाना चाहिए। आपको पहले उदाहरण में int * और void * की बजाय दूसरे में float * निर्दिष्ट करना चाहिए। एक सूचक की

+0

क्या आप इस उदाहरण के सैद्धांतिक पुनर्विक्रय दिखा सकते हैं? – Hoto

4

डेटा प्रकार दो स्थितियों में की जरूरत है:

  1. सूचक Deferencing
  2. सूचक अंकगणित

यह कैसे सूचक अपसंदर्भन में प्रयोग किया जाता है?

{ 
     char *k; //poniter of type char 
     short j=256; 
     k=&j; // Obviously You have to ignore the warnings 
     printf("%d",*k) 
    } 

अब क्योंकि कश्मीर प्रकार char की है, इसलिए यह केवल एक बाइट पढ़ा जाएगा:
निम्न उदाहरण पर विचार करें। अब 256 की बाइनरी मान 0000000100000000 है लेकिन क्योंकि कश्मीर प्रकार char की है, इसलिए यह केवल पहली बाइट पढ़ा जाएगा इसलिए उत्पादन किया जाएगा 0.
नोट: यदि हम जे आवंटित = 127 तो उत्पादन होगा 127 क्योंकि 127 पकड़ लिया जाएगा पहले बाइट द्वारा।

अब सूचक अंकगणित के लिए आते हैं:
निम्न उदाहरण पर विचार करें:

{ 
     short *ptr; 
     short k=0; 
     ptr=&k; 
     k++; 
     ptr++;// pointer arithmetic 
    } 

बयान k++ हैं और ptr++ एक ही बात कर रहे हैं? नहीं, k++ का अर्थ है k=k+1 और ptr++ का अर्थ ptr=ptr+2 है। चूंकि संकलक "जानता है" यह एक सूचक है और यह एक छोटा सा इंगित करता है, यह 1 के बजाय 2 से पीआरटी जोड़ता है, इसलिए पॉइंटर अगले पूर्णांक को "इंगित करता है"।

अधिक जानकारी के लिए this ट्यूटोरियल का दूसरा अध्याय देखें।

1

टाइप प्रकार की जांच के लिए डेटा प्रकारों की आवश्यकता है।

+0

सामान्य रूप से, उन उत्तरों को देने का प्रयास करें जो थोड़ा अधिक महत्वपूर्ण हैं। शायद एक उदाहरण शामिल करने का प्रयास करें? – Nathan

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