আক্ষরিক অর্থে মেমোরি হলো স্মৃতি । কম্পিউটার যখন কোনো প্রোগ্রাম চালায়, তখন ভ্যারিয়েবল, ডেটা আর নির্দেশনা (instructions) সাময়িকভাবে কোথাও সংরক্ষণ করতে হয় । যেখানে এগুলো কে সেইভ করে রাখা হয় সেটাই হলো মেমোরি । মেমোরি আসলে প্রাইমারি এবং সেকেন্ডারি এই দুই ধরনের হতে পারে । আপাতত আমরা মেমোরি বলতে প্রধান মেমোরি বা র্যাম (RAM) কে নিয়েই আলোচনা করছি ।
কম্পিউটার মূলত কাজ করে বাইনারি ডিজিট ( ০ এবং ১ ) নিয়ে । এই ০ বা ১ কে বলা হয় বিট ( Binary Digit = Bit ) । পরপর ৮টি বিট নিয়ে গঠিত হয় একটি বাইট (Byte) । এই বাইট কে আমরা মূলত প্রধান মেমোরি বা র্যাম এর ক্ষুদ্রতম একক বা Unit হিসেবে বিবেচনা করে থাকি । সহজ ভাষায়, র্যাম হচ্ছে অসংখ্য বাইটের সমাহার । র্যাম এর প্রতিটি বাইটের একটি একক ও অদ্বিতীয় ঠিকানা থাকে । একেই বলা হয় মেমোরি অ্যাড্রেস ।
মানে মেমোরি অ্যাড্রেস হলো মূলত প্রধান মেমোরি এর প্রতিটি বাইটের অ্যাড্রেস বা ঠিকানা ।
এই ঠিকানা বা মেমোরি অ্যাড্রেস মূলত হেক্সাডেসিম্যাল ফরম্যাট এ হয়ে থাকে । যেমনঃ 0x7ffe5367e044 একটি মেমোরি অ্যাড্রেস হতে পারে ।
সি তে কোনো ভ্যারিয়েবলের মেমোরি অ্যাড্রেস পেতে চাইলে ঐ ভ্যারিয়েবলের নামের আগে একটি & সাইন ব্যবহার করতে হয় । যেমনঃ নামের একটি ভ্যারিয়েবলের অ্যাড্রেস হবে । আর অ্যাড্রেস প্রিন্ট করার জন্য ফরম্যাট স্পেসিফায়ার হলো । এবার আসো উদাহরণের মাধ্যমে জিনিসটা দেখে নেই ।
1#include<stdio.h>
2#include<string.h>
3
4int main(){
5 int myVar = 3;
6 printf("Value of myVar is %d", myVar);
7 printf("\n");
8 printf("Address of myVar is %p", &myVar);
9 return 0;
10}
11Value of myVar is 3
Address of myVar is 000000000061FE1Cলক্ষ্য করো, লাইন ৮ এ আমরা এর অ্যাড্রেস প্রিন্ট করার জন্য ব্যবহার করেছি । এছাড়াও, আউটপুট এ তোমার মেমোরি অ্যাড্রেস ভিন্ন আসতেই পারে, তাতে সমস্যা নেই । পরের লেসনে আমরা পয়েন্টার পড়ার সময় দেখবো, এই অ্যাড্রেসটাকেও আরেকটা আলাদা ভ্যারিয়েবলে রাখা যায় এবং সেই অ্যাড্রেস ব্যবহার করে তখন আবার ঐ ভ্যারিয়েবলের মান ও ফেরত পাওয়া যায় ।
অ্যারে এর মেমোরি অ্যাড্রেস বোঝার জন্য আমরা নিচের প্রোগ্রামটি রান করে দেখি ।
1#include<stdio.h>
2#include<string.h>
3
4int main(){
5 int myArray[5] = {0, 1, 2, 3, 4, 5};
6 printf("Address of array name: %p", myArray);
7 printf("\n");
8 printf("Address of first element: %p", &myArray[0]);
9 printf("\n");
10 printf("Address of second element: %p", &myArray[1]);
11 printf("\n");
12 printf("Address of third element: %p", &myArray[2]);
13 return 0;
14}
15Address of array name: 000000000061FE00
Address of first element: 000000000061FE00
Address of second element: 000000000061FE04
Address of third element: 000000000061FE08এখানে খেয়াল করে দেখোঃ
লক্ষ্য করো, অ্যারে এর নাম হলো প্রকৃতপক্ষে তার প্রথম উপাদানের অ্যাড্রেস । যেহেতু অ্যারে এর নামটি নিজেই একটি অ্যাড্রেস, তাই এর আগে আমরা & সাইন ব্যবহার করি নি ।
যেহেতু অ্যারে এর নাম আর তার প্রথম উপাদান একই অ্যাড্রেস নির্দেশ করছে, তাই আউটপুটের প্রথম দুইটি লাইনে আমরা আউটপুট অ্যাড্রেস একই পাবো ।
হলো একটি টাইপের অ্যারে । বেশিরভাগ সিস্টেমে টাইপের ভ্যারিয়েবল গুলো 4 বাইট জায়গা দখল করে । আর যেহেতু অ্যারে এর উপাদান গুলো মেমোরিতে পরপর সাজানো থাকে, তাই অ্যারে এর উপাদানগুলোর মধ্যে পার্থক্য সবসময় 4 বজায় থাকছে ।
তোমরা জানো, স্ট্রিং হচ্ছে টাইপের একটি অ্যারে । তাই অ্যারে আর স্ট্রিং এর মেমোরি অ্যাড্রেস একই রকম ভাবে কাজ করে । নিচের উদাহরণটি দেখোঃ
1#include<stdio.h>
2#include<string.h>
3
4int main(){
5 char myString[5] = "hello";
6 printf("Address of string name: %p", myString);
7 printf("\n");
8 printf("Address of first element: %p", &myString[0]);
9 printf("\n");
10 printf("Address of second element: %p", &myString[1]);
11 printf("\n");
12 printf("Address of third element: %p", &myString[2]);
13 return 0;
14}
15Address of string name: 000000000061FE1B
Address of first element: 000000000061FE1B
Address of second element: 000000000061FE1C
Address of third element: 000000000061FE1Dএখানেও আমরা আগের মতোই দেখতে পাচ্ছি, স্ট্রিং টার নাম হলো এর প্রথম উপাদানের অ্যাড্রেস । শুধু এখানে যেই পার্থক্য টা দেখা যাবে সেটা হলো, উপাদানগুলোর মেমোরি অ্যাড্রেস এক্ষেত্রে 1 করে বাড়ছে । কারণ টাইপের ডেটা রাখতে 1 বাইটের প্রয়োজন হয় ।
