1
1

2D array'r কোন element কে pointer notation এর মাধ্যমে ব্যাবহার করার এই array_name[row][col] = ((array_name + row) + col) সূত্রটা কাজ করে কিভাবে? কেউ কোড + মেমোরি এড্রেসের মাধ্যমে একদন ক্লিয়ারলি বুঝায় দিলে উপকৃত হব।

ধন্যবাদ

asked 10 Feb '16, 03:38

_Shaon_'s gravatar image

_Shaon_
796537

edited 10 Feb '16, 03:42


কয়েকটি প্রশ্ন করার মাধ্যমে পয়েন্টার বুঝাটা একটু সহজ বলে আমার কাছে মনে হয়। আরো একটু বুঝার সুবিধার্থে আমরা পয়েন্টার হিসাব করার ক্ষেত্রে 1D এর বেশি ডাইমেনশন ধরবো না।

আপনার *(*(array_name + row) + col) এ আমরা জানি row এবং col হচ্ছে কোন integer ভ্যারিয়েবল, যা কন্সট্যান্ট। তাহলে মূল কাজ হলো array_name কে নিয়ে।

array_name:

এখন array_name এর উপর কিছু প্রশ্ন করবো।

১। এটা কি ভ্যালু? নাকি পয়েন্টার?

২। যদি পয়েন্টার হয়, তাহলে কিসের পয়েন্টার?

এখন খুঁজবো উত্তর।

১। এটা ভ্যালু না। কারণ এর ডিক্লিয়ারেশনে ডায়মেনশন আছে।

২। আমরা বলেছিলাম, হিসাবের সুবিধার্থে আমরা 1D এর বেশি ডায়মেনশন ধরবো না। তাহলে array_name কে 1D অ্যারের পয়েন্টার ধরলে এর প্রতিটা এলিমেন্ট হবে একেকটি 1D অ্যারে। এক কথায় তাহলে উত্তর হলো, এটি !D অ্যারের পয়েন্টার।

২য় প্রশ্নের উত্তর দরকার হচ্ছে যদি পয়েন্টার এদিক অদিক যায়, তাহলে অ্যাড্রেস ক্যালকুলেট করার জন্য।

array_name + row:

পয়েন্টারের সাথে + আছে মানে আমি এখন পয়েন্টার সরাবো। উপরের ২য় প্রশ্ন থেকে পেয়েছিলাম array_name একটি 1D অ্যারের পয়েন্টার। ধরলাম ওই 1D অ্যারের সাইজ এর সাথে প্রতি এলিমেন্টের জন্য মেমোরিতে যত বাইট নেয়, তা গুন করে পেয়েছি array_memory, যা একটি কন্সট্যান্ট। এখন পয়েন্টার যত ঘর সরাতে বলে (এখানে row ঘর) তত দিয়ে array_memory কে গুণ করে মেইন অ্যাড্রেসের সাথে যোগ করবো।

now_address = array_name + array_memory * row

*(array_name + row):

সব সময় মনে রাখতে হবে, এসব ক্ষেত্রে * দিয়ে আমরা একটা ডায়মেনশন ভিতরে ঢুকে যাই। এভাবে ভিতরে ততক্ষণ ঢুকতে পারবো, যতক্ষণ না ভ্যালুতে পৌছি। অর্থাৎ এখন আমরা কোন একটা রোতে গিয়ে ওই রোতে যে !D অ্যারেটা আছে, তাতে ঢুকছি। এবং পয়েন্টারটা প্রথম এলিমেন্টের অ্যাড্রেস হয়ে আছে। এখানে উল্লেখ্য যে, আপনি যদি প্রিন্ট দিয়ে দেখেন, তাহলে দেখবেন (array_name + row) এবং *(array_name + row) অ্যাড্রেস একই দেখাচ্ছে। পার্থক্য শুধু মাত্র আমরা এক ডায়মেনশন ভিতরে ঢুকে গেলাম।

এখন আমাদের পয়েন্টারটা এক ডায়মেনশন অ্যারের প্রথম এলিমেন্টে আছে। এখন আবার আগের ২টি প্রশ্ন করবো।

১। এটা কি ভ্যালু? নাকি পয়েন্টার?

২। যদি পয়েন্টার হয়, তাহলে কিসের পয়েন্টার?

যথারীতি আবার উত্তর খুঁজবো।

১। এটা ভ্যালু না। কারণ এর ডিক্লিয়ারেশনে এক ডায়মেনশনের ভিতর আরেক ডায়মেনশন আছে। যার একটা ডায়মেনশন আমরা * দিয়ে পার হয়ে এসেছি!

