এটি পুরোপুরি বুঝতে, আপনাকে নিম্নলিখিত ধারণাগুলি উপলব্ধি করতে হবে :
অ্যারে পয়েন্টার নয়!
প্রথমত (এবং এটি যথেষ্ট প্রচার করা হয়েছে), অ্যারেগুলি পয়েন্টার নয় । পরিবর্তে, বেশিরভাগ ব্যবহারে, তারা তাদের প্রথম উপাদানটির ঠিকানার 'ক্ষয়' হয়ে থাকে, যা কোনও পয়েন্টারকে বরাদ্দ করা যেতে পারে:
int a[] = {1, 2, 3};
int *p = a; // p now points to a[0]
আমি ধরে নিলাম এটি এইভাবে কাজ করে যাতে অ্যারের সামগ্রীর সমস্তটি অনুলিপি না করেই অ্যাক্সেস করা যায়। এটি কেবল অ্যারের ধরণের আচরণ এবং বোঝানো হয় না যে তারা একই জিনিস।
বহুমাত্রিক অ্যারে
কম্পাইলার / মেশিনটি বুঝতে এবং পরিচালনা করতে পারে এমনভাবে পার্টিশন মেমরির একমাত্র উপায় মাত্র বহুমাত্রিক অ্যারে।
উদাহরণস্বরূপ, int a[4][3][5]
= 4 * 3 * 5 (60) পূর্ণসংখ্যার আকারের মেমরির 'অংশগুলি' রয়েছে এমন একটি অ্যারে।
int a[4][3][5]
বনাম প্লেইন ব্যবহার করার সুবিধাটি int b[60]
হ'ল তারা এখন 'বিভাজন' হয়েছে (তাদের 'খণ্ডগুলি' দিয়ে কাজ করা সহজ, যদি প্রয়োজন হয়), এবং প্রোগ্রামটি এখন বাউন্ড চেকিং করতে পারে।
বস্তুত, int a[4][3][5]
সংরক্ষণ করা হয় ঠিক মত int b[60]
মেমরি - শুধুমাত্র পার্থক্য যে প্রোগ্রাম এখন এটি পরিচালনা করে যেন তারা নির্দিষ্ট আকারের পৃথক সত্বা হন (বিশেষভাবে, পাঁচটি তিনটি গ্রুপ চার গ্রুপ)।
মনে রাখবেন: উভয় int a[4][3][5]
এবং int b[60]
মেমরি একই আছে, এবং শুধু পার্থক্য কিভাবে তারা আবেদন / কম্পাইলার দ্বারা পরিচালিত করছি
{
{1, 2, 3, 4, 5}
{6, 7, 8, 9, 10}
{11, 12, 13, 14, 15}
}
{
{16, 17, 18, 19, 20}
{21, 22, 23, 24, 25}
{26, 27, 28, 29, 30}
}
{
{31, 32, 33, 34, 35}
{36, 37, 38, 39, 40}
{41, 42, 43, 44, 45}
}
{
{46, 47, 48, 49, 50}
{51, 52, 53, 54, 55}
{56, 57, 58, 59, 60}
}
এ থেকে আপনি পরিষ্কার দেখতে পাচ্ছেন যে প্রতিটি "পার্টিশন" কেবলমাত্র একটি অ্যারে যা প্রোগ্রামটি ট্র্যাক করে।
বাক্য গঠন
এখন অ্যারেগুলি বিন্দুগতভাবে পয়েন্টার থেকে পৃথক । বিশেষত, এর অর্থ এটি সংকলক / মেশিন তাদের সাথে অন্যরকম আচরণ করবে। এটি মস্তিষ্কের মত মনে হচ্ছে না তবে এটি একবার দেখুন:
int a[3][3];
printf("%p %p", a, a[0]);
উপরের উদাহরণটি একই মেমরি ঠিকানাটি দু'বার মুদ্রণ করে:
0x7eb5a3b4 0x7eb5a3b4
তবে কেবলমাত্র একজনকে সরাসরি সরাসরি পয়েন্টারে নির্ধারিত করা যেতে পারে :
int *p1 = a[0]; // RIGHT !
int *p2 = a; // WRONG !
কেন a
একটি পয়েন্টার বরাদ্দ করা যাবে না তবে a[0]
?
এটি কেবলমাত্র বহুমাত্রিক অ্যারের ফলাফল এবং আমি ব্যাখ্যা করব কেন:
' a
' এর স্তরে , আমরা এখনও দেখতে পাচ্ছি যে আমাদের অপেক্ষার জন্য আরও একটি 'মাত্রা' রয়েছে। ' a[0]
' এর স্তরে যাইহোক, আমরা ইতিমধ্যে শীর্ষ মাত্রায় রয়েছি, সুতরাং যতক্ষণ না প্রোগ্রাম সম্পর্কিত, আমরা কেবল একটি সাধারণ অ্যারে খুঁজছি।
আপনি জিজ্ঞাসা করা হতে পারে:
অ্যারে যদি এটির জন্য একটি পয়েন্টার তৈরির ক্ষেত্রে বহুমাত্রিক হয় তবে এটি কেন গুরুত্বপূর্ণ?
এইভাবে চিন্তা করা ভাল:
বহুমাত্রিক অ্যারে থেকে 'ক্ষয়' কেবল একটি ঠিকানা নয়, পার্টিশন ডেটাযুক্ত একটি ঠিকানা (একে এটি এখনও বুঝতে পারে যে এর অন্তর্নিহিত ডেটা অন্যান্য অ্যারে দিয়ে তৈরি), এটি প্রথম মাত্রার বাইরে অ্যারের দ্বারা নির্ধারিত সীমানা নিয়ে গঠিত।
এই 'পার্টিশন' যুক্তিটি পয়েন্টারের মধ্যে উপস্থিত না থাকতে পারে যতক্ষণ না আমরা এটি উল্লেখ করি:
int a[4][5][95][8];
int (*p)[5][95][8];
p = a; // p = *a[0] // p = a+0
অন্যথায়, অ্যারের বাছাই করার বৈশিষ্ট্যগুলির অর্থ হারিয়ে যায়।
চারপাশে প্রথম বন্ধনী ব্যবহারের বিষয়টিও নোট করুন *p
: int (*p)[5][95][8]
- এটি নির্দিষ্ট করতে হবে যে আমরা এই সীমানাগুলি দিয়ে একটি পয়েন্টার তৈরি করছি, এই সীমাগুলির সাথে পয়েন্টারের একটি অ্যারে নয়:int *p[5][95][8]
উপসংহার
চলো পর্যালোচনা করি:
- ব্যবহৃত প্রসঙ্গে যদি তাদের অন্য কোনও উদ্দেশ্য না থাকে তবে অ্যারে ঠিকানাগুলিতে ক্ষয় হয়
- বহুমাত্রিক অ্যারে কেবল অ্যারেগুলির অ্যারে - সুতরাং, 'ক্ষয়প্রাপ্ত' ঠিকানাটি "আমার উপ-মাত্রা আছে" এর বোঝা বহন করবে
- আপনি যদি এটি না দেন তবে মাত্রা ডেটা কোনও পয়েন্টারে উপস্থিত থাকতে পারে না ।
সংক্ষেপে: বহুমাত্রিক অ্যারেগুলিতে ক্ষয় হয় এমন ঠিকানাগুলিতে যা তাদের বিষয়বস্তু বোঝার ক্ষমতা রাখে।