दिलचस्प पोस्ट
MySQL पर दो तिथियों के बीच अंतर के दिनों की संख्या कैसे प्राप्त करें? जावास्क्रिप्ट – ऑनक्लिक इवेंट को स्वचालित रूप से कहा जा रहा है सी # में आईपीसी तंत्र – उपयोग और सर्वोत्तम अभ्यास हैश फ़ंक्शन में पायथन 3.3 सत्रों के बीच अलग-अलग परिणाम देता है <My code> में त्रुटि: असाइनमेंट का लक्ष्य गैर-भाषा ऑब्जेक्ट का विस्तार करता है Hover हॉवर पर बॉक्स विकल्प चुनें? आर में जीजीप्लोट 2 में अंकों को नियंत्रित करना? मौजूदा प्रकार को टाइप वैरिएबल के साथ संदर्भित करने का कोई तरीका है? ऑरेकल में अलग CURRENT_TIMESTAMP और SYSDATE एक dereferenced सूचक पर पोस्ट वृद्धि? आईओएस के लिए एनईटी यूनिट टेस्ट रनर बेस 64 एन्कोडेड स्ट्रिंग के पास अंत में = एक चिह्न है एक्सेल VBA का उपयोग कर कमांड प्रॉम्प्ट में एक कमांड निष्पादित करें mysql में वेतन वृद्धि का चयन करें AngularJS – templateUrl बनाने में $ routesParams का उपयोग कैसे करें?

सी में दो-आयामी सरणी के तत्वों तक पहुंचने के लिए पॉइंटर एक्सप्रेशंस का उपयोग कैसे करें?

मुझे पता है कि एकल-आयामी arrays के लिए x=a[i] x=*(a+i) समतुल्य है, लेकिन मैं संकेतक का उपयोग करके दो-आयामी arrays के तत्वों का कैसे उपयोग कर सकता हूं?

वेब के समाधान से एकत्रित समाधान "सी में दो-आयामी सरणी के तत्वों तक पहुंचने के लिए पॉइंटर एक्सप्रेशंस का उपयोग कैसे करें?"

सारांश: यदि आपके पास int [][] रूप में परिभाषित एक बहुआयामी सरणी है, तो x = y[a][b] x = *((int *)y + a * NUMBER_OF_COLUMNS + b); समतुल्य है x = *((int *)y + a * NUMBER_OF_COLUMNS + b);


बोरिंग विवरण:

ऊपर दिए गए y का (int *) डालना कुछ स्पष्टीकरण के योग्य है, क्योंकि इसकी आवश्यकता पहले से सहज नहीं हो सकती है। यह समझने के लिए कि निम्नलिखित पर विचार क्यों किया जाना चाहिए:

  1. सी / सी ++ में टाइप किए गए पॉइंटर अंकगणित हमेशा टाइप किए गए पॉइंटर वैल्यू को समायोजित करता है (जो एक पता है) प्रकार के आकार के बाइट्स में जब स्केलर द्वारा जोड़ना / घटाना / बढ़ते / घटते समय।

  2. एक मल्टी-आयामी सरणी घोषणापत्र के मूलभूत प्रकार (तत्व प्रकार नहीं हैं; चर प्रकार) अंतिम आयाम की तुलना में एक-कम आयाम का एक सरणी प्रकार है।

