2009-03-03 11 views
8

बस समझने की कोशिश कर रहा है कि तारों की सरणी में एक वर्ण को कैसे संबोधित किया जाए। इसके अलावा, यह निश्चित रूप से मुझे पॉइंटर्स को सामान्य रूप से पॉइंटर्स सबस्क्रिप्टिंग को समझने की अनुमति देगा। यदि मेरे पास char **a है और मैं दूसरी स्ट्रिंग के तीसरे अक्षर तक पहुंचना चाहता हूं, तो यह काम करता है: **((a+1)+2)? ऐसा लगता है कि इसे चाहिए ...मैं सी में तारों की सरणी से किसी व्यक्तिगत चरित्र को कैसे एक्सेस करूं?

उत्तर

19

लगभग, लेकिन काफी नहीं। सही जवाब है:

*((*(a+1))+2) 

क्योंकि आप पहली बार डी-संदर्भ वास्तविक स्ट्रिंग संकेत से एक के लिए और फिर आप को डी-संदर्भ के लिए करने के लिए है कि चयनित स्ट्रिंग वांछित चरित्र के लिए नीचे सूचक की जरूरत है। (ध्यान दें कि मैंने वहां संचालन के क्रम में स्पष्टता के लिए अतिरिक्त कोष्ठक जोड़ा है)।

वैकल्पिक रूप से, इस अभिव्यक्ति:

a[1][2] 

भी काम करेंगे .... और शायद चुना जाएगा, क्योंकि तुम क्या करने कोशिश कर रहे हैं के इरादे अधिक स्वयं स्पष्ट है और अंकन ही अधिक संक्षिप्त है! । यह फ़ॉर्म भाषा के लिए नए लोगों के लिए तत्काल स्पष्ट नहीं हो सकता है, लेकिन समझते हैं कि सरणी नोटेशन काम करने का कारण है क्योंकि सी में, एक सरणी इंडेक्सिंग ऑपरेशन वास्तव में समकक्ष सूचक ऑपरेशन के लिए केवल लघुरूप है। यानी: * (ए + एक्स) एक [x] के समान है। इसलिए, मूल तर्क पर उस तर्क को विस्तारित करके, दो अलग-अलग सूचक डी-रेफरेंसिंग ऑपरेशंस एक साथ कैस्केड किए जाते हैं जिससे अभिव्यक्ति एक [x] [y] * ((* (ए + एक्स)) के सामान्य रूप के बराबर होती है + वाई)।

+0

तो पॉइंटर्स को पॉइंटर्स किसी भी प्रकार की अन्य घोषणा के बिना सरणी के रूप में उपयोग किया जा सकता है? – sdellysse

+0

यदि आप समझाते हैं तो मैं +1 करूंगा। दृश्यों के पीछे –

+0

, एक [बी] * (ए + बी) –

1

a[1][2] आज़माएं। या *(*(a+1)+2)

असल में, सरणी संदर्भ पॉइंटर डीरफ्रेंसिंग के लिए वाक्य रचनात्मक चीनी हैं। एक [2] एक + 2 जैसा ही है, और 2 [ए] के समान है (यदि आप वास्तव में अपठनीय कोड चाहते हैं)। तारों की एक सरणी एक डबल सूचक के समान है। तो आप या तो [1] या *(a+1) का उपयोग कर दूसरी स्ट्रिंग निकाल सकते हैं। फिर आप उस स्ट्रिंग में तीसरा अक्षर पा सकते हैं (इसे अब 'बी' कहते हैं) या तो बी [2] या *(b + 2) के साथ। 'बी' के लिए मूल दूसरी स्ट्रिंग को प्रतिस्थापित करना, हम या तो [1] [2] या *(*(a+1)+2) के साथ समाप्त होते हैं।

2

IIRC, एक स्ट्रिंग वास्तव में वर्ण की एक सरणी है, इसलिए इस काम करना चाहिए:

a[1][2] 
3

आप संकेत का उपयोग करने की जरूरत नहीं है।

पूर्णांक मुख्य (int argc, char ** argv) {

printf (" [1] argv के तीसरे चरित्र है। [% ग] \ n", argv [1] [2 ]);

}

फिर

:

$ ./main हैलो [1] argv के तीसरे चरित्र [l] है।

यह एक और एक है।

यदि आप चाहें तो पॉइंटर्स का उपयोग कर सकते हैं ...

