2017-11-10 22 views
7

यदि मेरे पास दो सूचक चर हैं, ए और बी, "< बी" कथन का उपयोग करने का क्या अर्थ है? क्या ऐसा लगता है कि उनके स्मृति पते के मूल्यों की तुलना करना चाहिए? यदि हां, तो कंप्यूटर में मेमोरी पतों का क्रम क्या होगा?संबंधपरक ऑपरेटरों का उपयोग कर पॉइंटर्स की तुलना करने का क्या अर्थ है?

+1

मुझे लगता है कि कुछ इस तरह बहुत भाषा विशिष्ट हो जाएगा। कुछ बेवकूफ मामलों में पॉइंटर्स शब्दशः (या जैसा व्यवहार किया जा सकता है) स्मृति स्थान हैं। अन्य मामलों में वे एक बहुत ही विशिष्ट प्रकार हैं, और ऑपरेटरों के पास विशिष्ट विशिष्ट व्यवहार होगा। – jdv

+0

संबंधित [यह देखते हुए कि पी एक सूचक है "p> nullptr" अच्छी तरह से गठित?] (Https://stackoverflow.com/q/26590267/1708801) –

+0

मेरा जवाब [यूआर होने के लिए एक सरणी के बाहर सूचक तुलना के लिए तर्क ] (https://stackoverflow.com/a/31151779/1708801) भी संबंधित है। –

उत्तर

6

सी और सी ++ में, रिलेशनल ऑपरेटरों का उपयोग करने वाले पॉइंटर्स की तुलना इस मामले में की जाती है, जहां आपके पास एक ही सरणी में दो पॉइंटर्स हैं और उनके रिश्तेदार ऑर्डरिंग देखना चाहते हैं (इस नियम का अपवाद है कि मैं थोड़ा सा उल्लेख करूंगा बिट)। उदाहरण के लिए, मान लें कि p और q सरणी arr के बीच में प्रत्येक बिंदु कहीं, जैसा कि यहाँ दिखाया:

  int arr[9]; 
      int* p = &arr[1]; 
      int* q = &arr[4]; 

    +-----+-----+-----+-----+-----+-----+-----+-----+-----+ 
arr |  |  |  |  |  |  |  |  |  | 
    +-----+-----+-----+-----+-----+-----+-----+-----+-----+ 
      ^    ^
      |     | 
      p     q 

इस मामले में, अभिव्यक्ति p < q पूछते हैं, "सरणी में सूचकांक है कि तुलना में कम पर p अंक सरणी में सूचकांक q अंक? " उपरोक्त संदर्भ में, जवाब "हां" है। यदि p और q उलट दिए गए थे, या यदि वे सटीक तत्व पर इंगित करते हैं, तो उत्तर "नहीं" होगा।

सी और सी ++ में भाषा मानकों का कहना है कि एक ही सरणी में इंगित करने वाले पॉइंटर्स की तुलना करने का परिणाम अनिर्धारित नहीं है, जो सहजता से समझ में आता है क्योंकि असंबद्ध वस्तुओं को यादृच्छिक रूप से स्मृति में बहुत यादृच्छिक रूप से बिखराया जा सकता है, या हो इस तरह से संबंधित है कि कार्यान्वयन-निर्भर है (क्या आपका ढेर ऊपर या नीचे बढ़ता है?)

इसका एक अपवाद यह है कि आपको किसी सूचक के तुलना में एक सूचक के एक पॉइंटर की तुलना करने की अनुमति है सरणी। उदाहरण के लिए, इस स्थापना पर एक नज़र डालें:

  int arr[9]; 
      int* p = &arr[1]; 
      int* q = &arr[9]; 

    +-----+-----+-----+-----+-----+-----+-----+-----+-----+ 
arr |  |  |  |  |  |  |  |  |  | 
    +-----+-----+-----+-----+-----+-----+-----+-----+-----+ 
      ^           ^
      |            | 
      p            q 

यहाँ, क्ष सरणी arr में इंगित नहीं करता है। हालांकि, भाषा की कल्पना आपको सुरक्षित रूप से पी और क्यू की तुलना करने की अनुमति देती है। यही कारण है कि, उदाहरण के लिए, आप सुरक्षित रूप से इस इटरेटर शैली पाश C++ का उपयोग कर सकते है:

for (int* itr = arr; itr != arr + /* arr's size */; itr++) { 
    ... 
} 
+0

जोड़ने के लिए: "... उस मामले में जहां आपके पास एक ही सरणी _or object_ में दो पॉइंटर्स हैं"। यह सरणी चर्चा एक ऑब्जेक्ट पर भी लागू होती है जैसे कि यह एक सरणी थी। 'some_type x;' 'और x + 1> और x' अच्छी तरह परिभाषित है। §6.5.8 4 – chux

+0

आप पॉइंटर्स की तुलना उसी समेकित ऑब्जेक्ट के सदस्यों से भी कर सकते हैं, उदाहरण के लिए, एक ऑब्जेक्ट में 'डबल बी' के सूचक के साथ एक स्ट्रक्चर ऑब्जेक्ट में 'int a' के लिए एक पॉइंटर। –

+0

@EricPostpischil मुझे नहीं पता था कि आप ऐसा कर सकते हैं। मुझे लगता है कि सख्त एलियासिंग उल्लंघनों से बचने के लिए आपको विभिन्न प्रकार की वस्तुओं में 'char *' पॉइंटर्स के कुछ स्वाद का उपयोग करने की आवश्यकता है? – templatetypedef

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