दिलचस्प पोस्ट
मैं StackOverflowException को कैसे रोका और / या संभालता हूं? मीडियास्ट्रीम कैनवास कैद और ऑडियो को एक साथ एसक्यूएल – समूह में उपनाम का उपयोग करके सीएसएस वर्ग के साथ, बिना स्पष्ट शैली के jQuery.animate () हैशसेट और हैशमप के बीच का अंतर? एसईसीएल क्वेरी से वेतन तालिका से नौवीं सबसे ज्यादा वेतन मिलता है कमांड प्रॉम्प्ट में जार फ़ाइल चलाएं सभी वेब ब्राउज़र में TIFF छवि प्रदर्शित करें UIWebView में उपयोगकर्ता एजेंट बदलें (iPhone SDK) Xpath को XmlNode इंस्टेंस से कैसे प्राप्त करें jQuery: मैं कैसे एक div रोटेशन चेतन करते हैं? किसी लिंक सूची में एक पाश को कैसे पता लगा सकता है? किसी फ़ाइल को पढ़ने के दौरान स्क्रिप्ट के लिए दूसरी स्क्रिप्ट को छोड़ देता है क्या आपने कभी किसी भी प्रोजेक्ट में फँटम रिफरेंस का उपयोग किया है? Android में थ्रेडिंग उदाहरण

अब तक पॉइंटर्स और निकट पॉइंटर्स के बीच अंतर क्या है?

क्या कोई मुझे सी में far पॉइंटर्स और near पॉइंटर्स के बीच अंतर बता सकता है?

वेब के समाधान से एकत्रित समाधान "अब तक पॉइंटर्स और निकट पॉइंटर्स के बीच अंतर क्या है?"

16-बिट x86 खंड वाले मेमोरी आर्किटेक्चर पर, चार रजिस्टरों का उपयोग संबंधित सेगमेंट के लिए किया जाता है:

  • डीएस → डेटा सेगमेंट
  • सीएस → कोड सेगमेंट
  • एसएस → स्टैक सेगमेंट
  • ES → अतिरिक्त खंड

इस वास्तुकला पर एक तार्किक पता segment:offset लिखा गया segment:offset । अब सवाल का जवाब देने के लिए:

  • पॉइंटर्स के पास वर्तमान सेगमेंट को (ऑफ़सेट के रूप में) देखें।

  • सुदूर संकेतक खंडों को इंगित करने के लिए सेगमेंट की जानकारी और ऑफसेट का उपयोग करते हैं इसलिए, उन्हें इस्तेमाल करने के लिए, डीएस या सीएस को निर्दिष्ट मान में बदला जाना चाहिए, स्मृति को हटा दिया जाएगा और फिर डीएस / सीएस के मूल मूल्य को बहाल किया जाएगा। ध्यान दें कि उनके पर सूचक अंकगणित सूचक के सेगमेंट भाग को संशोधित नहीं करता है, इस प्रकार ओफ़्सेट को ओवरफ्लोइंग केवल चारों ओर लपेटता है

  • और फिर विशाल संकेत दिए गए हैं, जो किसी दिए गए पते के लिए उच्चतम संभव खंड (सामान्यतया दूर बिंदुओं के विपरीत) के सामान्य हैं।

32-बिट और 64-बिट आर्किटेक्चर पर, मेमोरी मॉडल अलग से खंडों का उपयोग कर रहे हैं, या बिल्कुल भी नहीं।

पुराने और निकट पॉइंटर्स का इस्तेमाल पुराने प्लेटफार्मों में किया गया था जैसे डॉस

मुझे नहीं लगता कि वे आधुनिक प्लेटफॉर्म में प्रासंगिक हैं। लेकिन आप यहां और यहां उनके बारे में सीख सकते हैं (जैसा कि अन्य उत्तर के अनुसार बताया गया है)। असल में, एक दूर सूचक एक कंप्यूटर में पता मेमोरी का विस्तार करने का एक तरीका है। IE, एक 16bit मंच में 64k स्मृति से अधिक पते