* (argv [1] +2)

या कोई भी

* ((* (एक + 1)) + 2)

के रूप में ऊपर की ओर इशारा किया।

ऐसा इसलिए है क्योंकि सरणी नाम पॉइंटर्स हैं।

+0

लटकन: argv [1] [3] अगर argv के चौथे चरित्र [1] ... – dmckee

+0

हाँ। मैंने बस इसे बदल दिया। मुझे जल्दी से पोस्ट करने का प्रयास करने के लिए मिलता है, और मेरी सबस्क्रिप्ट्स की जांच नहीं करता है। –

2

सी संकेत पर विकिपीडिया article से उद्धरण -

सी में, सरणी अनुक्रमण औपचारिक रूप से सूचक अंकगणित के संदर्भ में परिभाषित किया गया है; यानी, भाषा विनिर्देश की आवश्यकता है कि सरणी [i] * (सरणी + i) के बराबर हो। इस प्रकार सी में, सरणी को स्मृति के लगातार क्षेत्रों (बिना किसी अंतराल के) के संकेतक के रूप में माना जा सकता है, और सरणी तक पहुंचने के लिए वाक्यविन्यास समान है, जिसका उपयोग पॉइंटर्स को अव्यवस्थित करने के लिए किया जा सकता है। उदाहरण के लिए, एक सरणी घोषित किया जा सकता है और निम्नलिखित तरीके से इस्तेमाल किया:

int array[5];  /* Declares 5 contiguous (per Plauger Standard C 1992) integers */ 
int *ptr = array; /* Arrays can be used as pointers */ 
ptr[0] = 1;  /* Pointers can be indexed with array syntax */ 
*(array + 1) = 2; /* Arrays can be dereferenced with pointer syntax */ 

तो, आपके सवाल के जवाब में - हाँ, संकेत की ओर इशारा एक सरणी के रूप में अन्य घोषणा के किसी भी प्रकार के बिना किया जा सकता है सब!

1

जॉन एरिक्सन द्वारा शोषण द्वितीय संस्करण के हैकिंग द आर्ट ऑफ़ द बुक में एक शानदार सी प्रोग्रामिंग स्पष्टीकरण है जो पॉइंटर्स, स्ट्रिंग्स, प्रोग्रामिंग स्पष्टीकरण अनुभाग के लिए अकेले उल्लेख करने के बारे में चर्चा करता है https://leaksource.files.wordpress.com/ 2014/08/हैकिंग अत्याधुनिक के- exploitation.pdf।

हालांकि प्रश्न का उत्तर पहले ही दिया जा चुका है, लेकिन कोई और जानना चाहता है, तो एरिक्सन पुस्तक से निम्नलिखित हाइलाइट्स को प्रश्न के पीछे कुछ संरचना को समझने के लिए उपयोगी हो सकता है।

हेडर

हैडर चर हेरफेर आप शायद का उपयोग करेगा के लिए उपलब्ध फ़ाइलों के उदाहरण।

stdio.h - http://www.cplusplus.com/reference/cstdio/

stdlib.h - http://www.cplusplus.com/reference/cstdlib/

स्ट्रिंग। h - http://www.cplusplus.com/reference/cstring/

limits.h - http://www.cplusplus.com/reference/climits/

कार्य

सामान्य प्रयोजन कार्यों के उदाहरण जो आप शायद उपयोग करेंगे।

malloc() - http://www.cplusplus.com/reference/cstdlib/malloc/

calloc() - http://www.cplusplus.com/reference/cstdlib/calloc/

strcpy() - http: //www.cplusplus।com/संदर्भ/cstring/strcpy/

मेमोरी

" एक संकलित कार्यक्रम की स्मृति पांच सेगमेंट में बांटा गया है:। पाठ, डेटा, बीएसएस, ढेर, और ढेर प्रत्येक खंड स्मृति का एक विशेष भाग का प्रतिनिधित्व करता है जिसे एक निश्चित उद्देश्य के लिए अलग किया जाता है। टेक्स्ट सेगमेंट को कभी-कभी कोड सेगमेंट भी कहा जाता है। यह वह जगह है जहां प्रोग्राम के एकत्रित मशीन भाषा निर्देश "स्थित हैं।

