सी प्रोग्रामिंग भाषा अविश्वसनीय रूप से लोकप्रिय है, और यह देखना आसान है कि क्यों। सी में प्रोग्रामिंग कुशल है और प्रोग्रामर को बहुत अधिक नियंत्रण देता है। सी ++, जावा और पायथन जैसी कई अन्य प्रोग्रामिंग भाषाओं को सी का उपयोग करके विकसित किया गया था।
हर दिन संभावनाएं बढ़ रही हैं कि यदि आप एक प्रोग्रामर हैं, तो आप अपने काम के लिए विशेष रूप से सी का उपयोग नहीं करेंगे। हालांकि, कई शिक्षण सी हैं जो अत्यधिक फायदेमंद हैं, भले ही आप इसे नियमित रूप से उपयोग न करें। यहाँ पर क्यों:
आप सॉफ़्टवेयर के लिए कोड पढ़ने और लिखने में सक्षम होंगे जिसका उपयोग कई अलग-अलग प्रकार के कंप्यूटर प्लेटफ़ॉर्म पर किया जा सकता है, जिसमें छोटे माइक्रोकंट्रोलर से लेकर डेस्कटॉप, लैपटॉप और मोबाइल ऑपरेटिंग सिस्टम तक सब कुछ शामिल है।
आप बेहतर ढंग से समझ पाएंगे कि उच्च स्तरीय भाषाएं पर्दे के पीछे क्या कर रही हैं, जैसे स्मृति प्रबंधन और कचरा संग्रहण। यह समझ आपको ऐसे प्रोग्राम लिखने में मदद कर सकती है जो अधिक कुशलता से काम करते हैं।
यदि आप एक सूचना प्रौद्योगिकी (आईटी) विशेषज्ञ हैं, तो आप सी सीखने से भी लाभान्वित हो सकते हैं। आईटी पेशेवर अक्सर अपनी नौकरी के हिस्से के रूप में स्क्रिप्ट लिखते, बनाए रखते और चलाते हैं। एक स्क्रिप्ट कंप्यूटर के ऑपरेटिंग सिस्टम के अनुसरण के लिए निर्देशों की एक सूची है। कुछ स्क्रिप्ट चलाने के लिए, कंप्यूटर एक नियंत्रित निष्पादन वातावरण स्थापित करता है जिसे शेल कहा जाता है । चूंकि अधिकांश ऑपरेटिंग सिस्टम सी पर आधारित शेल चलाते हैं, सी शेल आईटी पेशेवरों द्वारा उपयोग किए जाने वाले सी का एक लोकप्रिय स्क्रिप्टिंग अनुकूलन है।
यह लेख सी के पीछे के इतिहास को कवर करता है, देखता है कि सी इतना महत्वपूर्ण क्यों है, कुछ बुनियादी सी कोड के उदाहरण दिखाता है और सी की कुछ महत्वपूर्ण विशेषताओं की पड़ताल करता है, जिसमें डेटा प्रकार, संचालन, कार्य, पॉइंटर्स और मेमोरी प्रबंधन शामिल हैं। हालांकि यह आलेख सी में प्रोग्रामिंग के लिए एक निर्देश पुस्तिका नहीं है, लेकिन यह सी प्रोग्रामिंग को इस तरह से अद्वितीय बनाता है जो औसत सी प्रोग्रामिंग गाइड के पहले कुछ अध्यायों से परे है।
आइए देखें कि सी प्रोग्रामिंग भाषा कहां से आई है, यह कैसे विकसित हुई है और आज सॉफ्टवेयर विकास में इसकी भूमिका है।
- सी क्या है?
- सी कोड का संपादन और संकलन
- सरलतम सी कार्यक्रम
- सी . में सामान्य प्रोग्रामिंग अवधारणाएं
- सी . में कार्य
- फंक्शन प्रोटोटाइप
- सी . में डेटा प्रकार और संचालन
- स्क्रैच से शुरू न करें, पुस्तकालयों का उपयोग करें
- C . में पॉइंटर्स के बारे में कुछ संकेत
- C . में पॉइंटर्स का सही उपयोग करना
- सी . में स्मृति प्रबंधन का महत्व
सी क्या है?
C को परिभाषित करने का सबसे सरल तरीका यह है कि इसे कंप्यूटर प्रोग्रामिंग भाषा कहा जाए, जिसका अर्थ है कि आप इसके साथ सॉफ्टवेयर लिख सकते हैं जिसे कंप्यूटर निष्पादित कर सकता है। परिणाम एक बड़ा कंप्यूटर एप्लिकेशन हो सकता है, जैसे आपका वेब ब्राउज़र, या माइक्रोप्रोसेसर या अन्य कंप्यूटर घटक में एम्बेडेड निर्देशों का एक छोटा सेट।
भाषा सी को 1970 के दशक की शुरुआत में बेल लेबोरेटरीज में विकसित किया गया था, जिसका श्रेय मुख्य रूप से केन थॉम्पसन और डेनिस रिची के काम को जाता है। प्रोग्रामर्स को यूनिक्स ऑपरेटिंग सिस्टम के लिए निर्देशों के अधिक उपयोगकर्ता-अनुकूल सेट की आवश्यकता थी, जो उस समय असेंबली भाषा में लिखे गए प्रोग्रामों की आवश्यकता थी। असेंबली प्रोग्राम, जो सीधे कंप्यूटर के हार्डवेयर से बात करते हैं, लंबे और डिबग करने में मुश्किल होते हैं, और उन्हें नई सुविधाओं को जोड़ने के लिए थकाऊ, समय लेने वाले काम की आवश्यकता होती है [स्रोत: किंग]।
थॉम्पसन के उच्च-स्तरीय भाषा में पहले प्रयास को बी कहा गया, जो सिस्टम प्रोग्रामिंग भाषा बीसीपीएल के लिए एक श्रद्धांजलि थी जिस पर यह आधारित था। जब बेल लैब्स ने एक डिजिटल उपकरण निगम (DEC) UNIX सिस्टम मॉडल PDP-11 का अधिग्रहण किया, तो थॉम्पसन ने नए, बेहतर सिस्टम हार्डवेयर की मांगों को बेहतर ढंग से पूरा करने के लिए B को फिर से काम में लिया। इस प्रकार, B के उत्तराधिकारी, C का जन्म हुआ। 1973 तक, C इतना स्थिर था कि UNIX को इस नवीन नई उच्च-स्तरीय भाषा [स्रोत: किंग] का उपयोग करके फिर से लिखा जा सकता था।
इससे पहले कि बेल लैब्स से परे सी का प्रभावी ढंग से उपयोग किया जा सके, अन्य प्रोग्रामर को एक दस्तावेज़ की आवश्यकता थी जो यह बताए कि इसका उपयोग कैसे किया जाए। 1978 में, ब्रायन कर्निघन और डेनिस रिची की पुस्तक "द सी प्रोग्रामिंग लैंग्वेज", जिसे सी उत्साही लोग के एंड आर या "व्हाइट बुक" के रूप में जानते हैं, सी प्रोग्रामिंग का निश्चित स्रोत बन गया। इस लेखन के अनुसार, मूल रूप से 1988 में प्रकाशित K&R का दूसरा संस्करण अभी भी व्यापक रूप से उपलब्ध है। C के मूल, पूर्व-मानक संस्करण को उस पुस्तक के आधार पर K&R C कहा जाता है।
यह सुनिश्चित करने के लिए कि लोगों ने समय के साथ अपनी बोलियाँ नहीं बनाईं, C डेवलपर्स ने 1980 के दशक में भाषा के लिए मानक बनाने के लिए काम किया। C के लिए अमेरिकी मानक, अमेरिकी राष्ट्रीय मानक संस्थान (ANSI) मानक X3.159-1989, 1989 में आधिकारिक हो गया। मानकीकरण के लिए अंतर्राष्ट्रीय संगठन (ISO) मानक, ISO/IEC 9899:1990, 1990 में अपनाया गया। C के संस्करण K&R इन मानकों और उनके बाद के संशोधनों (C89, C90 और C99) को संदर्भित करने के बाद। आप C89 को "ANSI C," "ANSI/ISO C" या "ISO C" के रूप में भी देख सकते हैं।
C और UNIX में इसका उपयोग 1980 के दशक के दौरान ऑपरेटिंग सिस्टम के विकास में उछाल का सिर्फ एक हिस्सा था। अपने पूर्ववर्तियों पर अपने सभी सुधारों के लिए, हालांकि, सी अभी भी बड़े सॉफ्टवेयर अनुप्रयोगों के विकास के लिए उपयोग करने में आसान नहीं था। जैसे-जैसे कंप्यूटर अधिक शक्तिशाली होते गए, एक आसान प्रोग्रामिंग अनुभव की मांग बढ़ती गई। इस मांग ने प्रोग्रामरों को अपने स्वयं के कंपाइलर बनाने के लिए प्रेरित किया, और इस प्रकार सी का उपयोग करके अपनी नई प्रोग्रामिंग भाषाएं बनाईं। ये नई भाषाएं बहुत सारे चलने वाले हिस्सों के साथ जटिल कार्यों को कोडिंग को सरल बना सकती हैं। उदाहरण के लिए, सी ++ और जावा जैसी भाषाएं, दोनों सी से विकसित हुई हैं, सरल ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंग, एक प्रोग्रामिंग दृष्टिकोण जो प्रोग्रामर की कोड का पुन: उपयोग करने की क्षमता को अनुकूलित करता है।
अब जबकि आप थोड़ी सी पृष्ठभूमि जानते हैं, तो आइए C के यांत्रिकी को ही देखें।
सी कोड का संपादन और संकलन
सी वह है जिसे एक संकलित भाषा के रूप में संदर्भित किया जाता है, जिसका अर्थ है कि आप इसे चलाने से पहले कोड को निष्पादन योग्य फ़ाइल में बदलने के लिए एक कंपाइलर का उपयोग करना होगा। कोड एक या अधिक टेक्स्ट फाइलों में लिखा जाता है, जिसे आप किसी भी टेक्स्ट एडिटर में खोल सकते हैं, पढ़ सकते हैं और संपादित कर सकते हैं, जैसे विंडोज़ में नोटपैड, मैक पर टेक्स्टएडिट और लिनक्स में जीएडिट। एक निष्पादन योग्य फ़ाइल कुछ ऐसी है जिसे कंप्यूटर चला सकता है (निष्पादित)। कंपाइलर त्रुटियों के लिए कोड की जांच करता है और, यदि यह त्रुटि-मुक्त प्रतीत होता है, तो एक निष्पादन योग्य फ़ाइल बनाता है।
इससे पहले कि हम देखें कि सी कोड में क्या जाता है, आइए सुनिश्चित करें कि हम सी कंपाइलर ढूंढ सकते हैं और उसका उपयोग कर सकते हैं। यदि आप मैक ओएस एक्स और अधिकांश लिनक्स वितरण (जैसे उबंटू) का उपयोग कर रहे हैं, तो आप अपने कंप्यूटर में एक सी कंपाइलर जोड़ सकते हैं यदि आप उस विशेष ओएस के लिए विकास उपकरण सॉफ़्टवेयर स्थापित करते हैं। ये मुफ़्त C कंपाइलर कमांड लाइन टूल हैं, जिसका अर्थ है कि आप इन्हें आमतौर पर टर्मिनल विंडो में कमांड प्रॉम्प्ट से चलाएंगे। इन सी कंपाइलरों में से एक को चलाने के लिए कमांड "सीसी" या "जीसीसी" प्लस कुछ कमांड लाइन विकल्प और तर्क हैं, जो कि एंटर दबाए जाने से पहले कमांड के बाद टाइप किए गए अन्य शब्द हैं।
यदि आप माइक्रोसॉफ्ट विंडोज का उपयोग कर रहे हैं, या आप कमांड लाइन के बजाय ग्राफिकल यूजर इंटरफेस का उपयोग करना पसंद करेंगे, तो आप सी प्रोग्रामिंग के लिए एक एकीकृत विकास वातावरण (आईडीई) स्थापित कर सकते हैं। एक आईडीई एक एकल इंटरफ़ेस है जहां आप अपना कोड लिख सकते हैं, इसे संकलित कर सकते हैं, इसका परीक्षण कर सकते हैं और त्रुटियों को तुरंत ढूंढ और ठीक कर सकते हैं। विंडोज़ के लिए, आप माइक्रोसॉफ्ट विजुअल सी++ सॉफ्टवेयर, सी और सी++ प्रोग्रामिंग दोनों के लिए एक आईडीई खरीद सकते हैं। एक अन्य लोकप्रिय आईडीई एक्लिप्स है, जो एक मुफ्त जावा-आधारित आईडीई है जो विंडोज, मैक और लिनक्स पर चलता है और इसमें सी और कई अन्य प्रोग्रामिंग भाषाओं को संकलित करने के लिए एक्सटेंशन उपलब्ध हैं।
सी के लिए, अन्य कंप्यूटर प्रोग्रामिंग भाषाओं की तरह, आपके द्वारा उपयोग किए जाने वाले कंपाइलर का संस्करण बहुत महत्वपूर्ण है। आप हमेशा सी कंपाइलर के एक संस्करण का उपयोग करना चाहते हैं जो आपके प्रोग्राम में उपयोग की जा रही सी भाषा के संस्करण की तुलना में नया या नया है। यदि आप एक आईडीई का उपयोग कर रहे हैं, तो यह सुनिश्चित करने के लिए अपनी सेटिंग्स को समायोजित करना सुनिश्चित करें कि आईडीई उस प्रोग्राम के लिए आपके लक्ष्य सी संस्करण का उपयोग कर रहा है जिस पर आप काम कर रहे हैं। यदि आप कमांड लाइन पर हैं, तो आप निम्न कमांड के अनुसार संस्करण को बदलने के लिए कमांड लाइन तर्क जोड़ सकते हैं:
gcc -std c99 -o myprogram.exe myprogram.c
ऊपर दिए गए कमांड में, "gcc" कंपाइलर को चलाने के लिए कॉल है और बाकी सब एक कमांड लाइन विकल्प या तर्क है। संकलन के दौरान C के C99 मानक संस्करण का उपयोग करने के लिए संकलक को बताने के लिए "-std" विकल्प को "c99" के बाद जोड़ा गया था। निष्पादन योग्य, कंपाइलर की आउटपुट फ़ाइल को myprogram.exe नाम देने का अनुरोध करने के लिए "-o" विकल्प को "myprogram.exe" के बाद जोड़ा गया था। "-o" के बिना निष्पादन योग्य को स्वचालित रूप से इसके बजाय a.out नाम दिया गया है। अंतिम तर्क "myprogram.c" संकलित किए जाने वाले C कोड वाली टेक्स्ट फ़ाइल को इंगित करता है। संक्षेप में, यह आदेश कह रहा है, "अरे, जीसीसी, सी 99 सी प्रोग्रामिंग मानक का उपयोग करके myprogram.c संकलित करें और परिणामों को myprogram.exe नामक फ़ाइल में रखें।"
अपने कंपाइलर के इंस्टाल होने के साथ, आप सी में प्रोग्राम करने के लिए तैयार हैं। आइए सबसे सरल सी प्रोग्रामों में से एक की मूल संरचना पर एक नज़र डालकर शुरू करें जिसे आप लिख सकते हैं।
सरलतम सी कार्यक्रम
आइए एक साधारण सी प्रोग्राम को देखें और सी और सी संकलन प्रक्रिया की मूल बातें समझने के लिए इसका इस्तेमाल करें। यदि आपके पास पहले बताए गए अनुसार C कंपाइलर के साथ आपका अपना कंप्यूटर है, तो आप sample.c नाम की एक टेक्स्ट फ़ाइल बना सकते हैं और जब तक हम इस उदाहरण के माध्यम से आगे बढ़ते हैं, तब तक इसका उपयोग करें। ध्यान दें कि यदि आप फ़ाइल नाम में .c छोड़ देते हैं, या यदि आपका संपादक नाम के साथ .txt जोड़ देता है, तो आप इसे संकलित करते समय शायद किसी प्रकार की त्रुटि प्राप्त करेंगे।
यहाँ हमारा नमूना कार्यक्रम है:
/* नमूना कार्यक्रम */
#शामिल करना
मुख्य प्रवेश बिंदु()
{
प्रिंटफ ("यह मेरे पहले प्रोग्राम से आउटपुट है! \ n");
वापसी 0;
}
जब संकलित और निष्पादित किया जाता है, तो यह प्रोग्राम कंप्यूटर को "यह मेरे पहले प्रोग्राम से आउटपुट है!" लाइन का प्रिंट आउट लेने का निर्देश देता है। और फिर रुक जाओ। आप इससे ज्यादा सरल नहीं हो सकते! अब आइए देखें कि प्रत्येक पंक्ति क्या कर रही है:
पंक्ति 1 -- यह एक या अधिक पंक्तियों पर /* और */ के बीच C में टिप्पणियाँ लिखने का एक तरीका है।
पंक्ति 2 -- #include कमांड संकलक को मौजूदा सी कोड के लिए अन्य स्रोतों को देखने के लिए कहता है, विशेष रूप से पुस्तकालयों, जो फाइलें हैं जिनमें सामान्य पुन: प्रयोज्य निर्देश शामिल हैं। उपयोगकर्ता से इनपुट प्राप्त करने और स्क्रीन पर आउटपुट लिखने के लिए कार्यों के साथ एक मानक सी लाइब्रेरी का संदर्भ देता है। हम बाद में पुस्तकालयों को और करीब से देखेंगे।
पंक्ति 3 - यह पंक्ति किसी फ़ंक्शन परिभाषा की पहली पंक्ति है। प्रत्येक सी प्रोग्राम में कम से कम एक फ़ंक्शन या कोड का एक ब्लॉक होता है जो प्रोग्राम के चलने पर कंप्यूटर को कुछ करना चाहिए। फ़ंक्शन अपना कार्य करता है और फिर एक उप-उत्पाद उत्पन्न करता है, जिसे रिटर्न वैल्यू कहा जाता है, जिसका उपयोग अन्य कार्यों द्वारा किया जा सकता है। कम से कम, प्रोग्राम में एक फ़ंक्शन होता है जिसे main कहा जाता है, जैसा कि यहां दिखाया गया है, जिसमें डेटा प्रकार int के साथ रिटर्न वैल्यू है, जिसका अर्थ है पूर्णांक। जब हम बाद में कार्यों की जांच करते हैं, तो आप देखेंगे कि खाली कोष्ठकों का क्या अर्थ है।
पंक्ति 4 और 7 -- एक फ़ंक्शन के भीतर निर्देश ब्रेसिज़ में संलग्न हैं। कुछ प्रोग्रामर अलग-अलग लाइनों पर ब्रेस-संलग्न ब्लॉक को शुरू और समाप्त करते हैं जैसा कि यहां दिखाया गया है। अन्य फ़ंक्शन परिभाषा की पहली पंक्ति के अंत में ओपन-ब्रेस ({) डालेंगे। हालांकि प्रोग्राम में कोड की पंक्तियों को अलग-अलग लाइनों पर टाइप करने की आवश्यकता नहीं होती है, प्रोग्रामर आमतौर पर प्रत्येक निर्देश को एक अलग लाइन पर रखते हैं, रिक्त स्थान के साथ इंडेंट किया जाता है, ताकि कोड को बाद में पढ़ने और संपादित करने में आसानी हो।
लाइन 5 -- यह प्रिंटफ नामक फंक्शन के लिए एक फंक्शन कॉल है। उस फ़ंक्शन को लाइन 1 से शामिल stdio.h लाइब्रेरी में कोडित किया गया है, इसलिए आपको इसे स्वयं लिखने की आवश्यकता नहीं है। Printf को यह कॉल बताता है कि स्क्रीन पर क्या प्रिंट करना है। \n अंत में, उद्धरणों के भीतर, मुद्रित नहीं है, हालांकि; यह एक एस्केप सीक्वेंस है जो प्रिंटफ को स्क्रीन पर कर्सर को अगली लाइन पर ले जाने का निर्देश देता है। साथ ही, जैसा कि आप देख सकते हैं, फ़ंक्शन की प्रत्येक पंक्ति को सेमी-कोलन के साथ समाप्त होना चाहिए।
पंक्ति 6 -- प्रत्येक फ़ंक्शन जो एक मान लौटाता है, उसमें इस तरह का एक रिटर्न स्टेटमेंट शामिल होना चाहिए। सी में, मुख्य फ़ंक्शन में हमेशा एक पूर्णांक रिटर्न प्रकार होना चाहिए, भले ही यह प्रोग्राम के भीतर उपयोग न किया गया हो। ध्यान दें कि जब आप सी प्रोग्राम चला रहे हों, हालांकि, आप अनिवार्य रूप से इसका मुख्य कार्य चला रहे हैं। इसलिए, जब आप प्रोग्राम का परीक्षण कर रहे हों, तो आप कंप्यूटर को प्रोग्राम चलाने से वापसी मान दिखाने के लिए कह सकते हैं। 0 के वापसी मान को प्राथमिकता दी जाती है क्योंकि प्रोग्रामर आमतौर पर प्रोग्राम के सफलतापूर्वक चलने की पुष्टि करने के लिए परीक्षण में उस मान की तलाश करते हैं।
जब आप अपने प्रोग्राम का परीक्षण करने के लिए तैयार हों, तो फ़ाइल को सहेजें और प्रोग्राम को संकलित करें और चलाएं। यदि आप कमांड लाइन पर gcc कंपाइलर का उपयोग कर रहे हैं, और प्रोग्राम sample.c नामक फ़ाइल में है, तो आप इसे निम्न कमांड के साथ संकलित कर सकते हैं:
gcc -o sample.exe sample.c
यदि कोड में कोई त्रुटि नहीं है, तो इस कमांड को चलाने के बाद आपके पास उसी निर्देशिका में sample.exe नाम की एक फ़ाइल होनी चाहिए, जिसमें sample.c है। सबसे आम त्रुटि एक सिंटैक्स त्रुटि है, जिसका अर्थ है कि आपने कुछ गलत टाइप किया है, जैसे किसी पंक्ति के अंत में अर्धविराम छोड़ना या उद्धरण या कोष्ठक बंद नहीं करना। यदि आपको परिवर्तन करने की आवश्यकता है, तो फ़ाइल को अपने टेक्स्ट एडिटर में खोलें, इसे ठीक करें, अपने परिवर्तनों को सहेजें और अपने कंपाइल कमांड को फिर से आज़माएँ।
sample.exe प्रोग्राम चलाने के लिए, निम्न आदेश दर्ज करें। नोट करें ./ जो निष्पादन योग्य फ़ाइल को खोजने के लिए कंप्यूटर को वर्तमान निर्देशिका को देखने के लिए मजबूर करता है:
./sample.exe
वे सी के लिए कोडिंग और संकलन की मूल बातें हैं, हालांकि आप अन्य सी प्रोग्रामिंग संसाधनों से संकलन के बारे में बहुत कुछ सीख सकते हैं। अब, बॉक्स को खोलते हैं और देखते हैं कि C के पास प्रोग्राम बनाने के लिए कौन से टुकड़े हैं।
Common Programming Concepts in C
Let's take a look at how to put some of the common programming concepts into practice in your C code. The following is a quick summary of these concepts:
Functions -- As stated earlier, a function is a block of code representing something the computer should do when the program runs. Some languages call these structures methods, though C programmers don't typically use that term. Your program may define several functions and call those functions from other functions. Later, we'll take a closer look at the structure of functions in C.
Variables -- When you run a program, sometimes you need the flexibility to run the program without knowing what the values are ahead of time. Like other programming languages, C allows you to use variables when you need that flexibility. Like variables in algebra, a variable in computer programming is a placeholder that stands for some value that you don't know or haven't found yet.
Data types -- In order to store data in memory while your program is running, and to know what operations you can perform on that data, a programming language like C defines certain data types it will recognize. Each data type in C has a certain size, measured in binary bits or bytes, and a certain set of rules about what its bits represent. Coming up, we'll see how important it is choose the right data type for the task when you're using C.
Operations -- In C, you can perform arithmetic operations (such as addition) on numbers and string operations (such as concatenation) on strings of characters. C also has built-in operations specifically designed for things you might want to do with your data. When we check out data types in C, we'll take a brief look at the operations, too.
Loops -- One of the most basic things a programmer will want to do is repeat an action some number of times based on certain conditions that come up while the program is running. A block of code designed to repeat based on given conditions is called a loop, and the C language provides for these common loop structures: while, do/while, for, continue/break and goto. C also includes the common if/then/else conditionals and switch/case statements.
Data structures -- When your program has a lot of data to handle, and you need to sort or search through that data, you'll probably use some sort of data structure. A data structure is a structured way of representing several pieces of data of the same data type. The most common data structure is an array, which is just an indexed list of a given size. C has libraries available to handle some common data structures, though you can always write functions and set up your own structures, too.
Preprocessor operations -- Sometimes you'll want to give the compiler some instructions on things to do with your code before compiling it into the executable. These operations include substituting constant values and including code from C libraries (which you saw in the sample code earlier).
C also requires programmers to handle some concepts which many programming languages have simplified or automated. These include pointers, memory management, and garbage collection. Later pages cover the important things to know about these concepts when programming in C.
This quick overview of concepts may seem overwhelming if you're not already a programmer. Before you move on to tackle a dense C programming guide, let's take a user-friendly look at the core concepts among those listed above, starting with functions.
Functions in C
Most computer programming languages allow you to create functions of some sort. Functions let you chop up a long program into named sections so that you can reuse those sections throughout the program. Programmers for some languages, especially those using object-oriented programming techniques, use the term method instead of function.
Functions accept parameters and return a result. The block of code that comprises a function is its function definition. The following is the basic structure of a function definition:
{
return
}
At a minimum, a C program has one function named main. The compiler will look for a main function as the starting point for the program, even if the main function calls other functions within it. The following is the main we saw in the simple C program we looked at before. It has a return type of integer, takes no parameters, and has two statements (instructions within the function), one of which is its return statement:
int main()
{
printf("This is output from my first program!\n");
return 0;
}
Functions other than main have a definition and one or more function calls. A function call is a statement or part of a statement within another function. The function call names the function it's calling followed by parentheses. If the function has parameters, the function call must include corresponding values to match those parameters. This additional part of the function call is called passing parameters to the function.
लेकिन पैरामीटर क्या हैं? किसी फ़ंक्शन के लिए एक पैरामीटर एक निश्चित डेटा प्रकार के डेटा का एक टुकड़ा है जिसे फ़ंक्शन को अपना काम करने की आवश्यकता होती है। सी में कार्य असीमित संख्या में पैरामीटर स्वीकार कर सकते हैं, जिन्हें कभी-कभी तर्क कहा जाता है। फ़ंक्शन परिभाषा में जोड़े गए प्रत्येक पैरामीटर में दो चीजें निर्दिष्ट होनी चाहिए: इसका डेटा प्रकार और फ़ंक्शन ब्लॉक के भीतर इसका चर नाम। एकाधिक पैरामीटर अल्पविराम द्वारा अलग किए जाते हैं। निम्नलिखित फ़ंक्शन में, दो पैरामीटर हैं, दोनों पूर्णांक:
इंट डबलएंडएड (इंट ए, इंट बी)
{
वापसी ((2*ए)+(2*बी));
}
इसके बाद, आइए ज़ूम आउट करके फ़ंक्शंस पर अपना नज़रिया जारी रखें ताकि यह देखा जा सके कि वे एक बड़े सी प्रोग्राम में कैसे फिट होते हैं।
फंक्शन प्रोटोटाइप
सी में, आप प्रोग्राम के भीतर कहीं भी फ़ंक्शन परिभाषा जोड़ सकते हैं (किसी अन्य फ़ंक्शन को छोड़कर)। एकमात्र शर्त यह है कि आपको संकलक को पहले से बताना होगा कि फ़ंक्शन कोड में कहीं बाद में मौजूद है। आप इसे प्रोग्राम की शुरुआत में एक फंक्शन प्रोटोटाइप के साथ करेंगे। प्रोटोटाइप एक बयान है जो परिभाषा की पहली पंक्ति के समान दिखता है। सी में, आपको प्रोटोटाइप में पैरामीटर के नाम देने की ज़रूरत नहीं है, केवल डेटा प्रकार। निम्नलिखित है कि डबलएंडएड फ़ंक्शन के लिए फ़ंक्शन प्रोटोटाइप कैसा दिखेगा:
इंट डबलएंडएड (इंट, इंट);
अपने प्रोग्राम के लिए पैकिंग सूची के रूप में फ़ंक्शन प्रोटोटाइप की कल्पना करें। कंपाइलर आपके प्रोग्राम को अनपैक और असेंबल करेगा जैसे आप एक नया बुकशेल्फ़ अनपैक और असेंबल कर सकते हैं। पैकिंग सूची आपको यह सुनिश्चित करने में मदद करती है कि बुकशेल्फ़ को असेंबल करना शुरू करने से पहले आपके पास बॉक्स में आवश्यक सभी टुकड़े हैं। कंपाइलर आपके प्रोग्राम को असेंबल करना शुरू करने से पहले उसी तरह फ़ंक्शन प्रोटोटाइप का उपयोग करता है।
यदि आप उस sample.c प्रोग्राम का अनुसरण कर रहे हैं जिसे हमने पहले देखा था, तो यहां दिखाए गए doubleAndAdd फ़ंक्शन के लिए फ़ंक्शन प्रोटोटाइप, फ़ंक्शन परिभाषा और फ़ंक्शन कॉल जोड़ने के लिए फ़ाइल को खोलें और संपादित करें। फिर, नया कोड कैसे काम करता है यह देखने के लिए अपने प्रोग्राम को पहले की तरह संकलित करें और चलाएं। आप इसे आज़माने के लिए एक गाइड के रूप में निम्नलिखित कोड का उपयोग कर सकते हैं:
#शामिल करना
इंट डबलएंडएड (इंट, इंट);
मुख्य प्रवेश बिंदु()
{
प्रिंटफ ("यह मेरे पहले प्रोग्राम से आउटपुट है! \ n");
प्रिंटफ ("यदि आप दोगुना करते हैं तो 2 और 3 जोड़ें, परिणाम है:% d \ n", doubleAndAdd (2,3));
वापसी 0;
}
इंट डबलएंडएड (इंट ए, इंट बी)
{
वापसी ((2*ए)+(2*बी));
}
अब तक हमने C प्रोग्राम में कुछ बुनियादी संरचनात्मक तत्वों को देखा है। अब, आइए देखें कि आप C प्रोग्राम में किस प्रकार के डेटा के साथ काम कर सकते हैं और उस डेटा पर आप कौन से ऑपरेशन कर सकते हैं।
समारोह घोषणाएं
सी में, आप शायद फंक्शन डिक्लेरेशन शब्द को फंक्शन प्रोटोटाइप से अधिक सुनेंगे, खासकर पुराने सी प्रोग्रामर के बीच। हालांकि, हम इस लेख में फ़ंक्शन प्रोटोटाइप शब्द का उपयोग कर रहे हैं, क्योंकि इसमें एक महत्वपूर्ण अंतर है। मूल रूप से, एक फ़ंक्शन घोषणा को किसी भी पैरामीटर की आवश्यकता नहीं थी, इसलिए वापसी प्रकार, फ़ंक्शन नाम और खाली कोष्ठक की एक जोड़ी पर्याप्त थी। एक फ़ंक्शन प्रोटोटाइप, हालांकि, संकलक को महत्वपूर्ण अतिरिक्त जानकारी देता है, जिसमें वह कॉल किए जाने वाले मापदंडों की संख्या और डेटा प्रकार शामिल करता है। सी और अन्य प्रोग्रामिंग भाषाओं में आज कोडर्स के बीच प्रोटोटाइप एक सर्वोत्तम अभ्यास दृष्टिकोण बन गया है।
सी . में डेटा प्रकार और संचालन
आपके कंप्यूटर के दृष्टिकोण से, डेटा कुछ और नहीं बल्कि एक और शून्य की एक श्रृंखला है जो आपकी हार्ड ड्राइव पर या आपके कंप्यूटर के प्रोसेसर या मेमोरी में इलेक्ट्रॉनिक बिट्स के लिए चालू और बंद स्थिति का प्रतिनिधित्व करता है। यह वह सॉफ़्टवेयर है जिसे आप कंप्यूटर पर चला रहे हैं जो यह निर्धारित करता है कि उन अरबों बाइनरी अंकों को कैसे समझा जाए। सी कुछ उच्च-स्तरीय भाषाओं में से एक है जो किसी दिए गए डेटा प्रकार के आधार पर डेटा की व्याख्या करने के अलावा बिट स्तर पर डेटा में आसानी से हेरफेर कर सकती है।
डेटा प्रकार नियमों का एक छोटा समूह है जो इंगित करता है कि बिट्स की एक श्रृंखला को कैसे समझा जाए। डेटा प्रकार का एक विशिष्ट आकार होता है और उस प्रकार के डेटा पर संचालन करने का अपना तरीका (जैसे जोड़ना और गुणा करना) होता है। सी में, डेटा प्रकार का आकार आपके द्वारा उपयोग किए जा रहे प्रोसेसर से संबंधित होता है। उदाहरण के लिए, C99 में, पूर्णांक डेटा प्रकार (int) के डेटा का एक टुकड़ा 16-बिट प्रोसेसर में 16 बिट लंबा होता है जबकि 32-बिट और 64-बिट प्रोसेसर के लिए यह 32 बिट लंबा होता है।
Another important thing for C programmers to know is how the language handles signed and unsigned data types. A signed type means that one of its bits is reserved as the indicator for whether it's a positive or negative number. So, while an unsigned int on a 16-bit system can handle numbers between 0 and 65,535, a signed in on the same system can handle numbers between -32,768 and 32,767. If an operation causes an int variable to go beyond its range, the programmer has to handle the overflow with additional code.
Given these constraints and system-specific peculiarities in C data types and operations, C programmers must choose their data types based on the needs of their programs. Some of the data types they can choose are the primitive data types in C, meaning those built in to the C programming language. Look to your favorite C programming guide for a complete list of the data types in C and important information about how to convert data from one type to another.
C programmers can also create data structures, which combine primitive data types and a set of functions that define how the data can be organized and manipulated. Though the use of data structures is an advanced programming topic and beyond the scope of this article, we will take a look at one of the most common structures: arrays. An array is a virtual list containing pieces of data that are all the same data type. An array's size can't be changed, though its contents can be copied to other larger or smaller arrays.
Though programmers often use arrays of numbers, character arrays, called strings, have the most unique features. A string allows you to save something you might say (like "hello") into a series of characters, which your C program can read in from the user or print out on the screen. String manipulation has such a unique set of operations, it has its own dedicated C library (string.h) with your typical string functions.
The built-in operations in C are the typical operations you'd find in most programming languages. When you're combining several operations into a single statement, be sure to know the operator precedence, or the order in which the program will perform each operation in a mathematical expression. For example, (2+5)*3 equals 21 while 2+5*3 equals 17, because C will perform multiplication before addition unless there are parentheses indicating otherwise.
If you're learning C, make it a priority to familiarize yourself with all of its primitive data types and operations and the precedence for operations in the same expression. Also, experiment with different operations on variables and numbers of different data types.
At this point, you've scratched the surface of some important C basics. Next, though, let's look at how C enables you to write programs without starting from scratch every time.
Don't Start from Scratch, Use Libraries
Libraries are very important in C because the C language supports only the most basic features that it needs. For example, C doesn't contain input-output (I/O) functions to read from the keyboard and write to the screen. Anything that extends beyond the basics must be written by a programmer. If the chunk of code is useful to multiple different programs, it's often put into a library to make it easily reusable.
In our discussion of C so far, we've already seen one library, the standard I/O (stdio) library. The #include line at the beginning of the program instructed the C compiler to loaded the library from its header file named stdio.h. C maintainers include standard C libraries for I/O, mathematical functions, time manipulation and common operations on certain data structures, such as a string of characters. Search the Web or your favorite C programming guide for information about the C89 standard library and the updates and additions in C99.
You, too, can write C libraries. By doing so, you can split your program into reusable modules. This modular approach not only makes it easy to include the same code in multiple programs, but it also makes for shorter program files which are easier to read, test and debug.
To use the functions within a header file, add a #include line for it at the beginning of your program. For standard libraries, put the name of the library's corresponding header file between greater-than and less-than signs (). For libraries you create yourself, put the name of the file between double quotes. Unlike statements in other parts of your C program, you don't have to put a semicolon at the end of each line. The following shows including one of each type of library:
#include
#include "mylib.h"
A comprehensive C programming source should provide the instructions you need to write your own libraries in C. The function definitions you'll write are not any different whether they're in a library or in your main program. The difference is that you'll compile them separately in something called an object file (with a name ending in .o), and you'll create a second file, called a header file (with a name ending in .h) which contains the function prototypes corresponding to each function in the library. It's the header file you'll reference in your #include line in each main program that uses your library, and you'll include the object file as an argument in the compiler command each time you compile that program.
The C features we've explored so far are typical in other programming languages, too. Next, though, we'll talk about how C manages your computer's memory.
Some Pointers about Pointers in C
When your C program is loaded into memory (typically the random-access memory, or RAM, in your computer), each piece of the program is associated with an address in memory. This includes the variables you're using to hold certain data. Each time your program calls a function, it loads that function and all of its associated data into memory just long enough to run that function and return a value. If you pass parameters to the function, C automatically makes a copy of the value to use in the function.
Sometimes when you run a function, though, you want to make some permanent change to the data at its original memory location. If C makes a copy of data to use in the function, the original data remains unchanged. If you want to change that original data, you have to pass a pointer to its memory address (pass by reference) instead of passing its value to the function (pass by value).
Pointers are used everywhere in C, so if you want to use the C language fully you have to have a good understanding of pointers. A pointer is a variable like other variables, but its purpose is to store the memory address of some other data. The pointer also has a data type so it knows how to recognize the bits at that memory address.
When you look at two variables side-by-side in C code, you may not always recognize the pointer. This can be a challenge for even the most experienced C programmers. When you first create a pointer, though, it's more obvious because there must be an asterisk immediately before the variable name. This is known as the indirection operator in C. The following example code creates an integer i and a pointer to an integer p:
int i;
int *p;
Currently there is no value assigned to either i or p. Next, let's assign a value to i and then assign p to point to the address of i.
i = 3;
p = &i;
Here you can see the ampersand (&) used as the address operator immediately before i, meaning the "address of i." You don't have to know what that address is to make the assignment. That's good, because it will likely be different every time you run the program! Instead, the address operator will determine the address associated with that variable while the program is running. Without the address operator, the assignment p=i would assign p the memory address of 3, literally, rather than the memory address of the variable i.
Next, let's look at how you can use pointers in C code and the challenges you'll want to be prepared for.
Using Pointers Correctly in C
Once you have a pointer, you can use that in place of a variable of the same data type in operations and function calls. In the following example, the pointer to i is used instead of i within a larger operation. The asterisk used with the p (*p) indicates that the operation should use the value that p is pointing to at that memory address, not the memory address itself:
int b;
b = *p + 2;
Without pointers, it's nearly impossible to divide tasks into functions outside of main in your C program. To illustrate this, consider you've created a variable in main called h that stores the user's height to the nearest centimeter. You also call a function you've written named setHeight that prompts the user to set that height value. The lines in your main function might look something like this:
int h;
setHeight(h); /* There is a potential problem here. */
This function call will try to pass the value of h to setHeight. However, when the function finishes running, the value of h will be unchanged because the function only used a copy of it and then discarded it when it finished running.
If you want to change h itself, you should first ensure that the function can take a pointer to an existing value rather than a new copy of a value. The first line of setHeight, then, would use a pointer instead of a value as its parameter (note the indirection operator):
setHeight(int *height) { /* Function statements go here */ }
Then, you have two choices for calling setHeight. The first is to use the address operator for h as the passed parameter (&h). The other is to create a separate pointer to h and pass that instead. The following shows both options:
सेटहाइट (& एच); /* फ़ंक्शन में h का पता पास करें */
इंट * पी;
पी = & एच;
सेटहाइट (पी); /* फ़ंक्शन के लिए h के पते पर एक अलग पॉइंटर पास करें */
दूसरा विकल्प पॉइंटर्स का उपयोग करते समय एक आम चुनौती का खुलासा करता है। चुनौती में एक ही मान के लिए कई संकेत हैं। इसका मतलब है कि उस एक मान में कोई भी परिवर्तन उसके सभी पॉइंटर्स को एक साथ प्रभावित करता है। आप अपने कार्यक्रम में जो हासिल करने की कोशिश कर रहे हैं उसके आधार पर यह एक अच्छी या बुरी चीज हो सकती है। फिर से, सी प्रोग्रामिंग में महारत हासिल करने के लिए पॉइंटर्स के उपयोग में महारत हासिल करना एक महत्वपूर्ण कुंजी है। जितना हो सके पॉइंटर्स के साथ अभ्यास करें ताकि आप इन चुनौतियों का सामना करने के लिए तैयार रहें।
अब तक हमने जिन सी विशेषताओं की खोज की है, वे अन्य प्रोग्रामिंग भाषाओं में भी विशिष्ट हैं। आगे, हालांकि, हम सावधानीपूर्वक स्मृति प्रबंधन के लिए C की मांगों को देखेंगे।
सी . में स्मृति प्रबंधन का महत्व
सी को इतनी बहुमुखी भाषा बनाने वाली चीजों में से एक यह है कि प्रोग्रामर एक प्रोग्राम को बहुत कम मात्रा में मेमोरी के साथ चलाने के लिए स्केल कर सकता है। जब C पहली बार लिखा गया था, यह एक महत्वपूर्ण विशेषता थी क्योंकि कंप्यूटर लगभग उतने शक्तिशाली नहीं थे जितने आज हैं। छोटे इलेक्ट्रॉनिक्स की वर्तमान मांग के साथ, मोबाइल फोन से लेकर छोटे चिकित्सा उपकरणों तक, कुछ सॉफ़्टवेयर के लिए मेमोरी आवश्यकताओं को छोटा रखने में एक नई रुचि है। सी अधिकांश प्रोग्रामर के लिए जाने-माने भाषा है, जिन्हें स्मृति उपयोग पर बहुत अधिक नियंत्रण की आवश्यकता होती है।
स्मृति प्रबंधन के महत्व को बेहतर ढंग से समझने के लिए, विचार करें कि कोई प्रोग्राम स्मृति का उपयोग कैसे करता है। जब आप पहली बार कोई प्रोग्राम चलाते हैं, तो यह आपके कंप्यूटर की मेमोरी में लोड हो जाता है और कंप्यूटर के प्रोसेसर से निर्देश भेज और प्राप्त करना शुरू कर देता है। जब प्रोग्राम को किसी विशेष फ़ंक्शन को चलाने की आवश्यकता होती है, तो यह उस फ़ंक्शन को उसके चलाने की अवधि के लिए मेमोरी के दूसरे भाग में लोड करता है, फिर फ़ंक्शन पूरा होने पर उस मेमोरी को छोड़ देता है। साथ ही, मुख्य प्रोग्राम में उपयोग किया जाने वाला डेटा का प्रत्येक नया टुकड़ा प्रोग्राम की अवधि के लिए मेमोरी लेता है।
यदि आप इन सब पर अधिक नियंत्रण चाहते हैं, तो आपको गतिशील संग्रहण आवंटन की आवश्यकता है। सी गतिशील भंडारण आवंटन का समर्थन करता है, जो आपको इसकी आवश्यकता के अनुसार स्मृति आरक्षित करने की क्षमता है और जैसे ही आप इसका उपयोग समाप्त कर लेते हैं, वैसे ही उस स्मृति को मुक्त कर देते हैं। कई प्रोग्रामिंग भाषाओं में स्वचालित स्मृति आवंटन और कचरा संग्रह होता है जो इन स्मृति प्रबंधन कार्यों को संभालता है। सी, हालांकि, आपको मानक सी पुस्तकालय से निम्नलिखित प्रमुख कार्यों के साथ स्मृति आवंटन के बारे में स्पष्ट होने की अनुमति देता है (और कुछ मामलों में इसकी आवश्यकता होती है):
- मॉलोक - मेमोरी आवंटन के लिए लघु, मॉलोक का उपयोग किसी दिए गए आकार की मेमोरी के ब्लॉक को एक निश्चित प्रकार के डेटा को कहानी करने के लिए आरक्षित करने के लिए किया जाता है जिसे आपके प्रोग्राम को संसाधित करने की आवश्यकता होती है। जब आप मॉलोक का उपयोग करते हैं, तो आप आवंटित स्मृति के लिए एक सूचक बना रहे हैं। यह डेटा के एक टुकड़े के लिए आवश्यक नहीं है, जैसे कि एक पूर्णांक, जिसे जैसे ही आप पहली बार घोषित करते हैं, आवंटित किया जाता है (जैसा कि int i में)। हालाँकि, यह सरणियों जैसे डेटा संरचनाओं को बनाने और प्रबंधित करने का एक महत्वपूर्ण हिस्सा है। सी में वैकल्पिक स्मृति आवंटन विकल्प कॉलोक हैं , जो आरक्षित होने पर स्मृति को भी साफ़ करता है, और रीयलोक , जो पहले आरक्षित स्मृति का आकार बदलता है।
- मुफ़्त -- अपने प्रोग्राम को किसी दिए गए पॉइंटर को पहले से असाइन की गई मेमोरी को मुक्त करने के लिए बाध्य करने के लिए मुफ़्त का उपयोग करें।
मॉलोक और फ्री का उपयोग करते समय सबसे अच्छा अभ्यास यह है कि आप जो कुछ भी आवंटित करते हैं उसे मुक्त किया जाना चाहिए। जब भी आप कुछ आवंटित करते हैं, यहां तक कि एक अस्थायी कार्य में, यह तब तक स्मृति में रहता है जब तक कि ऑपरेटिंग सिस्टम अंतरिक्ष को साफ नहीं कर देता। यह सुनिश्चित करने के लिए कि मेमोरी मुफ़्त है और तुरंत उपयोग के लिए तैयार है, हालांकि, वर्तमान फ़ंक्शन के बाहर निकलने से पहले आपको इसे मुक्त करना चाहिए। इस मेमोरी प्रबंधन का मतलब है कि आप अपने प्रोग्राम की मेमोरी फ़ुटप्रिंट को न्यूनतम रख सकते हैं और मेमोरी लीक से बच सकते हैं। मेमोरी लीक एक प्रोग्राम दोष है जिसमें यह अधिक से अधिक मेमोरी का उपयोग करना जारी रखता है जब तक कि आवंटित करने के लिए कोई नहीं बचा है, जिससे प्रोग्राम रुक जाता है या क्रैश हो जाता है। दूसरी ओर, स्मृति को मुक्त करने के बारे में इतना चिंतित न हों कि आप मुक्त हो जाएं, और इस प्रकार खो दें, कुछ ऐसा जो आपको बाद में उसी फ़ंक्शन में चाहिए।
इस पूरे लेख में, आपने सी प्रोग्रामिंग भाषा की कुछ बुनियादी संरचना और मूल अवधारणाओं को सीखा है। हमने इसके इतिहास को देखा है, अन्य प्रोग्रामिंग भाषाओं के साथ इसकी विशेषताएं और महत्वपूर्ण विशेषताएं जो इसे सॉफ्टवेयर कोडिंग के लिए एक अद्वितीय और बहुमुखी विकल्प बनाती हैं। बहुत अधिक जानकारी के लिए अगले पृष्ठ पर लॉन्च करें, जिसमें कुछ प्रोग्रामिंग गाइड शामिल हैं जो आपको सी में आपकी यात्रा पर आगे ले जाएंगे।
बहुत अधिक जानकारी
संबंधित आलेख
- सी प्रोग्रामिंग की मूल बातें
- जावा कैसे काम करता है
- बूलियन लॉजिक कैसे काम करता है
- पर्ल कैसे काम करता है
- BIOS कैसे काम करता है
- CGI स्क्रिप्टिंग कैसे काम करती है
- बिट्स और बाइट्स कैसे काम करते हैं
अधिक बढ़िया लिंक
- सी प्रोग्रामिंग.कॉम ट्यूटोरियल
- विकिबुक्स पर सी प्रोग्रामिंग
- जीएनयू कंपाइलर संग्रह (जीसीसी)
- ग्रहण एकीकृत विकास पर्यावरण सॉफ्टवेयर
सूत्रों का कहना है
- कर्निघन, ब्रायन डब्ल्यू., और रिची, डेनिस एम. "सी प्रोग्रामिंग लैंग्वेज, सेकेंड एडिशन।" शागिर्द कक्ष। 1988.
- किंग, केएन "सी प्रोग्रामिंग: ए मॉडर्न अप्रोच, सेकेंड एडिशन।" WW नॉर्टन एंड कंपनी, इंक। 2008।