चूंकि कोई भी डॉस का उल्लेख नहीं करता है, इसलिए पुराने डीओएस पीसी कंप्यूटरों के बारे में भूल जाएं और इसे सामान्य बिंदु-दृश्य से देखें। फिर, बहुत सरल, यह इस तरह चला जाता है:


किसी भी सीपीयू में डेटा बस है, जो कि अधिकतम एकमात्र अनुदेश में प्रोसेस कर सकता है, अर्थात इसकी रजिस्टरों के आकार के बराबर है। डेटा बस की चौड़ाई बिट्स में व्यक्त की गई है: 8 बिट्स, या 16 बिट्स, या 64 बिट्स आदि। यह वह जगह है जहां शब्द "64 बिट सीपीयू" से आता है – यह डेटा बस को संदर्भित करता है

किसी भी सीपीयू में एक पता बस है, बिट्स में एक निश्चित बस की चौड़ाई भी है। आपके कंप्यूटर में किसी भी मेमोरी सेल में सीपीयू का उपयोग सीधे एक अनूठा पता हो सकता है। पता बस आपके पास सभी संबोधित स्मृति को कवर करने के लिए काफी बड़ी है।

उदाहरण के लिए, यदि एक कंप्यूटर में 6500036 बाइट्स एड्रेस मेमोरी हैं, तो आप इन्हें 16 बिट एड्रेस बस के साथ कवर कर सकते हैं, 2 ^ 16 = 65536।

अक्सर, लेकिन हमेशा नहीं, डेटा बस की चौड़ाई पता बस चौड़ाई के बराबर होती है यह अच्छा है यदि वे एक ही आकार के हैं, क्योंकि यह दोनों CPU निर्देश सेट और इसके लिए लिखे गए कार्यक्रमों को स्पष्ट करता है। अगर सीपीयू को किसी पते की गणना करने की आवश्यकता होती है, तो यह सुविधाजनक है कि वह पता छोटा होने पर सीपीयू रजिस्टरों के भीतर फिट हो जाता है (अक्सर एड्रेस रजिस्टर में कहा जाता है)।

गैर मानक कुंजीशब्दों के near और near उन सिस्टम पर पॉइंटर्स का वर्णन करने के लिए उपयोग किया जाता है जहां आपको सामान्य सीपीयू एड्रेस बस चौड़ाई से परे स्मृति को संबोधित करने की आवश्यकता होती है।

उदाहरण के लिए, यह एक 16 बिट डेटा बस के साथ सीपीयू के लिए सुविधाजनक हो सकता है जिसमें 16 बिट एड्रेस बस भी हो। लेकिन एक ही कंप्यूटर को 2 ^ 16 = 65536 बाइट्स = 64kb पता योग्य मेमोरी की आवश्यकता हो सकती है।

तब सीपीयू में विशेष रूप से विशेष निर्देश होंगे (जो थोड़ी धीमी हैं) जो कि 64kb से परे स्मृति को संबोधित करने की अनुमति देता है उदाहरण के लिए, सीपीयू अपनी बड़ी मेमोरी को n पेजों में विभाजित कर सकता है (जिसे कभी-कभी बैंक , सेगमेंट्स और अन्य ऐसी शर्तें भी कहा जाता है, जिसका मतलब एक सीपीयू से दूसरे में अलग बात हो सकता है), जहां प्रत्येक पृष्ठ 64kb है इसके बाद एक विस्तारित स्मृति को संबोधित करने से पहले एक "पेज" रजिस्टर होगा, जिसे पहले सेट करना होगा। इसी तरह, विस्तारित मेमोरी में उप दिनचर्या से फोन / आने पर विशेष निर्देश दिए जाएंगे।

सी कम्पाइलर के लिए सही सीपीयू निर्देश उत्पन्न करने के लिए, जब इस तरह की विस्तारित स्मृति से निपटने के लिए, नॉन-मानक near और far कीवर्ड का आविष्कार किया गया। गैर मानक के रूप में वे सी मानक द्वारा निर्दिष्ट नहीं हैं, लेकिन वे वास्तव में उद्योग मानक हैं और लगभग हर संकलक उन्हें कुछ तरीके से समर्थन करता है।