" इस सेगमेंट में निर्देश के निष्पादन अरेखीय, ऊपर उल्लिखित उच्च स्तरीय नियंत्रण संरचनाओं और काम करता है, जो संकलन शाखा, कूद में , और विधानसभा भाषा निर्देश कॉल करने के लिए धन्यवाद कार्यान्वित, है। एक कार्यक्रम के रूप में EIP पाठ सेगमेंट का पहला शिक्षा के लिए निर्धारित है प्रोसेसर तो एक निष्पादन पाश है कि निम्नलिखित करता है इस प्रकार है:। "

" 1. अनुदेश कि EIP "

" की ओर इशारा करते है पढ़ता है 2. जोड़ता है शिक्षा का बाइट लंबाई EIP करने के लिए "

" 3. अनुदेश चरण में पढ़ा गया था 1 "

" 4. वापस चला जाता है के लिए चरण 1 "

पर क्रियान्वित

" कभी-कभी निर्देश एक कूद या कॉल निर्देश होगा, जो ईआईपी को स्मृति के एक अलग पते में बदल देता है। प्रोसेसर परिवर्तन के बारे में परवाह नहीं करता है, क्योंकि यह निष्पादन की उम्मीद है कि निष्पादन nonlinear हो। यदि चरण 3 में ईआईपी बदल दिया गया है, तो प्रोसेसर केवल चरण 1 पर वापस जायेगा और जो भी ईआईपी बदल दिया गया था उसे "

" टेक्स्ट सेगमेंट में अनुमति अनुमति अक्षम है, यह चर, केवल कोड स्टोर करने के लिए प्रयोग नहीं किया जाता है। यह लोगों को वास्तव में प्रोग्राम कोड को संशोधित करने से रोकता है; स्मृति के इस सेगमेंट को लिखने का कोई भी प्रयास प्रोग्राम को उपयोगकर्ता को सतर्क करने का कारण बनता है कि कुछ बुरा हुआ, और प्रोग्राम मारे जायेंगे। इस सेगमेंट का एक अन्य लाभ केवल पढ़ने के लिए है कि यह प्रोग्राम की विभिन्न प्रतियों के बीच साझा किया जा सकता है, बिना किसी समस्या के प्रोग्राम के कई निष्पादन की अनुमति देता है। यह भी ध्यान दिया जाना चाहिए इस स्मृति खंड एक निश्चित आकार में कभी परिवर्तन है, कुछ भी नहीं है, क्योंकि यह "।

" डेटा और बीएसएस क्षेत्रों वैश्विक और स्थिर कार्यक्रम चर स्टोर करने के लिए उपयोग किया जाता है। डेटा सेगमेंट प्रारंभिक वैश्विक और स्थैतिक चर से भरा हुआ है, जबकि बीएसएस सेगमेंट अपने अनियमित समकक्षों से भरा हुआ है। हालांकि ये खंड लिखने योग्य हैं, उनके पास एक निश्चित आकार भी है। याद रखें कि कार्यात्मक संदर्भ के बावजूद वैश्विक चर बने रहे हैं (जैसे पिछले उदाहरणों में चर जे।)। दोनों वैश्विक और स्थैतिक चर जारी रहती है नहीं कर सकेंगे क्योंकि वे अपने स्वयं के स्मृति खंडों में जमा हो जाती है। "

" ढेर खंड एक प्रोग्रामर कर सकते हैं सीधे नियंत्रण स्मृति का एक खंड है। इस सेगमेंट में मेमोरी के ब्लॉक आवंटित किए जा सकते हैं और के लिए भी प्रोग्रामर की आवश्यकता हो सकती है।ढेर खंड के बारे में एक ध्यान देने योग्य बात यह है कि यह निश्चित आकार का नहीं है, तो यह बड़ा या छोटा जरूरत के रूप में विकसित कर सकते हैं "।

" ढेर भीतर स्मृति के सभी संभाजक और deallocator एल्गोरिदम द्वारा किया जाता है , जो क्रमशः उपयोग के लिए ढेर में स्मृति का एक क्षेत्र आरक्षित करता है और बाद में आरक्षण के लिए स्मृति के उस हिस्से को पुन: उपयोग करने की अनुमति देने के लिए आरक्षण को हटा देता है। पर निर्भर करता है कि ढेर उपयोग के लिए आरक्षित है। इसका अर्थ यह है कि ढेर आवंटन कार्यों का उपयोग कर प्रोग्रामर आरक्षित और आरक्षित पर मुफ्त मेमोरी कर सकते हैं। के विकास ढेर नीचे उच्च स्मृति ओर कदम के पते "।

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