इनमें से उत्तरार्द्ध (# 2) को वास्तव में ठोस बनाना एक उदाहरण की आवश्यकता है निम्नलिखित में, चर ar1 और ar2 बराबर घोषणाएं हैं।

 int ar1[5][5]; // an array of 5 rows of 5 ints. typedef int Int5Array[5]; // type is an array of 5 ints Int5Array ar2[5]; // an array of 5 Int5Arrays. 

अब सूचक अंकगणित भाग बस एक टाइप संरचना सूचक को बाइट्स में संरचना के आकार से उन्नत किया जा सकता है, इसलिए एक सरणी का पूर्ण आयाम खत्म हो सकता है। यह समझना आसान है अगर आप बहु आयामी सरणी के बारे में सोचते हैं जैसे मैंने ऊपर ar2 घोषित किया है:

 int (*arptr)[5] = ar1; // first row, address of ar1[0][0]. ++arptr; // second row, address of ar[1][0]. 

यह सब एक नंगे सूचक के साथ दूर हो जाता है:

 int *ptr = ar1; // first row, address of ar1[0][0]. ++ptr; // first row, address of ar1[0][1]. 

इसलिए, जब दो-आयामी सरणी के लिए सूचक अंकगणित करते हैं, तो निम्न तत्व बहु आयामी सरणी के [2][2] तत्व को प्राप्त करने में काम नहीं करेगा:

 #define NUMBER_OF_COLUMNS 5 int y[5][NUMBER_OF_COLUMNS]; int x = *(y + 2 * NUMBER_OF_COLUMNS + 2); // WRONG 

इसका कारण यह आशा है कि जब आपको याद आता है कि y arrays की एक सरणी है (declaratively speaking)। स्केलर (2*5 + 2) को y में जोड़ने का सूचक अंकगणित 12 पंक्तियों को जोड़ देगा, जिससे कंप्यूटिंग और पते के बराबर &(y[12]) , जो स्पष्ट रूप से सही नहीं है, और वास्तव में, या तो वसा फेंक देगा समय को संकलित करने या पूरी तरह से संकलन करने में पूरी तरह से विफल होने पर चेतावनी। यह (int*)y के कलाकार और अभिव्यक्ति के परिणामस्वरूप प्रकार से बेदखल पॉइंटर-टू-इंट के आधार पर से बचा जाता है:

 #define NUMBER_OF_COLUMNS 5 int y[5][NUMBER_OF_COLUMNS]; int x = *((int *)y + 2 * NUMBER_OF_COLUMNS + 2); // Right! 

टेबल

सी 2 डी सरणियों में निरंतर लाइनों की श्रृंखला होती है (पास्कल की तरह नहीं)।
जब हम 4 पंक्तियों और 5 कॉलम के साथ पूर्णांकों की एक तालिका बनाते हैं: 5 * 4 पूर्णांक तालिका

तत्वों तक पहुंचे

हम साथ elemnts तक पहुँच सकते हैं:

 int element = table[row-1][column-1]; 

लेकिन हम निम्न कोड के साथ ऐसा भी कर सकते हैं:

 int element = *(*(table+row-1)+column-1); 

इन उदाहरणों में row और column 1 से गिना जाता है, जो 1 के लिए कारण है
निम्नलिखित कोड में आप यह जांच सकते हैं कि दोनों तकनीक सही है। इस स्थिति में हम 0 से पंक्तियों और स्तंभों की गिनती करते हैं

उदाहरण

 #include <stdio.h> #include <stdlib.h> #define HEIGHT 4 #define WIDTH 5 int main() { int table[HEIGHT][WIDTH] = {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20}; int row = 2; int column = 2; int a = *(*(table+row)+column); printf("%d\n",a);//13 printf("%d\n",table[row][column]);//13 return 0; } 

व्याख्या

यह एक डबल पॉइमर अंकगणितीय है, इसलिए पहली पंक्ति के लिए table अंक और *table के पहले तत्व को इंगित करते हैं, यदि आप इसे **table से दोहराते हैं तो पहले तत्व का मान वापस आ जाएगा। निम्न उदाहरण में आप देख सकते हैं कि *table और table एक ही मेमोरी पते पर इशारा कर रही है।

 printf("%d\n",table);//2293476 printf("%d\n",*table);//2293476 printf("%d\n",**table);//1 

मेमोरी में तालिका की सभी पंक्तियां एक-दूसरे का पालन कर रही हैं। चूंकि table पंक्ति की पहली पंक्ति पर इंगित करती है, यदि हम उस पंक्ति संख्या को जोड़ते हैं जहां आवश्यक तत्व तालिका में है, तो हम एक सूचक प्राप्त करेंगे जो उस पंक्ति को इंगित करेगा इस मामले में *(table+row) में दिए गए पंक्ति के पहले तत्व को पता शामिल होगा अब हमें सिर्फ *(table+row)+column जैसे कॉलम संख्या जोड़नी है, और हमें दिए गए पंक्ति और स्तंभ में तत्व का पता मिलता है। यदि हम इसे नष्ट कर देते हैं, तो हमें इस तत्व का सही मूल्य मिलता है।
इसलिए यदि हम शून्य से पंक्तियों और स्तंभों की गिनती करते हैं, तो हम तत्वों को इस तरह से तालिका से प्राप्त कर सकते हैं:

 int element = *(*(table+row)+column); 

स्मृति में

स्मृति में तालिका

2 डी सरणी को 1 डी सरणियों के एक सरणी के रूप में देखा जाता है यही है, 2 डी सरणी में प्रत्येक पंक्ति 1 डी सरणी है। इसलिए 2 डी सरणी A ,

 int A[m][n]. 

सामान्य रूप में,

 A[i][j] = *(A[i]+j) 

भी

 A[i] = *(A+i) 

इसलिए,

 A[i][j] = *(A[i]+j) = * ( *(A+i)+j). 

पिछली उत्तर पहले से ही बहुत अच्छी तरह से समझाया है, मैं सिर्फ मेरी समझ के अनुसार सूचक अभिव्यक्ति की सूची करता हूं, और उनकी तुलना एआरआर [आई] [जे] प्रारूप के साथ करता हूं

 2-डी सरणी के सूचक अभिव्यक्ति:
     सरणी का नाम ही पहली उप सरणी के लिए एक संकेतक है,

     arr :
         पहले उप सरणी के लिए सूचक होगा, न कि पहले उप के पहले तत्व 
         सरणी, सरणी और सूचक के संबंध के अनुसार, यह भी प्रतिनिधित्व करते हैं 
         सरणी ही,

     arr + 1 :
         दूसरी उप सरणी के लिए सूचक होगा, न कि पहले उप के दूसरे तत्व 
         सरणी,

     * (एआरएम + 1) :
         दूसरे उप सरणी के पहले तत्व का सूचक होगा,
         सरणी और सूचक के रिश्तों के अनुसार, यह दूसरा प्रतिनिधित्व करता है
         उप सरणी, एआरएआर के समान [1] ,

     * (एआरएम + 1) +2 :
         दूसरे उप सरणी के तीसरे तत्व के सूचक होंगे,

     * (* (एआरएम + 1) +2) :
         दूसरे उप सरणी के तीसरे तत्व का मूल्य मिलेगा,
         एरो के समान [1] [2] ,

2-डी सरणी के समान, एकाधिक-डी सरणी में समान अभिव्यक्ति है।

 #include <iostream> using namespace std; int main() { //FOR 1-D ARRAY THROUGH ARRAY int brr[5]= {1,2,3,4,5}; for(int i=0; i<5; i++) { cout<<"address ["<<i<<"] = " <<&brr[i]<<" and value = "<<brr[i]<<endl; } //FOR 1-D ARRAY THROUGH POINTER cout<<endl; // endl TO MAKE OUT PUT LOOK CLEAR AND COOL :) int (*q)=brr; for(int i=0; i<5; i++) { cout<<"address ["<<i<<"] = " <<&brr[i]<<" and value = "<<*(q+i)<<endl; //(p[i][j]) } cout<<endl; //FOR 2-D ARRAY THROUGH ARRAY int arr[2][3] = {1,2,3,4,5,6}; for(int i=0; i<2; i++) { for(int j=0; j<3; j++) { cout<<"address ["<<i<<"]["<<j<<"] = " <<&arr[i][j]<<" and value = "<<arr[i][j]<<endl; } } //FOR 2-D ARRAY THROUGH POINTER int (*p)[3]=arr; // j value we give cout<<endl; for(int i=0; i<2; i++) { for(int j=0; j<3; j++) { cout<<"address ["<<i<<"]["<<j<<"] = " <<(*(p+i)+j)<<" and value = "<<(*(*(p+i)+j))<<endl; //(p[i][j]) } } return 0; } ==============OUT PUT====================== //FOR 1-D ARRAY THROUGH ARRAY address [0] = 0x28fed4 and value = 1 address [1] = 0x28fed8 and value = 2 address [2] = 0x28fedc and value = 3 address [3] = 0x28fee0 and value = 4 address [4] = 0x28fee4 and value = 5 //FOR 1-D ARRAY THROUGH POINTER address [0] = 0x28fed4 and value = 1 address [1] = 0x28fed8 and value = 2 address [2] = 0x28fedc and value = 3 address [3] = 0x28fee0 and value = 4 address [4] = 0x28fee4 and value = 5 //FOR 2-D ARRAY THROUGH ARRAY address [0][0] = 0x28fee8 and value = 1 address [0][1] = 0x28feec and value = 2 address [0][2] = 0x28fef0 and value = 3 address [1][0] = 0x28fef4 and value = 4 address [1][1] = 0x28fef8 and value = 5 address [1][2] = 0x28fefc and value = 6 //FOR 2-D ARRAY THROUGH POINTER address [0][0] = 0x28fee8 and value = 1 address [0][1] = 0x28feec and value = 2 address [0][2] = 0x28fef0 and value = 3 address [1][0] = 0x28fef4 and value = 4 address [1][1] = 0x28fef8 and value = 5 address [1][2] = 0x28fefc and value = 6