২। তাহলে সেই !D অ্যারের এলিমেন্টগুলো কি টাইপের? যে টাইপের হয়, এটা সে টাইপের অ্যারের পয়েন্টার। হিসাবের সুবিধার্থে আমরা ধরে নিলাম এটা char টাইপের।

(*(array_name + row) + col):

আবার পয়েন্টার সরাবো। ধরলাম ওই char অ্আর প্রতিটা এলিমেন্টের জন্য মেমোরিতে যত বাইট নেয়, তা value_memory, যা একটি কন্সট্যান্ট। এখন পয়েন্টার যত ঘর সরাতে বলে (এখানে col ঘর) তত দিয়ে value_memory কে গুণ করে মেইন অ্যাড্রেসের সাথে যোগ করবো।

now_address = new_address + value_memory * col

*(*(array_name + row) + col):

আরো এক ডায়মেনশন ভিতরে ঢুকে গেলাম। অর্থাৎ ২ ডায়মেনশনের ২টার ভিতর আমরা ঢুকে গিয়েছি। এখন আবার আগের প্রশ্ন।

১। এটা কি ভ্যালু? নাকি পয়েন্টার?

২। যদি পয়েন্টার হয়, তাহলে কিসের পয়েন্টার?

এবার উত্তর খুঁজে প্রথমটার উত্তর আসলো ভ্যালু। তাই আর ২য়টার উত্তর দেখলাম না। উল্লেখ্য, আগে * দিয়ে আমরা পয়েন্টারের ভিতরেই ঘুরছিলাম, তাই প্রিন্ট দিলে একই ভ্যালু দেখাচ্ছিলো, কিন্তু এখন কিন্তু প্রিন্ট দিলে আর একই ভ্যালু দেখাবে না। কারণ এর আগে ছিলাম পয়েন্টারে, এখন চলে এসেছি ভ্যালুতে।

শেষ কথাঃ

পয়েন্টারের এসব খুঁটিনাটি বিষয় জানার জন্য সবচেয়ে উপকারী হচ্ছে এব্যাপারে কিছু বেসিক জ্ঞান নেওয়ার পর নিজে নিজে প্রতিটা জিনিস প্রিন্ট দিয়ে দেখা এবং নিজের কন্সেপ্টকে ক্লিয়ার করা। বিশেষ করে আমি রিকমান্ড করবো সামসের বইয়ের পয়েন্টার চাপ্টারের শেষে একটা লিস্ট দেওয়া আছে বিভিন্ন পয়েন্টার এক্সেসিংয়ের। ওগুলো সব করে দেখলে পুরো ক্লিয়ার হয়ে যাওয়র কথা।

নিচের কোডটা চালিয়ে উপরের কিছু জিনিসের প্রমাণ পেতে পারেন।

#include<stdio.h>
char array_name[100][50];

int main()
{
    int row, col;
    row = 1;
    col = 5;
    scanf("%s", &array_name[1][0]); ///usually we write it like array_name[1]
    printf("You have entered = \"%s\", (array_name + row) = %d, *(array_name + row) = %d\n", array_name[1], (array_name + row) , *(array_name + row)); ///prints same address
    printf("(*(array_name + row) + col) = %d, *(*(array_name + row) + col) = %d\n",  (*(array_name + row) + col) , *(*(array_name + row) + col)); ///first one is pointer, second one is value
    return 0;
}
permanent link

answered 11 Feb '16, 09:34

manetsus's gravatar image

manetsus
2.2k211

1

সামসের বইটা কি বাংলায় লিখা? বইটা কোথায় পাবো?

(16 Feb '16, 15:29) _Shaon_

@emran2016 English এ লেখা। বাজারে বললেই হবে। নেটেও পাবেন। সামসের বই বললে সবাই চিনে। আর না পেলে আমাকে email id দিয়েন, mail করে দিবো। ধন্যবাদ।

(16 Feb '16, 18:48) manetsus
Your answer
toggle preview

Follow this question

By Email:

Once you sign in you will be able to subscribe for any updates here

By RSS:

Answers

Answers and Comments

Markdown Basics

  • *italic* or _italic_
  • **bold** or __bold__
  • link:[text](http://url.com/ "title")
  • image?![alt text](/path/img.jpg "title")
  • numbered list: 1. Foo 2. Bar
  • to add a line break simply add two spaces to where you would like the new line to be.
  • basic HTML tags are also supported

Question tags:

×90
×6

question asked: 10 Feb '16, 03:38

question was seen: 1,055 times

last updated: 16 Feb '16, 18:48