" सामान्य कंप्यूटर विज्ञान शर्तों में, एक स्टैक एक सार डेटा संरचना है जिसे अक्सर उपयोग किया जाता है। इसमें का ऑर्डर करने वाला पहला-अंतिम, अंतिम-आउट (FILO) है, जिसका अर्थ है कि स्टैक में रखी जाने वाली पहली वस्तु यह है कि इससे बाहर आने वाला अंतिम आइटम है। इस बारे में सोचें कि स्ट्रिंग के टुकड़े पर मोती डालने के रूप में एक छोर पर गाँठ है- जब तक आप सभी अन्य मोतियों को हटा नहीं देते हैं तब तक आपको पहली मोती नहीं मिल सकती है। जब एक आइटम एक ढेर में रखा जाता है, यह आगे बढ़ाने के रूप में जाना जाता है, और जब एक आइटम एक ढेर से निकाल दिया जाता है, यह पॉपिंग कहा जाता है "।

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

" एक ढेर के FILO प्रकृति अजीब लग सकता है , लेकिन चूंकि संदर्भ को संग्रहीत करने के लिए स्टैक का उपयोग किया जाता है, यह बहुत उपयोगी है। जब एक फ़ंक्शन कहा जाता है, तो स्टैक फ्रेम में एक साथ स्टैक पर कई चीजें धक्का दी जाती हैं। ईबीपी रजिस्टर-कभी-कभी फ्रेम पॉइंटर (एफपी) या स्थानीय बेस (एलबी) पॉइंटर कहा जाता है -इस वर्तमान स्टैक फ्रेम में स्थानीय फ़ंक्शन वेरिएबल्स को संदर्भित करने के लिए उपयोग किया जाता है। प्रत्येक स्टैक फ्रेम में फ़ंक्शन, उसके स्थानीय चर, और दो पॉइंटर्स के पैरामीटर होते हैं जो चीजों को वापस वैसे ही रखने के लिए आवश्यक होते हैं: सहेजे गए फ्रेम पॉइंटर (एसएफपी) और वापसी पता। एसएफपी का उपयोग ईबीपी को अपने पिछले मान में बहाल करने के लिए किया जाता है, और वापसी पता का उपयोग ईआईपी को फ़ंक्शन कॉल के बाद दिए गए अगले निर्देश में बहाल करने के लिए किया जाता है। यह पिछले ढेर फ्रेम के कार्यात्मक संदर्भ पुनर्स्थापित करता है "।

स्ट्रिंग्स

" सी में एक सरणी केवल किसी विशिष्ट डेटा प्रकार n तत्वों की एक सूची है। एक 20-वर्ण सरणी स्मृति में स्थित 20 निकटवर्ती वर्ण है।सरणी भी बफ़र्स रूप में भेजा जाता "।

#include <stdio.h> 

int main() 
{ 
    char str_a[20]; 
    str_a[0] = 'H'; 
    str_a[1] = 'e'; 
    str_a[2] = 'l'; 
    str_a[3] = 'l'; 
    str_a[4] = 'o'; 
    str_a[5] = ','; 
    str_a[6] = ' '; 
    str_a[7] = 'w'; 
    str_a[8] = 'o'; 
    str_a[9] = 'r'; 
    str_a[10] = 'l'; 
    str_a[11] = 'd'; 
    str_a[12] = '!'; 
    str_a[13] = '\n'; 
    str_a[14] = 0; 
    printf(str_a); 
} 

" पूर्ववर्ती कार्यक्रम में, एक 20 तत्व चरित्र सरणी str_a के रूप में परिभाषित किया गया है, और सरणी के प्रत्येक तत्व के लिए, एक के बाद एक लिखा है। ध्यान दें कि संख्या 0 से शुरू होती है, जैसा कि 1 के विपरीत होता है। यह भी ध्यान दें कि अंतिम वर्ण 0 "

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