far विस्तारित मेमोरी में स्थित मेमोरी को संबोधित करता है, पता बस की चौड़ाई से परे। चूंकि यह पतों को संदर्भित करता है, इसलिए अक्सर जब आप पॉइंटर्स घोषित करते हैं तो इसका इस्तेमाल करते हैं। उदाहरण के लिए: int * far x; का अर्थ है "मुझे एक संकेतक दें जो विस्तारित स्मृति को इंगित करता है"। और संकलक को तब पता चल जाएगा कि ऐसी मेमोरी तक पहुंचने के लिए आवश्यक विशेष निर्देशों को उत्पन्न करना चाहिए। इसी तरह, फ़ंक्शन पॉइंटर्स जो far का उपयोग करते हैं, विस्तारित स्मृति से / वापस आने के लिए विशेष निर्देश उत्पन्न करेंगे। यदि आप far उपयोग नहीं करते far तो आपको सामान्य, पता योग्य मेमोरी के लिए एक सूचक मिलेगा, और आप पूरी तरह से कुछ पर इंगित करना समाप्त करेंगे।

near मुख्य रूप से far साथ स्थिरता के लिए शामिल है; यह संबोधित मेमोरी में कुछ भी संदर्भित करता है जैसे कि एक नियमित सूचक के बराबर है। तो यह मुख्य रूप से एक बेकार कीवर्ड है, कुछ दुर्लभ मामलों को बचाने के लिए, जहां आप यह सुनिश्चित करना चाहते हैं कि कोड मानक एड्रेस मेमोरी के अंदर रखा गया है फिर आप स्पष्ट रूप से कुछ के near रूप में लेबल कर सकते हैं। सबसे विशिष्ट मामला कम-स्तरीय हार्डवेयर प्रोग्रामिंग है, जहां आप इंटरप्ट सर्विस रूटीन लिखते हैं। उन्हें एक निश्चित चौड़ाई के साथ एक इंटरप्ट वेक्टर से हार्डवेयर से कहा जाता है, जो पता बस चौड़ाई के समान है। जिसका अर्थ है कि इंटरप्ट सेवा दिनचर्या मानक पते मेमोरी में होना चाहिए।


far और near का सबसे प्रसिद्ध प्रयोग शायद उल्लेख किया गया पुराने एमएस डॉस पीसी है, जिसे आजकल काफी प्राचीन माना जाता है और इसलिए हल्के ब्याज

लेकिन ये कीवर्ड अधिक आधुनिक सीपीयू पर मौजूद हैं! विशेष रूप से एम्बेडेड सिस्टम में जहां वे बाजार पर हर 8 और 16 बिट माइक्रोकंट्रोलर परिवार के लिए मौजूद होते हैं, क्योंकि उन माइक्रोकंट्रोलर्स की आम तौर पर 16 बिट की एक पता बस की चौड़ाई है, लेकिन कभी-कभी 64kb से अधिक स्मृति

जब भी आपके पास एक सीपीयू होता है जहां आपको पता बस चौड़ाई से परे मेमोरी को संबोधित करने की आवश्यकता होती है, तो आपको far और near की आवश्यकता होगी। आम तौर पर, इस तरह के समाधानों पर भले ही सताया जाता है, क्योंकि यह उन पर कार्यक्रम के लिए काफी दर्द है और हमेशा खाते में विस्तारित मेमोरी लेता है।

मुख्य कारणों में से एक 64 बिट पीसी को विकसित करने के लिए एक धक्का था, वास्तव में 32 बिट पीसी उस बिंदु पर आये थे जहां उनका मेमोरी उपयोग पता बस सीमा को मारना शुरू कर रहा था: वे केवल 4 जीबी रैम को ही संबोधित कर सकते थे। 2 ^ 32 = 4,29 अरब बाइट्स = 4 जीबी अधिक रैम के उपयोग को सक्षम करने के लिए, विकल्प तब या तो कुछ बोझ बढ़ाए गए मेमोरी समाधान जैसे डॉस दिनों में, या 64 बिट तक कंप्यूटर को विस्तार करने के लिए, उनका पता बस सहित, का विस्तार करने के लिए किया गया।

