#include <stdio.h>
int main()
{
    int *p;
    int i,a[10];
    p = &a;
    printf("Give 5 values in array: ");
    for(i=0;i<5;i++)
        scanf("%d",&p[i]);
    printf("\n\n");
    for(i=4;i>=0;i--)
        printf("%d",p[i]);
    return 0;
}

এই প্রোগ্রামটাতে অ্যারে a ডিক্লেয়ার করা হয়েছে এবং পয়েন্টার p ডিক্লেয়ার করা হয়েছে। কিন্তু অ্যারের মান ইনপুট নেয়ার ক্ষেত্রে for লুপের ভেতরে আমরা a অ্যারে ব্যবহার না করে p অ্যারে ব্যববার করছি যেখানে আমরা p বলতে কোন পয়েন্টার অ্যারে/ নরমাল অ্যারে কিছুই ডিক্লেয়ার করি নি। এই জায়গাটায় যদি কেউ বুঝিয়ে দিতেন যে কিভাবে আমরা এখানে p[i] অ্যারে দিয়ে মান ইনপুট নিচ্ছি।

asked 08 Nov, 05:25

sagormahtab's gravatar image

sagormahtab
212

edited 13 Nov, 04:49

menon's gravatar image

menon
3.9k222


int a[10] যখন লেখা হয় তখন a কে একটা অ্যাড্রেস দেয়া হয় । আমরা জানি পয়েন্টার ভ্যারিয়েবল যেকোনো ভ্যারিয়েবলের অ্যাড্রেসকে ধরে রাখতে পারে । তাই আমরা যখন p = &a লিখছি তখন a এর অ্যাড্রেস p তে কপি হয়ে যাচ্ছে । যার ফলে p, a একই জিনিস হয়ে যাচ্ছে ।

আপনি যদি p = &a এই লাইনের পরে এভাবে প্রিন্ট করেন তবে ,

printf("Address of a is =  %d\n", a);
printf("Address of p is = %d\n", p);

আউটপুটঃ

Address of a is = 1385164000
Address of p is = 1385164000

এখানে লক্ষ করুন a, p এর অ্যাড্রেস কিন্তু একই সংখ্যা । আপনার ক্ষেত্রে ভিন্ন সংখ্যা আসতে পারে । কিন্তু a, p এর মান একই হবে।

যেহেতু দুটো একই জিনিস তাই আমরা p[i] দিয়ে ইনপুট নিতে পারছি এবং প্রিন্টও করতে পারছি।

আপডেটঃ

আপনার কমেন্টের উত্তরঃ
পয়েন্টার টাইপ অ্যারের ক্ষেত্রে দুইভাবে ইনপুট নেওয়া ও আউটপুট প্রিন্ট করা যায় ।

প্রথমতঃ আপনি আপনার এই প্রোগ্রামে এই নিচের মত করেও I/O নিতে পারেন ।

printf("Enter 5 numbers: ");
for(i = 0; i < 5; i++) {
    scanf("%d", p + i); // ইনপুট নিলাম
}
printf("\n\n");
for(i = 0; i < 5; i++) {
    printf("%d ", *(p + i)); // প্রিন্ট করলাম 
}

আমরা যদি শুধু p লিখি তবে সেটা প্রথম অ্যাড্রেস নির্দেশ করে। ২য় অ্যাড্রেস এ যেতে হলে আমাকে p + 1 লিখতে হবে । একই ভাবে p + 2 হল ৩য় অ্যাড্রেস । p + i = i তম অ্যাড্রেস ।

প্রিন্ট করার সময় আমরা * দিয়ে প্রিন্ট করেছি। *(p + i) দিয়ে বোঝাচ্ছি যে i তম অ্যাড্রেস এ যে মান আছে সেটা প্রিন্ট করবে ।

দ্বিতীয়তঃ ২য় নিয়ম হল আপনি যেভাবে ব্যবহার করেছেন সেটা।

আশা করি বুঝতে পেরেছেন।

ধন্যবাদ।

permanent link

answered 08 Nov, 06:28

menon's gravatar image

menon
3.9k222

edited 10 Nov, 03:15

Mosharraf%20Hosain's gravatar image

Mosharraf Hosain ♦
7618

1

অসংখ্য ধন্যবাদ ভাই । কিন্তু এরপরেও আমার একটা প্রশ্ন ছিলো। যদি আমরা int *p লিখে একটা পয়েন্টার ভ্যারিয়েবল ডিক্লেয়ার করি তবে পরবর্তীতে *p অন্য ভ্যারিয়েবলের মান এবং শুধু p অন্য একটা ভ্যারিয়েবলের অ্যাড্রেস নির্দেশ করে। তাহলে উপরের প্রোগ্রামটায় আপনি যেটা বললেন p = &a করায় p ও a একই জিনিষ হয়ে গেছে। এক না হয় হলো কিন্তু এরপরে তো আমরা আর পয়েন্টারের নিয়মটাই মানছি না। p[i] এর মাধ্যমে এখন আমরা নরমাল অ্যারে ভ্যারিয়েবল এর মত মান ইনপুট নিচ্ছি। যেখানে p দিয়ে এড্রেস আর *p দিয়ে ভ্যালু নির্দেশ করার কথা ছিলো! অথচ এখন p সাধারণ অ্যারের মত কাজ করছে। p কি এখন তাহলে আর পয়েন্টার না সাধারণ অ্যারে হয়ে গেছে?

(08 Nov, 21:37) sagormahtab
1

@sagormahtab উত্তর এডিট করে দিলাম

(09 Nov, 05:20) menon

@menon আপনাকে আবারও ধন্যবাদ ভাই। এইবার আমার কাছে বিষয়টা পরিষ্কার হয়েছে। আসলে আমি প্রথম নিয়মটার কথা জানতাম, সব জায়গায় ওইভাবেই করা দেখেছি এবং ওইভাবেই করেছি। ২য় নিয়মটা জানা ছিলো না তাই দ্বিধায় পড়েছিলাম। এখন আমি পরিষ্কারভাবে বুঝতে পেরেছি। আপনাকে আবারো ধন্যবাদ।

(12 Nov, 12:40) sagormahtab
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:

×353
×16
×2

question asked: 08 Nov, 05:25

question was seen: 71 times

last updated: 15 Nov, 11:26