" एक चरित्र सरणी में प्रत्येक चरित्र की स्थापना के बाद से श्रमसाध्य है और तार कर रहे हैं काफी बार प्रयोग किया जाता है, स्ट्रिंग मैनिपुलेशन के लिए मानक कार्यों का एक सेट बनाया गया था। उदाहरण के लिए, strcpy() फ़ंक्शन एक स्रोत से एक गंतव्य तक एक स्ट्रिंग की प्रतिलिपि बनायेगा, स्रोत स्ट्रिंग के माध्यम से पुन: प्रतिलिपि करेगा और प्रत्येक बाइट को गंतव्य पर कॉपी करेगा (और इसके बाद इसे रोकने के बाद रोक देगा) "

" फ़ंक्शंस तर्कों का क्रम पहले इंटेल असेंबली सिंटैक्स गंतव्य के समान है और फिर स्रोत। स्ट्रिंग लाइब्रेरी का उपयोग करके एक ही चीज़ को पूरा करने के लिए char_array.c प्रोग्राम को strcpy() का उपयोग करके फिर से लिखा जा सकता है। नीचे दिखाया गया char_array कार्यक्रम के अगले संस्करण के बाद से यह एक स्ट्रिंग समारोह का उपयोग करता string.h शामिल "।

#include <stdio.h> 
#include <string.h> 

int main() 
{ 
    char str_a[20]; 
    strcpy(str_a, "Hello, world!\n"); 
    printf(str_a); 
} 

सी तार पर और जानकारी

http://www.cs.uic.edu /~jbell/CourseNotes/C_Programming/CharacterStrings.html

http://www.tutorialspoint.com/cprogramming/c_strings.htm

प्वाइंटर

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

'सी में प्वाइंटर परिभाषित और किसी भी अन्य चर प्रकार की तरह इस्तेमाल किया जा सकता है। चूंकि x86 आर्किटेक्चर पर स्मृति 32-बिट एड्रेसिंग का उपयोग करती है, पॉइंटर्स आकार में 32 बिट्स (4 बाइट्स) भी हैं। प्वाइंटर्स को वैरिएबल नाम पर तारांकन (*) तैयार करके परिभाषित किया जाता है। उस प्रकार के चर को परिभाषित करने के बजाय, एक पॉइंटर को उस प्रकार के डेटा के रूप में परिभाषित किया जाता है जो उस प्रकार के डेटा को इंगित करता है। Pointer.c प्रोग्राम चार डेटा प्रकार के साथ उपयोग किए जाने वाले पॉइंटर का एक उदाहरण है, जो आकार आकार में केवल 1byte है "।

#include <stdio.h> 
#include <string.h> 

int main() 
{ 
    char str_a[20]; // A 20-element character array 
    char *pointer; // A pointer, meant for a character array 
    char *pointer2; // And yet another one 
    strcpy(str_a, "Hello, world!\n"); 
    pointer = str_a; // Set the first pointer to the start of the array. 
    printf(pointer); 
    pointer2 = pointer + 2; // Set the second one 2 bytes further in. 
    printf(pointer2); // Print it. 
    strcpy(pointer2, "y you guys!\n"); // Copy into that spot. 
    printf(pointer); // Print again. 
} 

" कोड में टिप्पणियां रूप से संकेत मिलता है, पहले सूचक चरित्र सरणी की शुरुआत में स्थापित किया जाएगा। जब चरित्र सरणी इस तरह संदर्भित है, यह वास्तव में एक सूचक ही है। यह है कि यह कैसे है बफर को printf() और strcpy() फ़ंक्शंस में पॉइंटर के रूप में पास किया गया था। दूसरा पॉइंटर पहले पॉइंटर्स एड्रेस प्लस दो पर सेट होता है, और फिर कुछ चीजें मुद्रित होती हैं (नीचे आउटपुट में दिखायी जाती हैं) "।

[email protected]:~/booksrc $ gcc -o pointer pointer.c 
[email protected]:~/booksrc $ ./pointer 
Hello, world! 
llo, world! 
Hey you guys! 
[email protected]:~/booksrc $ 

" ऑपरेटर-का पता अक्सर, संकेत के साथ संयोजन के रूप में प्रयोग किया जाता है के बाद से संकेत स्मृति पते हैं। Addressof.c कार्यक्रम को दर्शाता है ऑपरेटर पता-के एक पूर्णांक चर का पता लगाने के लिए इस्तेमाल किया जा रहा एक पॉइंटर में। यह लाइन से नीचे बोल्ड में दिखाया गया है "।

#include <stdio.h> 

int main() 
{ 
    int int_var = 5; 
    int *int_ptr; 
    int_ptr = &int_var; // put the address of int_var into int_ptr 
} 