एक सूचक मूल रूप से पते रखता है जैसा कि हम सभी जानते हैं, इंटेल मेमोरी प्रबंधन को 4 सेगमेंट में विभाजित किया गया है। इसलिए जब किसी सूचक को इंगित किया जाता है तो उसी खंड के भीतर होता है, तो यह पास पॉइंटर है और इसलिए ऑफसेट के लिए केवल 2 बाइट्स की आवश्यकता होती है। दूसरी ओर, जब कोई संकेतक किसी ऐसे पते को इंगित करता है जो खंड से बाहर है (जिसका अर्थ दूसरे खंड में है), तो वह सूचक एक दूर सूचक है इसमें 4 बाइट्स शामिल हैं: दो खंड के लिए और ऑफसेट के लिए दो।

चार रजिस्टरों का इस्तेमाल 16-बिट x86 खंड वाले स्मृति वास्तुकला पर चार खंडों के लिए किया जाता है। डीएस (डेटा सेगमेंट), सीएस (कोड सेगमेंट), एसएस (स्टैक सेगमेंट), और ईएस (अतिरिक्त सेगमेंट)। इस मंच पर एक तार्किक पता खंड लिखा है: ऑफसेट, हेक्साडेसिमल में

पॉइंटर्स के पास वर्तमान सेगमेंट को (ऑफ़सेट के रूप में) देखें।

सुदूर संकेतक खंडों को इंगित करने के लिए सेगमेंट की जानकारी और ऑफसेट का उपयोग करते हैं इसलिए, उन्हें इस्तेमाल करने के लिए, डीएस या सीएस को निर्दिष्ट मान में बदला जाना चाहिए, स्मृति को हटा दिया जाएगा और फिर डीएस / सीएस के मूल मूल्य को बहाल किया जाएगा। ध्यान दें कि उनके पर सूचक अंकगणित सूचक के सेगमेंट भाग को संशोधित नहीं करता है, इस प्रकार ओफ़्सेट को ओवरफ्लोइंग केवल चारों ओर लपेटता है

और फिर विशाल संकेत दिए गए हैं, जो किसी दिए गए पते के लिए उच्चतम संभव खंड (सामान्यतया दूर बिंदुओं के विपरीत) के सामान्य हैं।

32-बिट और 64-बिट आर्किटेक्चर पर, मेमोरी मॉडल अलग से खंडों का उपयोग कर रहे हैं, या बिल्कुल भी नहीं।

डॉस में अच्छी तरह से यह रजिस्टरों के साथ अजीब व्यवहार था। और सेगमेंट रैम की अधिकतम गिनती क्षमता के बारे में सब कुछ।

आज यह बहुत अप्रासंगिक है आप को पढ़ने की ज़रूरत है आभासी / उपयोगकर्ता स्थान और कर्नेल के बारे में अंतर।

एनटी 4 जीतने के बाद (जब वे * निकस के विचारों को चुराते हैं) माइक्रोसॉफ्ट प्रोग्रामर ने यूज़र / कर्नेल मेमोरी रिक्त स्थान कहा जाता था जो इस्तेमाल करना शुरू कर दिया था। और तब से भौतिक नियंत्रकों तक सीधी पहुंच से बचा नहीं। तब से स्मृति खंडों के लिए सीधी पहुंच के साथ-साथ एक समस्या को हल किया गया। – सब कुछ ओएस के माध्यम से आर / डब्ल्यू बन गया

हालांकि अगर आप दूर / पॉइंटर्स के समीप और समझने पर जोर देते हैं तो यह लिनक्स कर्नेल स्रोत को देखता है और यह कैसे काम करता है – आप नए रूप से वापस आ जाएंगे मुझे लगता है

और अगर आपको डीओएस में सीएस (कोड सेगमेंट) / डीएस (डेटा सेगमेंट) का उपयोग करने की आवश्यकता है इनको देखो:

https://en.wikipedia.org/wiki/Intel_Memory_Model http://www.digitalmars.com/ctg/ctgMemoryModel.html

मैं नीचे सही जवाब के लिए इंगित करना चाहूंगा .. लंदन से मैं ठीक से जवाब देने के लिए बहुत आलसी था। लुंडिन ने बहुत विस्तृत और समझदार स्पष्टीकरण "अंगूठे ऊपर" दिया!