" एक अतिरिक्त एकल ऑपरेटर कहा जाता भिन्नता ऑपरेटर संकेत के साथ प्रयोग के लिए मौजूद है। यह ऑपरेटर डेटा पता सूचक की ओर इशारा करते है में पाया वापस आ जाएगी, के बजाय पता ही। यह का रूप ले लेता परिवर्तक नाम के सामने एक तारांकन, एक सूचक की घोषणा के समान। एक बार फिर, डीडीफरेंस ऑपरेटर जीडीबी में और सी दोनों में मौजूद है "।

" addressof.c कोड (addressof2.c में दिखाया गया है) करने के लिए कुछ अतिरिक्त इन अवधारणाओं के सभी प्रदर्शन करेंगे। जोड़ा printf() कार्यों प्रारूप मानकों, जो मैं अगले अनुभाग में बताएंगे का उपयोग अभी के लिए, प्रोग्राम आउटपुट पर ध्यान केंद्रित करें "।

#include <stdio.h> 

int main() 
{ 
    int int_var = 5; 
    int *int_ptr; 
    int_ptr = &int_var; // Put the address of int_var into int_ptr. 
    printf("int_ptr = 0x%08x\n", int_ptr); 
    printf("&int_ptr = 0x%08x\n", &int_ptr); 
    printf("*int_ptr = 0x%08x\n\n", *int_ptr); 
    printf("int_var is located at 0x%08x and contains %d\n", &int_var, int_var); 
    printf("int_ptr is located at 0x%08x, contains 0x%08x, and points to %d\n\n", &int_ptr, int_ptr, *int_ptr); 
} 

" एकल ऑपरेटरों संकेत के साथ उपयोग किया जाता है, तो ऑपरेटर-का पता, के रूप में पीछे चलाकर बारे में सोचा जा सकता है, जबकि भिन्नता ऑपरेटर दिशा सूचक इशारा कर रही है में आगे बढ़ता है।"

प्वाइंटर और स्मृति आवंटन

प्रोफेसर डैन Hirschberg, कंप्यूटर विज्ञान विभाग, कैलिफोर्निया विश्वविद्यालय कंप्यूटर स्मृति पर https://www.ics.uci.edu/~dan/class/165/notes के बारे में और अधिक जानकारी प्राप्त /memory.html

http://cslibrary.stanford.edu/106/

http://www.programiz.com/c-programming/c-dynamic-memory-allocation

Arrays

एलेक्स Allain यहाँ http://www.cprogramming.com/tutorial/c/lesson8.html

उपलब्ध नामक एक अध्याय द्वारा बहुआयामी सरणियों पर एक साधारण ट्यूटोरियल Theres नाम के एक अध्याय द्वारा सरणियों पर

थेरेस जानकारी टोड ए गिब्सन यहां उपलब्ध http://www.augustcouncil.com/~tgibson/tutorial/arr।एचटीएमएल

दोहराएं किसी सरणी

#include <stdio.h> 

int main() 
{ 

    int i; 
    char char_array[5] = {'a', 'b', 'c', 'd', 'e'}; 
    int int_array[5] = {1, 2, 3, 4, 5}; 
    char *char_pointer; 
    int *int_pointer; 
    char_pointer = char_array; 
    int_pointer = int_array; 

    for(i=0; i < 5; i++) { // Iterate through the int array with the int_pointer. 
     printf("[integer pointer] points to %p, which contains the integer %d\n", int_pointer, *int_pointer); 
     int_pointer = int_pointer + 1; 
    } 

    for(i=0; i < 5; i++) { // Iterate through the char array with the char_pointer. 
     printf("[char pointer] points to %p, which contains the char '%c'\n", char_pointer, *char_pointer); 
     char_pointer = char_pointer + 1; 
    } 

} 

लिंक्ड सूचियाँ बनाम सरणी

सरणी ही उपलब्ध विकल्प, लिंक्ड सूची के बारे में जानकारी नहीं हैं।

http://www.eternallyconfuzzled.com/tuts/datastructures/jsw_tut_linklist.aspx

निष्कर्ष

यह जानकारी बस लिखा गया था में से कुछ पर पारित करने के लिए मैं क्या पर अपना शोध के दौरान पढ़ा है वह विषय जो दूसरों की मदद कर सकता है।

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