পয়েন্টারগুলি বোঝার ক্ষেত্রে বাধাগুলি কী কী এবং সেগুলি অতিক্রম করতে কী করা যেতে পারে? [বন্ধ]


449

কেন পয়েন্টার বিভ্রান্তির যেমন একটি নেতৃস্থানীয় ফ্যাক্টর অনেক নতুন এমনকি বয়সী, C অথবা সি কলেজ পর্যায়ে শিক্ষার্থী এবং ++,? এমন কোনও সরঞ্জাম বা চিন্তার প্রক্রিয়া রয়েছে যা আপনাকে বুঝতে সাহায্য করেছিল যে পয়েন্টারগুলি ভেরিয়েবল, ফাংশন এবং স্তরের বাইরে কীভাবে কাজ করে?

সামগ্রিক ধারণায় জর্জরিত না হয়ে কাউকে "আহ-হা, আমি পেয়েছি" এর স্তরে নিয়ে যাওয়ার জন্য কিছু ভাল অনুশীলনের জিনিসগুলি কী কী হতে পারে? মূলত, দৃশ্যের মতো ড্রিল।


20
এই প্রশ্নের থিসিসটি হ'ল পয়েন্টারগুলি বোঝা শক্ত। প্রশ্নটি কোনও প্রমাণ দেয় না যে পয়েন্টারগুলি অন্য যে কোনও কিছুর চেয়ে বোঝা শক্ত।
bmargulies

14
সম্ভবত আমি কিছু মিস করছি (কারণ আমি জিসিসি ভাষাগুলিতে কোড করি) তবে আমি সর্বদা ভাবতাম যদি মেমোরিতে কোনও কী-> মান কাঠামো হিসাবে চিহ্নিত হয়। যেহেতু কোনও প্রোগ্রামে প্রচুর পরিমাণে ডেটা পাস করা ব্যয়বহুল, আপনি কাঠামোটি তৈরি করেন (মান) এবং এর পয়েন্টার / রেফারেন্স (কী) এর চারপাশে পাস করুন কারণ কীটি বৃহত্তর কাঠামোর অনেক ছোট উপস্থাপনা is শক্ত অংশটি হ'ল যখন আপনাকে দুটি পয়েন্টার / রেফারেন্সের তুলনা করতে হবে (আপনি কীগুলি বা মানগুলি তুলনা করছেন) যা কাঠামোর (মান) এর মধ্যে থাকা ডেটাগুলিতে ভাঙ্গতে আরও বেশি কাজ প্রয়োজন।
ইভান প্লেস

2
@ ওল্ফপ্যাক'০৮ "মনে হয় ঠিকানায় থাকা স্মৃতিটি সর্বদা একটি অন্তর্দৃষ্টি হবে" " - তাহলে আপনার কাছে মনে হবে যে কোনও কিছুরই প্রকার নেই, কারণ এগুলি সমস্তই মেমরির বিট। "আসলে, পয়েন্টার ধরন Var পয়েন্টার পয়েন্ট ধরনের" - না, পয়েন্টার এর প্রকার পয়েন্টার যা প্রাকৃতিক এবং সুস্পষ্ট হতে হবে - পয়েন্টার পয়েন্ট Var ধরণ।
জিম বাল্টার

2
আমি সবসময় ভাবতাম যে এই বিষয়টি বুঝতে এত কঠিন যে ভেরিয়েবলগুলি (এবং ফাংশনগুলি) কেবল মেমরির ব্লক এবং পয়েন্টারগুলি মেমরিের ঠিকানাগুলি সঞ্চয় করে চলকগুলি vari এটি সম্ভবত খুব ব্যবহারিক চিন্তাধারার মডেলটি বিমূর্ত ধারণাগুলির সমস্ত অনুরাগীদের প্রভাবিত করতে পারে না, তবে এটি পয়েন্টারগুলি কীভাবে কাজ করে তা পুরোপুরি বুঝতে সহায়তা করে।
খ্রিস্টান রাউ

8
সংক্ষেপে, শিক্ষার্থীরা সম্ভবত বুঝতে পারে না কারণ তারা সঠিকভাবে বুঝতে পারে না বা মোটেও কোনও কম্পিউটারের স্মৃতি সাধারণভাবে কীভাবে হয় এবং বিশেষত সি "মেমরি মডেল" কাজ করে। গ্রাউন্ড আপ থেকে প্রোগ্রামিং এই বইটি এই বিষয়গুলির উপর একটি খুব ভাল পাঠ দেয়।
আব্বাফাই

উত্তর:


745

পয়েন্টারগুলি একটি ধারণা যা অনেকের পক্ষে প্রথমে বিভ্রান্তিকর হতে পারে, বিশেষত যখন চারপাশে পয়েন্টার মানগুলি অনুলিপি করার এবং একই মেমরি ব্লকের উল্লেখ করার ক্ষেত্রে আসে।

আমি খুঁজে পেয়েছি যে সবচেয়ে ভাল সাদৃশ্যটি হ'ল পয়েন্টারটিকে একটি বাড়ির ঠিকানা সহ কাগজের টুকরো হিসাবে বিবেচনা করা এবং মেমরিটিকে এটি প্রকৃত বাড়ি হিসাবে উল্লেখ করে block সমস্ত ধরণের অপারেশনকে সহজেই ব্যাখ্যা করা যেতে পারে।

আমি নীচে কিছু ডেলফি কোড যুক্ত করেছি এবং যেখানে উপযুক্ত সেখানে কিছু মন্তব্য। আমার অন্যান্য মূল প্রোগ্রামিং ল্যাঙ্গুয়েজ, সি #, যেহেতু মেমরি ফাঁসের মতো জিনিসগুলি একইভাবে প্রদর্শন করে না, তাই আমি ডেলফি বেছে নিয়েছি।

আপনি যদি কেবল পয়েন্টারগুলির উচ্চ-স্তরের ধারণাটি শিখতে চান তবে নীচের ব্যাখ্যায় আপনার "মেমরি লেআউট" লেবেলযুক্ত অংশগুলি উপেক্ষা করা উচিত। অপারেশনগুলির পরে স্মৃতি কী হতে পারে তার উদাহরণ দেওয়ার জন্য তাদের লক্ষ্য, তবে এগুলি প্রকৃতির নিম্ন স্তরের। তবে, বাফার কীভাবে প্রকৃতপক্ষে কাজ করে তা সঠিকভাবে ব্যাখ্যা করার জন্য, আমি এই চিত্রগুলি যুক্ত করাই গুরুত্বপূর্ণ ছিল।

দাবি অস্বীকার: সমস্ত উদ্দেশ্য এবং উদ্দেশ্যে, এই ব্যাখ্যা এবং উদাহরণ মেমরি লেআউটগুলি ব্যাপকভাবে সরল করা হয়েছে। নিম্ন স্তরের ভিত্তিতে আপনার স্মৃতিচারণ করতে হবে কিনা তা জানতে আপনার আরও অনেক ওভারহেড এবং আরও অনেক বিশদ রয়েছে। তবে মেমরি এবং পয়েন্টার ব্যাখ্যা করার উদ্দেশ্যে, এটি যথেষ্ট সঠিক for


আসুন ধরে নেওয়া যাক নীচে ব্যবহৃত থাউস ক্লাসটি এরকম দেখাচ্ছে:

type
    THouse = class
    private
        FName : array[0..9] of Char;
    public
        constructor Create(name: PChar);
    end;

আপনি যখন বাড়ির অবজেক্টটি সূচনা করেন, তখন কনস্ট্রাক্টরকে দেওয়া নামটি ব্যক্তিগত ক্ষেত্রের এফএনমে অনুলিপি করা হয়। এটি একটি নির্দিষ্ট আকারের অ্যারে হিসাবে সংজ্ঞায়িত হওয়ার একটি কারণ রয়েছে।

স্মৃতিতে, বাড়ির বরাদ্দের সাথে কিছু ওভারহেড যুক্ত হবে, আমি এটি নীচে এটি চিত্রিত করব:

--- [ttttNNNNNNNNNN] ---
     ^ ^
     | |
     | + - FName অ্যারে
     |
     + - ওভারহেড

"টিটিটিএটি" অঞ্চলটি ওভারহেডে রয়েছে, সাধারণত 8 বা 12 বাইটের মতো বিভিন্ন ধরণের রানটাইম এবং ভাষার জন্য এখানে আরও বেশি কিছু থাকবে। এটি জরুরী যে এই অঞ্চলে যা মান রয়েছে তা মেমরির বরাদ্দকারী বা মূল সিস্টেমের রুটিন ব্যতীত অন্য কোনও কিছুর দ্বারা কখনই পরিবর্তন হয় না বা আপনি প্রোগ্রামটি ক্র্যাশ হওয়ার ঝুঁকিপূর্ণ হন।


স্মৃতি বরাদ্দ

আপনার বাড়ি তৈরির জন্য একজন উদ্যোক্তা পান এবং আপনাকে বাড়ির ঠিকানা দিন। বাস্তব বিশ্বের বিপরীতে, মেমরি বরাদ্দ কোথায় বরাদ্দ করা যায় তা বলা যায় না, তবে পর্যাপ্ত ঘর সহ একটি উপযুক্ত স্পট খুঁজে পাবেন এবং বরাদ্দকৃত স্মৃতিতে ঠিকানাটি রিপোর্ট করবেন।

অন্য কথায়, উদ্যোক্তা স্পটটি বেছে নেবে।

THouse.Create('My house');

স্মৃতি বিন্যাস:

--- [ttttNNNNNNNNNN] ---
    আমার বাড়ি

ঠিকানার সাথে একটি ভেরিয়েবল রাখুন

কাগজের টুকরোতে নিজের নতুন বাড়িতে ঠিকানা লিখুন। এই কাগজটি আপনার বাড়ির রেফারেন্স হিসাবে কাজ করবে। এই কাগজের টুকরো ব্যতীত, আপনি হারিয়ে গেছেন এবং বাড়িটি খুঁজে পাবেন না, যদি না আপনি ইতিমধ্যে এতে না থাকেন।

var
    h: THouse;
begin
    h := THouse.Create('My house');
    ...

স্মৃতি বিন্যাস:

    জ
    বনাম
--- [ttttNNNNNNNNNN] ---
    আমার বাড়ি

পয়েন্টার মানটি অনুলিপি করুন

কেবল কাগজের নতুন টুকরোতে ঠিকানা লিখুন। আপনার কাছে এখন দুটি টুকরো কাগজ রয়েছে যা আপনাকে একই বাড়িতে পৌঁছে দেবে, দুটি পৃথক বাড়ি নয়। কোনও কাগজ থেকে ঠিকানাটি অনুসরণ করার এবং সেই বাড়ির আসবাবের পুনঃব্যবস্থা করার যে কোনও প্রয়াসই এটিকে মনে করবে যে অন্য ঘরটি একই পদ্ধতিতে পরিবর্তিত হয়েছে, যদি না আপনি পরিষ্কারভাবে সনাক্ত করতে পারেন যে এটি আসলে একটি মাত্র বাড়ি।

দ্রষ্টব্য এটি সাধারণত ধারণাটি যে আমার কাছে মানুষকে বোঝাতে সবচেয়ে বেশি সমস্যা হয়, দুটি পয়েন্টার বলতে দুটি বস্তু বা মেমরি ব্লক বোঝায় না।

var
    h1, h2: THouse;
begin
    h1 := THouse.Create('My house');
    h2 := h1; // copies the address, not the house
    ...
    H1
    বনাম
--- [ttttNNNNNNNNNN] ---
    আমার বাড়ি
    ^
    H2

স্মৃতি মুক্ত করা হচ্ছে

বাড়িটি ভেঙে ফেলুন। এরপরে আপনি যদি চান তবে নতুন ঠিকানার জন্য কাগজটি পুনরায় ব্যবহার করতে পারেন, বা বাড়ির ঠিকানাটি ভুলে যাওয়ার জন্য এটি পরিষ্কার করার জন্য এটি পরিষ্কার করতে পারেন that

var
    h: THouse;
begin
    h := THouse.Create('My house');
    ...
    h.Free;
    h := nil;

এখানে আমি প্রথমে ঘরটি তৈরি করি এবং এর ঠিকানাটি ধরে রাখি। তারপরে আমি ঘরে কিছু করব (এটি ব্যবহার করুন, ... কোডটি পাঠকের জন্য অনুশীলন হিসাবে ছেড়ে দেওয়া হয়েছে), এবং তারপরে আমি এটিকে মুক্ত করি। শেষ পর্যন্ত আমি আমার পরিবর্তনশীল থেকে ঠিকানাটি সাফ করি।

স্মৃতি বিন্যাস:

    এইচ <- +
    v + - বিনামূল্যে আগে
--- [ttttNNNNNNNNNN] --- |
    1234 আমার বাড়ি <- +

    এইচ (এখন আর কোথাও নির্দেশ করে না) <- +
                                + - নিখরচায়
---------------------- | (নোট, স্মৃতি এখনও থাকতে পারে
    xx34 আমার বাড়ি <- + কিছু ডেটা রয়েছে)

ঝুলন্ত পয়েন্টার

আপনি আপনার উদ্যোক্তাকে বাড়িটি ধ্বংস করতে বলেছিলেন, তবে আপনি নিজের কাগজের টুকরোটি থেকে ঠিকানাটি মুছতে ভুলে গেছেন। পরে যখন আপনি কাগজের খণ্ডটি দেখুন, আপনি ভুলে গেছেন যে বাড়িটি আর নেই, এবং ব্যর্থ ফলাফলের সাথে এটি পরিদর্শন করতে যান (নীচে একটি অবৈধ রেফারেন্সের অংশটিও দেখুন)।

var
    h: THouse;
begin
    h := THouse.Create('My house');
    ...
    h.Free;
    ... // forgot to clear h here
    h.OpenFrontDoor; // will most likely fail

ব্যবহার hথেকে কল পর .Free যথাসাধ্য কাজ, কিন্তু যে শুধু বিশুদ্ধ ভাগ্য হয়। সম্ভবত এটি একটি গ্রাহকের জায়গায়, একটি সমালোচনামূলক অপারেশনের মাঝখানে ব্যর্থ হবে।

    এইচ <- +
    v + - বিনামূল্যে আগে
--- [ttttNNNNNNNNNN] --- |
    1234 আমার বাড়ি <- +

    এইচ <- +
    v + - বিনামূল্যে পরে
---------------------- |
    xx34 আমার বাড়ি <- +

আপনি দেখতে পাচ্ছেন, এইচটি এখনও মেমরিতে থাকা ডেটাগুলির অবশিষ্টাংশগুলিকে নির্দেশ করে তবে যেহেতু এটি সম্পূর্ণ নাও হতে পারে তাই এটিকে আগের মতো ব্যবহার করা ব্যর্থ হতে পারে।


মেমরি লিক

আপনি কাগজের টুকরোটি হারিয়েছেন এবং বাড়িটি খুঁজে পাচ্ছেন না। বাড়িটি এখনও অন্য কোথাও দাঁড়িয়ে আছে এবং আপনি যখন পরে নতুন বাড়ি তৈরি করতে চান, আপনি সেই জায়গাটি পুনরায় ব্যবহার করতে পারবেন না।

var
    h: THouse;
begin
    h := THouse.Create('My house');
    h := THouse.Create('My house'); // uh-oh, what happened to our first house?
    ...
    h.Free;
    h := nil;

এখানে আমরা hনতুন বাড়ির ঠিকানা দিয়ে ভেরিয়েবলের বিষয়বস্তুগুলিকে ওভাররোট করেছিলাম, তবে পুরানোটি এখনও দাঁড়িয়ে আছে ... কোথাও। এই কোডের পরে, সেই বাড়িতে পৌঁছানোর কোনও উপায় নেই এবং এটি দাঁড়িয়ে থাকবে। অন্য কথায়, বরাদ্দ হওয়া মেমরিটি অ্যাপ্লিকেশন বন্ধ না হওয়া অবধি বরাদ্দ থাকবে, যেখানে অপারেটিং সিস্টেম এটিকে ছিন্ন করবে।

প্রথম বরাদ্দের পরে মেমরি লেআউট:

    জ
    বনাম
--- [ttttNNNNNNNNNN] ---
    আমার বাড়ি

দ্বিতীয় বরাদ্দের পরে মেমরি লেআউট:

                       জ
                       বনাম
--- [ttttNNNNNNNNNN] --- [ttttNNNNNNNNNN]
    1234 আমার বাড়ি 5678 আমার বাড়ি

এই পদ্ধতিটি পাওয়ার আরও একটি সাধারণ উপায় হ'ল উপরের লেখার চেয়ে ওভাররাইট না করে কেবল কিছু মুক্ত করা ভুলে যাওয়া। ডেল্ফির ভাষায়, এটি নিম্নলিখিত পদ্ধতির সাথে ঘটবে:

procedure OpenTheFrontDoorOfANewHouse;
var
    h: THouse;
begin
    h := THouse.Create('My house');
    h.OpenFrontDoor;
    // uh-oh, no .Free here, where does the address go?
end;

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

স্মৃতি বিন্যাস:

    এইচ <- +
    পয়েন্টার হারানোর আগে v + -
--- [ttttNNNNNNNNNN] --- |
    1234 আমার বাড়ি <- +

    এইচ (এখন আর কোথাও নির্দেশ করে না) <- +
                                + - পয়েন্টার হারানোর পরে
--- [ttttNNNNNNNNNN] --- |
    1234 আমার বাড়ি <- +

আপনি দেখতে পাচ্ছেন, পুরানো ডেটা মেমরিতে অক্ষত রয়েছে, এবং মেমরি বরাদ্দকারী পুনরায় ব্যবহার করবে না। বরাদ্দকারী মেমরির কোন ক্ষেত্রগুলি ব্যবহৃত হয়েছে সে সম্পর্কে নজর রাখে এবং আপনি এটিকে মুক্ত না করে এগুলি পুনরায় ব্যবহার করবেন না।


মেমরিটি মুক্ত করা কিন্তু একটি রেফারেন্স (এখন অবৈধ) রাখা

বাড়িটি ভেঙে ফেলুন, কাগজের টুকরোগুলির একটি মুছে ফেলুন তবে এতে পুরানো ঠিকানার সাথে অন্য একটি কাগজের কাগজও রয়েছে, যখন আপনি ঠিকানায় যান, আপনি কোনও বাড়ি পাবেন না, তবে আপনি এমন কোনও কিছু খুঁজে পাবেন যা ধ্বংসাবশেষের অনুরূপ find এক।

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

কখনও কখনও আপনি এমনকি দেখতে পাবেন যে প্রতিবেশী ঠিকানায় তার পরিবর্তে একটি বড় ঘর স্থাপন করা হয়েছে যা তিনটি ঠিকানা দখল করে (মেইন স্ট্রিট 1-3) এবং আপনার ঠিকানা বাড়ির মাঝখানে চলে যায়। বৃহত 3-ঠিকানা বাড়ির সেই অংশটিকে একটি একক ছোট ঘর হিসাবে বিবেচনা করার কোনও প্রচেষ্টাও মারাত্মকভাবে ব্যর্থ হতে পারে।

var
    h1, h2: THouse;
begin
    h1 := THouse.Create('My house');
    h2 := h1; // copies the address, not the house
    ...
    h1.Free;
    h1 := nil;
    h2.OpenFrontDoor; // uh-oh, what happened to our house?

এখানে ঘরটি রেফারেন্সের মাধ্যমে ভেঙে ফেলা হয়েছিল h1এবং পাশাপাশি h1সাফ করা h2হলেও এখনও পুরাতন, পুরানো, পুরাতন ঠিকানা রয়েছে। যে বাড়িতে এখন আর দাঁড়িয়ে নেই তার অ্যাক্সেস সম্ভবত কাজ নাও করতে পারে।

এটি উপরের ঝুলন্ত পয়েন্টারের একটি বৈচিত্র। এর স্মৃতি বিন্যাস দেখুন।


বাফারকে ছাড়িয়ে গেছে

প্রতিবেশীদের বাড়ি বা আঙ্গিনায় ছড়িয়ে ছিটিয়ে আপনি যতটা ফিট করতে পারেন তার চেয়ে বেশি জিনিস আপনি ঘরে সরিয়ে নিয়ে যান। পাশের বাড়ির মালিক পরে বাড়ি এলে তিনি তার নিজের মতো করে বিবেচনা করবেন এমন সমস্ত ধরণের জিনিস খুঁজে পাবেন।

এই কারণেই আমি একটি স্থির আকারের অ্যারে বেছে নিয়েছি। মঞ্চটি সেট করতে, ধরে নিন যে দ্বিতীয় ঘরটি আমরা বরাদ্দ করব, কোনও কারণে, স্মৃতিতে প্রথমটির আগে স্থাপন করা হবে। অন্য কথায়, দ্বিতীয় ঘরে প্রথমটির চেয়ে কম ঠিকানা থাকবে। এছাড়াও, তারা একে অপরের পাশে বরাদ্দ দেওয়া হয়।

সুতরাং, এই কোড:

var
    h1, h2: THouse;
begin
    h1 := THouse.Create('My house');
    h2 := THouse.Create('My other house somewhere');
                         ^-----------------------^
                          longer than 10 characters
                         0123456789 <-- 10 characters

প্রথম বরাদ্দের পরে মেমরি লেআউট:

                        H1
                        বনাম
----------------------- [ttttNNNNNNNNNN]
                        আমার বাড়ি

দ্বিতীয় বরাদ্দের পরে মেমরি লেআউট:

    এইচ 2 এইচ 1
    VV
--- [ttttNNNNNNNNNN] ---- [ttttNNNNNNNNNN]
    আমার অন্য বাড়ি কোথাও
                        ^ --- - ^
                            |
                            + - ওভাররাইট করা

যে অংশটি প্রায়শই ক্র্যাশ ঘটায় তা হ'ল আপনি যখন সংরক্ষণ করেছিলেন এমন ডেটার গুরুত্বপূর্ণ অংশগুলি ওভাররাইট করে যা সত্যই এলোমেলোভাবে পরিবর্তন করা উচিত নয়। উদাহরণস্বরূপ, সমস্যাটি নাও হতে পারে যে প্রোগ্রামটি ক্র্যাশ করার ক্ষেত্রে, এইচ 1-বাড়ির নামের অংশগুলি পরিবর্তন করা হয়েছিল, তবে আপনি যখন ভাঙা বস্তুটি ব্যবহার করার চেষ্টা করবেন তখন অবজেক্টের ওভারহেডটি ওভাররাইট করা সম্ভবত ক্র্যাশ হয়ে যাবে will ওভাররাইটিং লিঙ্কগুলি যা অবজেক্টের অন্যান্য অবজেক্টে সঞ্চিত থাকে।


লিঙ্কযুক্ত তালিকাগুলি

আপনি যখন কোনও কাগজের টুকরোতে কোনও ঠিকানা অনুসরণ করেন, আপনি একটি বাড়িতে পৌঁছে যান এবং সেই বাড়িতে সেখানে একটি নতুন ঠিকানাযুক্ত কাগজের অন্য টুকরা রয়েছে, শৃঙ্খলে পরবর্তী বাড়ির জন্য and

var
    h1, h2: THouse;
begin
    h1 := THouse.Create('Home');
    h2 := THouse.Create('Cabin');
    h1.NextHouse := h2;

এখানে আমরা আমাদের বাড়ির বাড়ি থেকে আমাদের কেবিনে একটি লিঙ্ক তৈরি করি। কোনও ঘরের কোনও NextHouseরেফারেন্স না পাওয়া পর্যন্ত আমরা চেইনটি অনুসরণ করতে পারি , যার অর্থ এটি শেষটি। আমাদের সমস্ত বাড়ি ঘুরে দেখার জন্য, আমরা নিম্নলিখিত কোডটি ব্যবহার করতে পারি:

var
    h1, h2: THouse;
    h: THouse;
begin
    h1 := THouse.Create('Home');
    h2 := THouse.Create('Cabin');
    h1.NextHouse := h2;
    ...
    h := h1;
    while h <> nil do
    begin
        h.LockAllDoors;
        h.CloseAllWindows;
        h := h.NextHouse;
    end;

মেমোরি লেআউট (নীচের চিত্রটিতে চারটি এলএলএলএল হিসাবে উল্লিখিত, অবজেক্টের একটি লিঙ্ক হিসাবে নেক্সটহাউস যুক্ত হয়েছে):

    এইচ 1 এইচ 2
    VV
--- [ttttNNNNNNNNNNLLLL] ---- [ttttNNNNNNNNNNLLLL]
    1234 হোম + 5678 কেবিন +
                   | ^ |
                   + -------- + * (কোনও লিঙ্ক নেই)

মৌলিক ভাষায়, একটি মেমরি ঠিকানা কি?

একটি মেমরি ঠিকানা মৌলিক পদে কেবল একটি সংখ্যা। আপনি যদি মেমরিটিকে বাইটের বড় অ্যারে হিসাবে মনে করেন তবে একেবারে প্রথম বাইটে ঠিকানা 0 থাকে, পরেরটি ঠিকানা 1 এবং তাই উপরের দিকে। এটি সরলীকৃত তবে যথেষ্ট ভাল।

সুতরাং এই স্মৃতি বিন্যাস:

    এইচ 1 এইচ 2
    VV
--- [ttttNNNNNNNNNN] --- [ttttNNNNNNNNNN]
    1234 আমার বাড়ি 5678 আমার বাড়ি

এই দুটি ঠিকানা থাকতে পারে (বাম দিকে - ঠিকানা 0):

  • এইচ 1 = 4
  • এইচ 2 = 23

যার অর্থ হল যে আমাদের লিঙ্কযুক্ত তালিকাকে উপরে প্রদর্শিত হতে পারে:

    এইচ 1 (= 4) এইচ 2 (= 28)
    VV
--- [ttttNNNNNNNNNNLLLL] ---- [ttttNNNNNNNNNNLLLL]
    1234Home 0028 5678 কেবিন 0000
                   | ^ |
                   + -------- + * (কোনও লিঙ্ক নেই)

শূন্য-ঠিকানা হিসাবে "কোথাও পয়েন্ট করা হয় না" এমন কোনও ঠিকানা সঞ্চয় করা সাধারণ is


বেসিক পদগুলিতে, পয়েন্টারটি কী?

একটি পয়েন্টার কেবল একটি ভেরিয়েবল যা মেমরির ঠিকানা রাখে। আপনি সাধারণত প্রোগ্রামিং ভাষাটিকে তার নম্বর দেওয়ার জন্য বলতে পারেন, তবে বেশিরভাগ প্রোগ্রামিং ভাষা এবং রানটাইমগুলি নীচে একটি সংখ্যা রয়েছে এই সত্যটি লুকিয়ে রাখার চেষ্টা করে, কেবল কারণ নম্বরটি নিজেই আপনার কাছে কোনও অর্থ রাখে না। পয়েন্টারটিকে একটি কালো বক্স হিসাবে ভাবা ভাল, অর্থাত্‍। যতক্ষণ না এটি কার্যকর হয় ততক্ষণ আপনি কীভাবে বাস্তবে এটি বাস্তবায়িত হয় তা জানেন না বা যত্ন করছেন না।


59
বাফারকে ছাড়িয়ে যাওয়া হাসিখুশি। "প্রতিবেশী বাড়িতে আসে, তার জঞ্জালটি আপনার জাঙ্কের উপরে খোলা ফাটল ধরে, এবং আপনাকে বিস্মৃত হওয়ার জন্য মামলা করে" "
জিটিডি

12
এটি ধারণাটির একটি দুর্দান্ত ব্যাখ্যা, নিশ্চিত sure ধারণাটি পয়েন্টারগুলির সম্পর্কে আমি বিভ্রান্তিকর বলে মনে করি না, সুতরাং এই পুরো রচনাটি কিছুটা নষ্ট হয়েছিল।
ব্রেটন

10
তবে কেবল জিজ্ঞাসা করার জন্য, আপনি পয়েন্টার সম্পর্কে বিভ্রান্তিকর কি মনে করেন ?
লাসে ভি কার্লসেন

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

3
কোনও পাঠ্যের একক পৃষ্ঠায় (এটি যত দীর্ঘ হোক না কেন) মেমরি পরিচালনা, রেফারেন্স, পয়েন্টার ইত্যাদির প্রতিটি সংক্ষিপ্তসার যোগ করতে পারে, যেহেতু 465 জন এটিকে ভোট দিয়েছেন, আমি বলব এটি এটি যথেষ্ট ভাল হিসাবে কাজ করে তথ্য পৃষ্ঠা শুরু। আরও কিছু শেখার আছে? অবশ্যই, কখন না?
লাসে ভি কার্লসেন

153

আমার প্রথম কম্পিউটার বিজ্ঞান শ্রেণিতে আমরা নিম্নলিখিত অনুশীলনটি করেছি। মঞ্জুর, এটি ছিল প্রায় 200 শিক্ষার্থী সম্বলিত একটি বক্তৃতা হল ...

অধ্যাপক বোর্ডে লিখেছেন: int john;

জন উঠে দাঁড়াল

অধ্যাপক লিখেছেন: int *sally = &john;

স্যালি উঠে, জনকে পয়েন্ট করে

প্রফেসরঃ int *bill = sally;

বিল উঠে দাঁড়িয়ে জনকে দেখায়

প্রফেসরঃ int sam;

স্যাম উঠে দাঁড়ায়

প্রফেসরঃ bill = &sam;

বিল এখন স্যামের দিকে ইঙ্গিত করে।

আমি মনে করি আপনি ধারণা পেতে পারেন। আমি মনে করি আমরা এটি করতে প্রায় এক ঘন্টা ব্যয় করেছি, যতক্ষণ না আমরা পয়েন্টার অ্যাসাইনমেন্টের বেসিকগুলি অতিক্রম করি।


5
আমি মনে করি না যে আমি এটি ভুল পেয়েছি। আমার উদ্দেশ্য ছিল পয়েন্ট-টু ভেরিয়েবলের মান জন থেকে স্যামে পরিবর্তন করা। মানুষের সাথে প্রতিনিধিত্ব করা একটু কঠিন, কারণ দেখে মনে হচ্ছে আপনি উভয় পয়েন্টারের মান পরিবর্তন করছেন।
ট্রাইকে

24
তবে এটি বিভ্রান্ত করার কারণটি হ'ল জন তার আসন থেকে উঠে এসে স্যাম বসেছিল, যেমনটি আমরা কল্পনাও করতে পারি। এটি আরও বেশি স্যামের মতো এসে নিজের হাতটি জনকে আটকে দেয় এবং সামের প্রোগ্রামিংটিকে জোনের শরীরে ক্লোন করে দেয়, যেমন ম্যাট্রিক্সে হুগো বোনা পুনরায় লোড হয়।
ব্রেটন

59
স্যাম যেমন জন এর সিট নিয়ে যায় তেমনি জন ঘরের আশেপাশে ভাসতে থাকে যতক্ষণ না সে সমালোচনামূলক কিছুতে ঝাপিয়ে পড়ে এবং সেগফোল্টের কারণ হয় না।
just_wes

2
আমি ব্যক্তিগতভাবে এই উদাহরণটি অহেতুক জটিল মনে করি। আমার প্রফেসর আমাকে একটি আলোর দিকে নির্দেশ করতে বললেন এবং বলেছিলেন "আপনার হাতটি আলোক বস্তুর দিকে নির্দেশক"।
সেলিব্রিটিস

এই ধরণের উদাহরণগুলির সাথে সমস্যাটি হ'ল এক্স এবং এক্স এর পয়েন্টার এক নয়। এবং এটি মানুষের সাথে চিত্রিত হয় না।
আইজাক নেউকিটিপাস

124

পয়েন্টারগুলি ব্যাখ্যা করার জন্য আমি যে সাদৃশ্য খুঁজে পেয়েছি সেটি হ'ল হাইপারলিংক। বেশিরভাগ লোকেরা বুঝতে পারে যে কোনও ওয়েব পৃষ্ঠার একটি লিঙ্ক ইন্টারনেটে অন্য পৃষ্ঠায় 'পয়েন্ট' করে এবং আপনি যদি সেই হাইপারলিঙ্কটি অনুলিপি করতে ও পেস্ট করতে পারেন তবে তারা উভয়ই একই মূল ওয়েব পৃষ্ঠায় নির্দেশ করবে। আপনি যদি সেই আসল পৃষ্ঠাটিতে গিয়ে সম্পাদনা করেন, তবে সেই লিঙ্কগুলির মধ্যে একটি অনুসরণ করুন (পয়েন্টার) আপনি সেই নতুন আপডেট পৃষ্ঠা পাবেন।


15
আমি সত্যিই এটি পছন্দ করি. হাইপারলিংক লিখে দু'বার দুটি ওয়েবসাইট প্রদর্শিত int *a = bহয় না (ঠিক যেমন দুটি অনুলিপি তৈরি করে না *b) এটি দেখতে অসুবিধা হয় না ।
অবশেষে

4
এটি আসলে খুব স্বজ্ঞাগত এবং এমন কিছুর সাথে প্রত্যেকেরই সম্পর্কযুক্ত হওয়া উচিত। যদিও এখানে অনেকগুলি পরিস্থিতি রয়েছে যেখানে এই সাদৃশ্যটি পৃথক হয়ে যায়। যদিও দ্রুত পরিচয়ের জন্য দুর্দান্ত introduction +1
ব্রায়ান উইগগিন্টন

একটি পৃষ্ঠার লিঙ্ক দু'বার খোলার পরে সেই ওয়েবপৃষ্ঠার প্রায় দুটি সম্পূর্ণ স্বাধীন ঘটনা তৈরি হয় creates আমি মনে করি একটি হাইপারলিঙ্ক পরিবর্তে কোনও নির্মাণকারীর পক্ষে ভাল উপমা হতে পারে তবে কোনও পয়েন্টারের সাথে নয়।
উত্কান গিজার

@ থোঅ্যাপেলসিন অগত্যা সত্য নয়, যদি আপনি উদাহরণস্বরূপ একটি স্ট্যাটিক এইচটিএমএল ওয়েবপৃষ্ঠায় অ্যাক্সেস করেন তবে আপনি সার্ভারে একটি একক ফাইল অ্যাক্সেস করছেন।
dramzy

5
আপনি এটি overth سوچ করছি। হাইপারলিঙ্কগুলি সার্ভারে থাকা ফাইলগুলিতে নির্দেশ করে, এটি সাদৃশ্যটির মাত্রা।
dramzy

48

পয়েন্টারগুলি এত লোককে বিভ্রান্ত করার কারণ মনে হচ্ছে তারা বেশিরভাগই কম্পিউটার আর্কিটেকচারে খুব কম বা কোনও পটভূমি নিয়ে আসে। যেহেতু কম্পিউটারগুলি (মেশিন) আসলে বাস্তবায়িত হয় সে সম্পর্কে অনেকের ধারণা নেই - সি / সি ++ এ কাজ করা পরক বলে মনে হয়।

একটি ড্রিল হ'ল পয়েন্টার অপারেশনগুলিতে (লোড, স্টোর, ডাইরেক্ট / অপ্রত্যক্ষ ঠিকানা) ফোকাস করে একটি নির্দেশিকা সেট সহ একটি সাধারণ বাইটকোড ভিত্তিক ভার্চুয়াল মেশিন (তারা যে কোনও ভাষায় বেছে নিয়েছে, পাইথন এটির জন্য দুর্দান্ত কাজ করে) প্রয়োগ করতে বলছে। তারপরে তাদের সেই নির্দেশিকার সেটটির জন্য সহজ প্রোগ্রাম লিখতে বলুন।

সাধারণ সংযোজনের চেয়ে কিছুটা বেশি প্রয়োজন বোধ হয় পয়েন্টারগুলিকে জড়িত করে এবং তারা এটি পেতে নিশ্চিত।


2
মজাদার. যদিও এটি সম্পর্কে কীভাবে শুরু করা যায় তার কোনও ধারণা নেই। কোন সম্পদ ভাগাভাগি?
করোলিস 10

1
আমি রাজী. উদাহরণস্বরূপ, আমি সি এর আগে সমাবেশে প্রোগ্রাম করতে শিখেছি এবং কীভাবে নিবন্ধগুলি কাজ করে তা জেনে, পয়েন্টারগুলি শেখা সহজ ছিল। আসলে, এখানে খুব বেশি কিছু শেখা হয়নি, এটি খুব স্বাভাবিকভাবেই এসেছিল।
মিলান বাবুস্কভ

একটি বেসিক সিপিইউ নিন, এমন কিছু বলুন যা লনমওয়ার বা ডিশ ওয়াশারগুলি চালায় এবং এটিকে বাস্তবায়ন করুন। বা এআরএম বা এমআইপিএস-এর একটি খুব বুনিয়াদি সাবসেট। এই দু'জনেরই খুব সাধারণ আইএসএ রয়েছে।
ড্যানিয়েল গোল্ডবার্গ

1
এটি উল্লেখ করার মতো হতে পারে যে এই শিক্ষাগত পদ্ধতির পক্ষে ডোনাল্ড নুথ নিজেই পরামর্শ / অনুশীলন করেছেন। নুথের আর্ট অফ কম্পিউটার প্রোগ্রামিং একটি সাধারণ অনুমানমূলক আর্কিটেকচার বর্ণনা করে এবং শিক্ষার্থীদের সেই আর্কিটেকচারের জন্য অনুমানের সমাবেশ ভাষায় সমস্যার অনুশীলনের সমাধানগুলি প্রয়োগ করতে বলে। এটি একবার ব্যবহারিকভাবে সম্ভব হয়ে ওঠার পরে, কিছু শিক্ষার্থী নুথের বইগুলি পড়তে আসলে তার স্থাপত্যটি ভিএম হিসাবে প্রয়োগ করে (বা বিদ্যমান প্রয়োগটি ব্যবহার করে) এবং তাদের সমাধানগুলি চালিত করে। আপনার কাছে সময় থাকলে আইএমও এটি শেখার দুর্দান্ত উপায়।
অদ্ভুতভাবে শিজি

4
@ লুক, আমি মনে করি না যে এমন লোকেরা বুঝতে পারা সহজ যারা পয়েন্টারগুলি সহজেই ধরতে পারে না (বা, আরও সাধারণভাবে বোঝা যায়, সাধারণভাবে ইন্ডিয়ারেশন)। আপনি মূলত ধরেই নিচ্ছেন যে সি-তে পয়েন্টার বোঝে না এমন লোকেরা সমাবেশ শেখা শুরু করতে পারবে, কম্পিউটারের অন্তর্নিহিত আর্কিটেকচারটি বুঝতে পারবে এবং পয়েন্টারগুলির বোঝার সাথে সিতে ফিরে যাবে। এটি অনেকের পক্ষে সত্য হতে পারে তবে কিছু গবেষণার মতে এটি মনে হয় যে কিছু লোক সহজাতভাবে নীতিগতভাবে অনুপ্রেরণা বুঝতে পারে না (এখনও আমি বিশ্বাস করতে খুব কঠিন অনুভব করি, তবে সম্ভবত আমি আমার "শিক্ষার্থীদের সাথে ভাগ্যবান" ছিলাম) ")।
লুয়ান

27

সি / সি ++ ভাষাতে অনেকগুলি নতুন এবং এমনকি পুরানো, কলেজ স্তরের শিক্ষার্থীদের জন্য কেন পয়েন্টারগুলি বিভ্রান্তির একটি নেতৃস্থানীয় কারণ?

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

এমন কোনও সরঞ্জাম বা চিন্তার প্রক্রিয়া রয়েছে যা আপনাকে বুঝতে সাহায্য করেছিল যে পয়েন্টারগুলি ভেরিয়েবল, ফাংশন এবং স্তরের বাইরে কীভাবে কাজ করে?

ঠিকানা বাক্স। আমার মনে আছে যখন আমি বেসিককে মাইক্রো কম্পিউটারগুলিতে প্রোগ্রাম করতে শিখছিলাম, সেগুলিতে গেমগুলির সাথে এই সুন্দর বই ছিল এবং কখনও কখনও আপনাকে নির্দিষ্ট ঠিকানাগুলিতে মানগুলি ছুঁড়ে ফেলা হত। তাদের কাছে একটি গুচ্ছ বাক্সের একটি ছবি ছিল, 0, 1, 2 দিয়ে বর্ধিতভাবে লেবেলযুক্ত ... এবং এটি ব্যাখ্যা করা হয়েছিল যে এই বাক্সগুলিতে কেবলমাত্র একটি ছোট জিনিস (বাইট) ফিট করতে পারে এবং সেগুলিতে অনেকগুলি ছিল - কিছু কম্পিউটার 65535 হিসাবে ছিল! তারা একে অপরের পাশে ছিল এবং তাদের সবার একটি ঠিকানা ছিল।

সামগ্রিক ধারণায় জর্জরিত না হয়ে কাউকে "আহ-হা, আমি পেয়েছি" এর স্তরে নিয়ে যাওয়ার জন্য কিছু ভাল অনুশীলনের জিনিসগুলি কী কী হতে পারে? মূলত, দৃশ্যের মতো ড্রিল।

একটি ড্রিল জন্য? একটি কাঠামো তৈরি করুন:

struct {
char a;
char b;
char c;
char d;
} mystruct;
mystruct.a = 'r';
mystruct.b = 's';
mystruct.c = 't';
mystruct.d = 'u';

char* my_pointer;
my_pointer = &mystruct.b;
cout << 'Start: my_pointer = ' << *my_pointer << endl;
my_pointer++;
cout << 'After: my_pointer = ' << *my_pointer << endl;
my_pointer = &mystruct.a;
cout << 'Then: my_pointer = ' << *my_pointer << endl;
my_pointer = my_pointer + 3;
cout << 'End: my_pointer = ' << *my_pointer << endl;

সি হিসাবে বাদে উপরের মতো একই উদাহরণ:

// Same example as above, except in C:
struct {
    char a;
    char b;
    char c;
    char d;
} mystruct;

mystruct.a = 'r';
mystruct.b = 's';
mystruct.c = 't';
mystruct.d = 'u';

char* my_pointer;
my_pointer = &mystruct.b;

printf("Start: my_pointer = %c\n", *my_pointer);
my_pointer++;
printf("After: my_pointer = %c\n", *my_pointer);
my_pointer = &mystruct.a;
printf("Then: my_pointer = %c\n", *my_pointer);
my_pointer = my_pointer + 3;
printf("End: my_pointer = %c\n", *my_pointer);

আউটপুট:

Start: my_pointer = s
After: my_pointer = t
Then: my_pointer = r
End: my_pointer = u

সম্ভবত এটি উদাহরণের মাধ্যমে কিছু বেসিক ব্যাখ্যা করে?


"শারীরিকভাবে কীভাবে স্মৃতিশক্তি স্থাপন করা হয় তা না বুঝে" জন্য +1। আমি অ্যাসেম্বলি ভাষার পটভূমি থেকে সিতে এসেছি এবং পয়েন্টারগুলির ধারণাটি খুব স্বাভাবিক এবং সহজ ছিল; এবং আমি এটির চিত্র খুঁজে বের করার জন্য কেবলমাত্র একটি উচ্চ স্তরের ভাষার পটভূমি লড়াইয়ের লোকদের দেখেছি। এটিকে আরও খারাপ করার জন্য বাক্য গঠনটি বিভ্রান্তিকর (ফাংশন পয়েন্টার!), সুতরাং একই সাথে ধারণাটি এবং বাক্য গঠনটি শেখা সমস্যার জন্য একটি রেসিপি।
ব্রেন্ডন

4
আমি এটি একটি পুরানো পোস্ট জানি, তবে প্রদত্ত কোডের আউটপুট পোস্টে যুক্ত করা ভাল হবে।
জোশ

হ্যাঁ, এটি বীজগণিতের অনুরূপ (যদিও বীজগণিতের তাদের "ভেরিয়েবল" অপরিবর্তনীয় হওয়ার ক্ষেত্রে অতিরিক্ত বোধগম্যতা রয়েছে)। তবে আমার পরিচিত প্রায় অর্ধেক লোকের অনুশীলনে বীজগণিতের আঁকড়ে নেই। এটি কেবল তাদের জন্য গণনা করে না। তারা ফলাফলটি পেতে সেই সমস্ত "সমীকরণ" এবং প্রেসক্রিপশনগুলি জানেন তবে তারা এগুলি কিছুটা এলোমেলোভাবে এবং আঠালোভাবে প্রয়োগ করেন apply এবং তারা তাদের নিজস্ব উদ্দেশ্যে এগুলি প্রসারিত করতে পারে না - এটি কেবল তাদের জন্য কিছু অপরিবর্তনীয়, আপত্তিজনক কালো বাক্স। যদি আপনি বীজগণিত বোঝেন এবং কার্যকরভাবে এটি ব্যবহার করতে সক্ষম হন তবে আপনি ইতিমধ্যে প্যাকের আগেই রয়েছেন - এমনকি প্রোগ্রামারদের মধ্যেও।
লুয়ান

24

আমার প্রথমে বুঝতে পয়েন্টারগুলি বোঝার জন্য যে কারণটি হয়েছিল, প্রথম কারণটি হ'ল অনেকগুলি ব্যাখ্যায় রেফারেন্স দিয়ে পাস করার বিষয়ে প্রচুর বাজে কথা অন্তর্ভুক্ত। এই সমস্ত করায় বিষয়টি বিভ্রান্ত হয়। আপনি যখন কোনও পয়েন্টার প্যারামিটার ব্যবহার করেন, আপনি এখনও মান দিয়ে যাচ্ছেন ; তবে মানটি একটি ঠিকানা হিসাবে পরিবর্তিত হয়, বলার অপেক্ষা রাখে না int

অন্য কেউ ইতিমধ্যে এই টিউটোরিয়ালের সাথে লিঙ্ক করেছেন, তবে আমি যখন পয়েন্টারগুলি বুঝতে শুরু করি তখন আমি সেই মুহূর্তটি হাইলাইট করতে পারি:

সি তে পয়েন্টার এবং অ্যারে সম্পর্কিত একটি টিউটোরিয়াল: অধ্যায় 3 - পয়েন্টার এবং স্ট্রিং

int puts(const char *s);

মুহুর্তের জন্য, const.পরামিতিটি প্রদত্ত প্যারামিটারটিকে অগ্রাহ্য করুন, puts()এটিই একটি পয়েন্টারের মান (যেহেতু সিতে সমস্ত প্যারামিটারগুলি মান দিয়ে যায়), এবং একটি পয়েন্টারের মানটি সেই ঠিকানা যেখানে এটি নির্দেশ করে, বা, কেবল , একটি ঠিকানা. সুতরাং আমরা যখন puts(strA);দেখেছি যেমন লিখি , আমরা আরআরএ [0] এর ঠিকানাটি পাস করছি।

এই শব্দগুলি পড়ার মুহুর্তে, মেঘগুলি বিভক্ত হয়ে গেল এবং সূর্যের আলোয় একটি মরীচি আমাকে পয়েন্টার বোঝার সাথে আবদ্ধ করে তুলেছিল।

এমনকি যদি আপনি কোনও ভিবি। নেট বা সি # বিকাশকারী (যেমন আমি আছি) এবং কখনই অনিরাপদ কোড ব্যবহার না করি তবে পয়েন্টার কীভাবে কাজ করে তা এখনও বোঝার মতো, বা অবজেক্টের রেফারেন্সগুলি কীভাবে কাজ করে তা আপনি বুঝতে পারবেন না। তারপরে আপনার সাধারণ-তবে-ভুল ধারণাটি পাওয়া যাবে যে কোনও পদ্ধতির সাথে কোনও অবজেক্ট রেফারেন্স পাস করার সাথে অবজেক্টটি অনুলিপি হয়।


পয়েন্টার থাকার বিন্দুটি কী তা ভাবতে ভাবতে আমাকে ছেড়ে দেয়। আমার মুখোমুখি বেশিরভাগ কোড ব্লকগুলিতে একটি পয়েন্টার কেবলমাত্র এর ঘোষণায় দেখা যায়।
ওল্ফপ্যাক'08

@ ওল্ফপ্যাক'০৮ ... কি ?? আপনি কোন কোডটি দেখছেন ??
কাইল স্ট্র্যান্ড

@ কাইলস্ট্র্যান্ড আমাকে দেখতে দিন
ওল্ফপ্যাক'08

19

আমি টেড জেনসেনের "সিটিতে ইন পয়েন্টারস এবং অ্যারে সম্পর্কিত টিউটোরিয়াল" পয়েন্টার সম্পর্কে শেখার জন্য একটি দুর্দান্ত উত্স পেয়েছি। এটি 10 ​​পাঠে বিভক্ত হয়েছে, পয়েন্টার কী (এবং তারা কীসের জন্য রয়েছে) এর ব্যাখ্যা দিয়ে এবং ফাংশন পয়েন্টারগুলির সাথে সমাপ্ত করে। http://home.netcom.com/~tjensen/ptr/cpoint.htm

সেখান থেকে সরানো, বিজের গাইড টু নেটওয়ার্ক প্রোগ্রামিং ইউনিক্স সকেট এপিআই শেখায়, সেখান থেকে আপনি সত্যিই মজাদার জিনিসগুলি শুরু করতে পারেন। http://beej.us/guide/bgnet/


1
আমি দ্বিতীয় টেড জেনসেনের টিউটোরিয়াল। এটি বিশদের স্তরের পয়েন্টারগুলিকে ভেঙে দেয়, এটি অত্যধিক-বিস্তারিত নয়, আমার পড়া কোনও বই তা করে না। অত্যন্ত সহায়ক! :)
ডেভ গ্যালাগার

12

পয়েন্টারগুলির জটিলতাগুলি আমরা সহজেই কী শিক্ষা দিতে পারি তার বাইরে go শিক্ষার্থীরা একে অপরের দিকে ইঙ্গিত করা এবং বাড়ির ঠিকানা সহ কাগজের টুকরো ব্যবহার করা উভয়ই দুর্দান্ত শেখার সরঞ্জাম। তারা বেসিক ধারণাটি চালু করার দুর্দান্ত কাজ করে। প্রকৃতপক্ষে, পয়েন্টারগুলি সফলভাবে ব্যবহারের জন্য প্রাথমিক ধারণাগুলি শেখা জরুরী । যাইহোক, উত্পাদন কোডে, এই সাধারণ বিক্ষোভগুলি encapsulate করতে পারে তার চেয়ে অনেক জটিল পরিস্থিতিতে intoোকা সাধারণ।

আমি এমন সিস্টেমে জড়িত হয়েছি যেখানে আমাদের অন্যান্য কাঠামোর দিকে নির্দেশ করে অন্যান্য স্ট্রাকচারের দিকে ইশারা করে স্ট্রাকচার ছিল। এই কাঠামোর কিছুতে এমবেডড স্ট্রাকচারও রয়েছে (অতিরিক্ত স্ট্রাকচারের দিকে নির্দেশকের চেয়ে)। এখানেই পয়েন্টাররা সত্যই বিভ্রান্ত হয়। যদি আপনি একাধিক স্তরের ইন্ডিয়ারেশন পেয়ে থাকেন এবং আপনি এই জাতীয় কোডটি দিয়ে শেষ করতে শুরু করেন:

widget->wazzle.fizzle = fazzle.foozle->wazzle;

এটি সত্যিই দ্রুত বিভ্রান্ত হয়ে উঠতে পারে (আরও অনেক লাইন এবং সম্ভাব্য আরও স্তরগুলির কল্পনা করুন)। পয়েন্টারগুলির অ্যারে, এবং নোড পয়েন্টারগুলিতে নিক্ষেপ করুন (গাছ, লিঙ্কযুক্ত তালিকাগুলি) এবং এটি আরও খারাপ হয়ে যায়। আমি দেখেছি সত্যিকারের ভাল বিকাশকারীরা যখন এই জাতীয় সিস্টেমে কাজ করা শুরু করেন, এমনকি এমন বিকাশকারীরা যারা বেসিকগুলি সত্যিই ভালভাবে বুঝতে পেরেছিলেন।

পয়েন্টারগুলির জটিল কাঠামো অগত্যা দুর্বল কোডিংকে নির্দেশ করে না (হয় তারা পারে)। রচনাটি ভাল অবজেক্ট-ওরিয়েন্টেড প্রোগ্রামিংয়ের একটি গুরুত্বপূর্ণ অংশ, এবং কাঁচা পয়েন্টারযুক্ত ভাষাগুলিতে এটি অবশ্যম্ভাবীভাবে বহু-স্তরযুক্ত দিকনির্দেশের দিকে পরিচালিত করবে। তদ্ব্যতীত, সিস্টেমে প্রায়শই তৃতীয় পক্ষের লাইব্রেরিগুলি কাঠামোগত ব্যবহার করা উচিত যা স্টাইল বা কৌশলতে একে অপরের সাথে মেলে না। এরকম পরিস্থিতিতে জটিলতা স্বাভাবিকভাবেই উত্থিত হতে চলেছে (যদিও অবশ্যই আমাদের এটি যতটা সম্ভব লড়াই করা উচিত)।

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


10

আমি ভেবেছিলাম আমি এই তালিকার সাথে সাদৃশ্য যুক্ত করব যা কম্পিউটার সায়েন্স টিউটর হিসাবে পয়েন্টারগুলি (দিন ফিরে) ব্যাখ্যা করার সময় আমি খুব সহায়ক হয়েছিলাম; প্রথমে, আসুন:


মঞ্চ সেট করুন :

3 স্পেস সহ একটি পার্কিং লট বিবেচনা করুন, এই স্পেসগুলি নম্বরযুক্ত:

-------------------
|     |     |     |
|  1  |  2  |  3  |
|     |     |     |

একটি উপায়ে, এটি মেমরির অবস্থানগুলির মতো, সেগুলি ক্রমিক এবং স্বচ্ছল .. একটি অ্যারের মতো সাজানো। এখনই তাদের মধ্যে কোনও গাড়ি নেই তাই এটি খালি অ্যারের মতো ( parking_lot[3] = {0})।


ডেটা যুক্ত করুন

একটি পার্কিং লট কখনই বেশি সময় খালি থাকে না ... এটি করা অর্থহীন হবে এবং কেউই কোনও নির্মাণ করবে না। সুতরাং আসুন দিনটি 3 গাড়ি, একটি নীল গাড়ি, একটি লাল গাড়ি এবং একটি সবুজ গাড়ি দিয়ে প্রচুর পরিমাণে ভরে যায়:

   1     2     3
-------------------
| o=o | o=o | o=o |
| |B| | |R| | |G| |
| o-o | o-o | o-o |

এই গাড়ির সব একই ধরনের (গাড়ি) তাই এক এই মনে হয় যে আমাদের গাড়ি তথ্য কিছু বাছাই (একটি বলে হয় int) কিন্তু তারা বিভিন্ন মান ( blue, red, green; যে রঙ হতে পারে enum)


পয়েন্টারটি প্রবেশ করান

এখন আমি যদি আপনাকে এই পার্কিংয়ে নিয়ে যাই এবং আমাকে একটি নীল গাড়ি সন্ধান করতে বলি, আপনি একটি আঙুল প্রসারিত করুন এবং স্পট 1 এ নীল গাড়ীর দিকে নির্দেশ করতে এটি ব্যবহার করুন এটি একটি পয়েন্টার গ্রহণ এবং এটি একটি স্মৃতি ঠিকানায় নির্ধারণ করার মতো is ( int *finger = parking_lot)

আপনার আঙুলটি (পয়েন্টার) আমার প্রশ্নের উত্তর নয়। খুঁজছি আপনার আঙুল আমাকে কিছুই বলে, কিন্তু যদি আমি চেহারা যেখানে তুমি আঙুল হয় নির্দেশিত (পয়েন্টার dereferencing), আমি গাড়ী (ডাটা) আমি খুঁজছেন ছিল জানতে পারেন।


পয়েন্টারটি পুনরায় বরাদ্দ করা হচ্ছে

এর পরিবর্তে আমি আপনাকে একটি লাল গাড়ি সন্ধান করতে বলতে পারি এবং আপনি নিজের আঙুলটি একটি নতুন গাড়িতে পুনর্নির্দেশ করতে পারেন। এখন আপনার পয়েন্টারটি (আগের মতো একই) আমাকে একই ধরণের (গাড়ি) নতুন ডেটা (পার্কিং স্পট যেখানে লাল গাড়িটি পাওয়া যাবে) দেখাচ্ছে।

পয়েন্টারটি শারীরিকভাবে পরিবর্তিত হয়নি, এটি এখনও আপনার আঙুলের, কেবলমাত্র এটি আমাকে দেখায় যা ডেটা দেখিয়েছিল। ("পার্কিং স্পট" ঠিকানা)


ডাবল পয়েন্টার (বা একটি পয়েন্টার একটি পয়েন্টার)

এটি একাধিক পয়েন্টার পাশাপাশি কাজ করে। আমি জিজ্ঞাসা করতে পারি যে পয়েন্টারটি কোথায়, যা লাল গাড়িটির দিকে নির্দেশ করছে এবং আপনি আপনার অন্য হাতটি ব্যবহার করতে পারেন এবং প্রথম আঙুলের সাথে একটি আঙুল দিয়ে পয়েন্ট করতে পারেন। (এটি এর মতো int **finger_two = &finger)

এখন আমি যদি নীল গাড়িটি জানতে চাই তবে আমি প্রথম আঙুলের দিকটি দ্বিতীয় আঙুলের দিকে, গাড়িটিতে (ডেটা) অনুসরণ করতে পারি।


ঝাঁকুনি পয়েন্টার

এখন ধরা যাক আপনি খুব একটা মূর্তির মতো অনুভব করছেন এবং আপনি অনির্দিষ্টকালের জন্য লাল হাতের দিকে ইশারা করে আপনার হাতটি ধরে রাখতে চান। যদি সেই লাল গাড়ি চলে যায়?

   1     2     3
-------------------
| o=o |     | o=o |
| |B| |     | |G| |
| o-o |     | o-o |

আপনার পয়েন্টারটি এখনও লাল গাড়িটি কোথায় ছিল সেদিকে ইঙ্গিত করছে তবে আর নেই। বলি যে একটি নতুন গাড়ি সেখানে টানছে ... একটি কমলা গাড়ি। এখন আমি যদি আপনাকে আবার জিজ্ঞাসা করি, "লাল গাড়িটি কোথায়", আপনি এখনও সেখানে নির্দেশ করছেন তবে এখন আপনি ভুল করছেন wrong এটি কোনও লাল গাড়ি নয়, এটি কমলা।


পয়েন্টার গাণিতিক

ঠিক আছে, সুতরাং আপনি এখনও দ্বিতীয় পার্কিং স্পটটির দিকে ইশারা করছেন (এখন কমলা গাড়ি দ্বারা দখল করা)

   1     2     3
-------------------
| o=o | o=o | o=o |
| |B| | |O| | |G| |
| o-o | o-o | o-o |

আচ্ছা আমার এখন একটি নতুন প্রশ্ন আছে ... আমি পরের পার্কিং স্পটে গাড়ির রঙ জানতে চাই । আপনি দেখতে পাচ্ছেন যে আপনি স্পট 2 এ ইশারা করছেন, সুতরাং আপনি কেবল 1 যুক্ত করুন এবং আপনি পরবর্তী স্পটটিতে পয়েন্ট করছেন। ( finger+1), এখন যেহেতু আমি কীভাবে তথ্য ছিল তা জানতে চেয়েছিলাম, আপনাকে সেই স্পটটি পরীক্ষা করতে হবে (কেবল আঙুল নয়) যাতে আপনি পয়েন্টারটিকে ডিফার করতে পারেন ( *(finger+1)) সেখানে একটি সবুজ গাড়ি উপস্থিত রয়েছে তা দেখতে (সেই অবস্থানের ডেটা )


শুধু "ডাবল পয়েন্টার" শব্দটি ব্যবহার করবেন না। পয়েন্টারগুলি যে কোনও কিছুতে নির্দেশ করতে পারে, সুতরাং স্পষ্টতই আপনি অন্য পয়েন্টারগুলিতে পয়েন্টার যুক্ত করতে পারেন। এগুলি ডাবল পয়েন্টার নয়।
gnasher729

আমি মনে করি এটি আপনার বিন্যাস অব্যাহত রাখতে "আঙ্গুলগুলি" নিজেই এই বিন্দুটি বাদ দেয়, প্রত্যেকে "একটি পার্কিং স্পট দখল করে"। আমি নিশ্চিত নই যে লোকেরা আপনার উপমাটির বিমূর্ততার উচ্চ স্তরের পয়েন্টারগুলি বুঝতে কোনও অসুবিধা করছে, এটি বুঝতে পেরেছি যে পয়েন্টারগুলি পারস্পরিক পরিবর্তনযোগ্য জিনিস যা মেমরির অবস্থানগুলি দখল করে এবং এটি কীভাবে কার্যকর, এটি মনে হয় যে লোকেরা এড়াতে পারে।
এমমেট

1
@ এমমেট - আমি একমত নই যে ডাব্লুআরটি পয়েন্টারে আরও অনেক লোক যেতে পারে, তবে আমি প্রশ্নটি পড়েছি: "without getting them bogged down in the overall concept"উচ্চ পর্যায়ের বোঝাপড়া হিসাবে। এবং আপনার বক্তব্য: "I'm not sure that people have any difficulty understanding pointers at the high level of abstraction"- আপনি খুব অবাক হয়ে যাবেন যে কত লোক এই স্তরের এমনকি পয়েন্টারগুলি বুঝতে পারে না
মাইক

কোনও ব্যক্তির গাড়ি আঙুলের উপমা বাড়াতে কি কোনও যোগ্যতা রয়েছে (এক বা একাধিক আঙ্গুলের সাহায্যে - এবং একটি জেনেটিক অস্বাভাবিকতা যা তাদের প্রত্যেককে যে কোনও দিক নির্দেশ করতে পারে!) অন্য একটি গাড়ীর দিকে ইশারা করে গাড়ীর একটিতে বসে (বা "অবিচ্ছিন্ন পয়েন্টার" হিসাবে লটের পাশে জঞ্জালভূমির দিকে ইশারা করার জন্য বাঁকানো; বা পুরো হাতটি "নির্দিষ্ট আকারের [5] পয়েন্টারের অ্যারে" হিসাবে ফাঁকা একটি সারিতে নির্দেশ করে বা তালুতে "নাল পয়েন্টার" এর দিকে আচ্ছাদিত হয়ে যায় এটি এমন কোথাও নির্দেশ করে যেখানে এটি জানা যায় যে কোনও গাড়ি নেই) ... 8-)
স্লাইভেন

আপনার ব্যাখ্যা প্রশংসনীয় ছিল এবং একটি শিক্ষানবিস জন্য ভাল।
ইয়াতেন্দ্র রাঠোর

9

আমি ধারণা হিসাবে পয়েন্টারগুলি বিশেষত কঠিন বলে মনে করি না - বেশিরভাগ শিক্ষার্থীর মানসিক মডেলগুলি এ জাতীয় কিছু মানচিত্র দেয় এবং কিছু দ্রুত বক্স স্কেচ সহায়তা করতে পারে।

অসুবিধা, কমপক্ষে যা আমি অতীতে অভিজ্ঞ হয়েছি এবং অন্যকে মোকাবেলা করতে দেখেছি, তা হ'ল সি / সি ++ এর পয়েন্টারগুলির পরিচালনাটি অনিচ্ছাকৃতভাবে সংশ্লেষযোগ্য হতে পারে।


9

ডায়াগ্রামগুলির একটি ভাল সেট সহ একটি টিউটোরিয়াল উদাহরণ পয়েন্টার বোঝার জন্য ব্যাপক সাহায্য করে

জোল স্পলস্কি তার গেরিলা গাইড থেকে সাক্ষাত্কার নিবন্ধে পয়েন্টার বোঝার বিষয়ে কিছু ভাল পয়েন্ট করেছেন :

কোনও কারণে বেশিরভাগ লোকেরা মস্তিষ্কের যে অংশটি পয়েন্টারগুলি বোঝে তা ছাড়া জন্মগ্রহণ করেছে বলে মনে হয়। এটি দক্ষতার জিনিস নয়, দক্ষতার জিনিস নয় - এর জন্য দ্বি-দ্বি-নির্দেশিত চিন্তার একটি জটিল রূপ প্রয়োজন যা কিছু লোক কেবল তা করতে পারে না।


8

পয়েন্টারগুলির সাথে সমস্যাটি ধারণা নয়। এটি কার্যকর এবং ভাষা জড়িত। অতিরিক্ত বিভ্রান্তির ফলাফল যখন শিক্ষকরা ধরে নেন যে এটি পয়েন্টারগুলির পক্ষে কঠিন যে এটি জটিল, এবং জারগন নয়, বা বিভ্রান্তিকর গণ্ডগোল সি এবং সি ++ ধারণাটি তৈরি করে। তাই প্রচুর পরিশ্রম ধারণাটি ব্যাখ্যা করার জন্য উদাসীন হয়ে পড়েছে (যেমন এই প্রশ্নের গৃহীত উত্তরের মতো) এবং এটি আমার মতো কারও পক্ষে যথেষ্ট পরিমাণে নষ্ট হয়ে যায়, কারণ আমি ইতিমধ্যে সমস্ত কিছু বুঝতে পারি। এটি কেবল সমস্যার ভুল অংশটি ব্যাখ্যা করছে।

আমি কোথা থেকে আসছি সে সম্পর্কে আপনাকে ধারণা দেওয়ার জন্য, আমি এমন কেউ যিনি পয়েন্টারগুলিকে পুরোপুরি ভালভাবে বুঝতে পেরেছেন এবং আমি সেগুলি এসেম্বলারের ভাষায় দক্ষতার সাথে ব্যবহার করতে পারি। কারণ সমাবেশকারী ভাষায় এগুলিকে পয়েন্টার হিসাবে উল্লেখ করা হয় না। তারা ঠিকানা হিসাবে উল্লেখ করা হয়। যখন প্রোগ্রামিং এবং সি-তে পয়েন্টার ব্যবহার করার কথা আসে তখন আমি অনেকগুলি ভুল করি এবং সত্যই বিভ্রান্ত হয়ে যাই। আমি এখনও এটি বাছাই না। আমাকে যদি আপনি একটি উদাহরণ দিতে।

যখন একটি এপিআই বলেছেন:

int doIt(char *buffer )
//*buffer is a pointer to the buffer

এটা কি চায়?

এটি চাইতে পারে:

বাফারে একটি ঠিকানা উপস্থাপন করে এমন একটি নম্বর

(এটি দেওয়ার জন্য, আমি কি বলি doIt(mybuffer), বা doIt(*myBuffer)?)

বাফারের ঠিকানায় ঠিকানা উপস্থাপন করে এমন একটি নম্বর

(যেমন doIt(&mybuffer)অথবা doIt(mybuffer)বা doIt(*mybuffer)?)

বাফারের ঠিকানার ঠিকানার ঠিকানার প্রতিনিধিত্ব করে এমন একটি নম্বর

(সম্ভবত এটি doIt(&mybuffer)। বা এটি doIt(&&mybuffer)? বা এমনকি doIt(&&&mybuffer))

এবং এইভাবে, এবং জড়িত ভাষা এটি এতটা স্পষ্ট করে না কারণ এটিতে "পয়েন্টার" এবং "রেফারেন্স" শব্দটি জড়িত যা "x y এর ঠিকানা রাখে" এবং "হিসাবে আমার কাছে ততটা অর্থ এবং স্পষ্টতা রাখে না" এই ফাংশনটির y এর একটি ঠিকানা প্রয়োজন। উত্তরটি অতিরিক্তভাবে হ্যাক "মাইফার" কী শুরু করতে হবে এবং এটি দিয়ে কী করতে চায় তা নির্ভর করে। বাস্তবে বাসা বাঁধার স্তরগুলি ভাষা সমর্থন করে না। যেমন যখন আমি একটি ফাংশনে একটি "পয়েন্টার" হস্তান্তর করব যা একটি নতুন বাফার তৈরি করে এবং এটি বাফারের নতুন অবস্থানে পয়েন্টারটি নির্দেশ করে। এটি কি সত্যই পয়েন্টার বা পয়েন্টারটিতে একটি পয়েন্টার চায়, তাই এটি জানে পয়েন্টারের বিষয়বস্তুগুলি পরিবর্তন করতে কোথায় যেতে হবে। বেশিরভাগ সময় আমাকে অনুমান করতে হয় "" বলতে কী বোঝায়

"পয়েন্টার" কেবলমাত্র অত্যধিক লোড। একটি পয়েন্টার একটি মান ঠিকানা? বা এটি একটি ভেরিয়েবল যা কোনও মানকে একটি ঠিকানা রাখে। যখন কোনও ফাংশন একটি পয়েন্টার চায়, তখন এটি কী পয়েন্টার ভেরিয়েবলের ঠিকানাটি চায় বা এটি পয়েন্টার ভেরিয়েবলের ঠিকানা চায়? আমি বিভ্রান্ত


আমি এটি এর মতো ব্যাখ্যা করতে দেখেছি: আপনি যদি পয়েন্টার ঘোষণার মতো দেখতে পান double *(*(*fn)(int))(char)তবে মূল্যায়নের ফলাফল *(*(*fn)(42))('x')হবে a double। মধ্যবর্তী ধরনেরগুলি কী হতে হবে তা বুঝতে আপনি মূল্যায়নের স্তরগুলি কেটে ফেলতে পারেন।
বার্ড জেন্ড্রিসেক

পুনঃটুইট করেছেন (*(*fn)(42))('x') তাহলে মূল্যায়ন ফলাফল কি ?
ব্রেটন

আপনি একটি জিনিস পান (এটি কল করুন x) যেখানে আপনি যদি মূল্যায়ন করেন তবে আপনি *xদ্বিগুণ হন।
বার্ড জেন্ড্রিসেক

@ বারেন্ডজেন্দ্রিসেক কি এটি পয়েন্টার সম্পর্কে কিছু ব্যাখ্যা করার কথা? আমি পাই না। তুমি কি বলতে চাও? আমি একটি স্তর ছিনিয়ে নিয়েছি, এবং কোনও মধ্যবর্তী ধরণের সম্পর্কে কোনও নতুন তথ্য অর্জন করেছি। এটি একটি নির্দিষ্ট ফাংশন গ্রহণ করতে চলেছে সে সম্পর্কে কী ব্যাখ্যা করে? এর কোন কিছুর সাথে কী সম্পর্ক?
ব্রেটন

হয়তো এই ব্যাখ্যা বার্তা (এবং আমার নয়, আমি আমি খুঁজে পারতাম যেখানে আমি প্রথম দেখেছি এটা) কি পদ কম মনে হয় fn হয় এবং আরো অনেক কিছু আপনি করতে পারেন তা পরিপ্রেক্ষিতে কি সঙ্গেfn
Bernd Jendrissek

8

আমি মনে করি পয়েন্টার বোঝার প্রধান বাধা হ'ল খারাপ শিক্ষক।

প্রায় প্রত্যেককে পয়েন্টার সম্পর্কে মিথ্যা শেখানো হয়: এগুলি মেমরির ঠিকানা ছাড়া আর কিছুই নয় বা তারা আপনাকে নির্বিচারে অবস্থান নির্দেশ করতে দেয় ।

এবং অবশ্যই যে তারা বুঝতে অসুবিধাজনক, বিপজ্জনক এবং আধা-যাদু।

যার কোনটিই সত্য নয়। পয়েন্টারগুলি প্রকৃতপক্ষে মোটামুটি সহজ ধারণা, যতক্ষণ না আপনি সি ++ ভাষা তাদের সম্পর্কে যা বলছেন তাতে আটকে থাকুন এবং এমন বৈশিষ্ট্যগুলি ব্যবহার করবেন না যা "সাধারণত" অনুশীলনে কাজ করে, তবে তবুও ভাষা দ্বারা গ্যারান্টিযুক্ত হয় না , এবং তাই কোনও পয়েন্টারের আসল ধারণার অংশ নয়।

আমি কয়েক মাস আগে এই ব্লগ পোস্টে এর ব্যাখ্যা লেখার চেষ্টা করেছি - আশা করি এটি কাউকে সহায়তা করবে।

(দ্রষ্টব্য, কেউ আমার প্রতি পেডেন্টিক হওয়ার আগে, হ্যাঁ, সি ++ স্ট্যান্ডার্ডটি বলেছে যে পয়েন্টারগুলি মেমরির ঠিকানাগুলি উপস্থাপন করে But তবে এটি বলে না যে "পয়েন্টারগুলি মেমরি ঠিকানা, এবং মেমরি ঠিকানা ছাড়া কিছুই নয় এবং মেমরির সাথে বিনিময়যোগ্য হিসাবে ব্যবহার বা ভাবতে পারে ঠিকানা "। পার্থক্যটি গুরুত্বপূর্ণ)


সর্বোপরি, নাল পয়েন্টারটি মেমরির শূন্য-ঠিকানার দিকে নির্দেশ করে না, যদিও এটি সি "মান" শূন্য হয়। এটি সম্পূর্ণ আলাদা ধারণা এবং আপনি যদি এটির সাথে ভুল আচরণ করেন তবে আপনি এমন কিছু সম্বোধন করতে পারেন (যেটি আপনি প্রত্যাশা করেননি) addressing কিছু ক্ষেত্রে, এটি মেমরির এমনকি শূন্য-ঠিকানা হতে পারে (বিশেষত এখন ঠিকানার স্থানটি সাধারণত সমতল) তবে অন্যদের মধ্যে এটি একটি অপ্টিমাইজ করা সংকলক দ্বারা অপরিজ্ঞাত আচরণ হিসাবে বাদ দিতে পারে বা মেমরির সাথে যুক্ত হওয়া অন্য কিছু অংশে অ্যাক্সেস করতে পারে প্রদত্ত পয়েন্টার ধরণের জন্য "শূন্য" সহ। হিলারিটি ফলস্বরূপ।
লুয়ান

অগত্যা। পয়েন্টারগুলি বোঝার জন্য আপনার কম্পিউটারে কম্পিউটারের মডেল তৈরি করতে সক্ষম হওয়া প্রয়োজন (এবং অন্যদের প্রোগ্রামগুলিও ডিবাগ করার জন্য)। প্রত্যেকেই এটি করতে পারে না।
থরবজর্ন রাভন অ্যান্ডারসন

5

আমি মনে করি যে পয়েন্টারগুলি শিখতে কী কঠিন করে তোলে তা হল পয়েন্টার হওয়া অবধি আপনি এই ধারণার সাথে স্বাচ্ছন্দ্য বোধ করেন যে "এই মেমরির অবস্থানটিতে বিটগুলির একটি সেট যা কোনও ইনট, ডাবল, একটি চরিত্র, যাই হোক না কেন" উপস্থাপন করে "

আপনি যখন প্রথম পয়েন্টারটি দেখেন, তখন সত্যিই সেই মেমরির অবস্থানটিতে আপনি কী পাবেন না। "আপনার অর্থ কী, এটি একটি ঠিকানা রাখে ?"

"আপনি হয় সেগুলি পাবেন বা আপনি পাবেন না" এই ধারণার সাথে আমি একমত নই।

আপনি যখন তাদের জন্য বাস্তব ব্যবহারগুলি সন্ধান করতে শুরু করেন (তখন যেমন বড় কাঠামোকে ফাংশনে না ফেলে) তখন এগুলি বোঝা সহজ হয়।


5

এটি বোঝার পক্ষে এত কঠিন কারণটি এটি একটি কঠিন ধারণা নয় কারণ বাক্য গঠনটি অসঙ্গত

   int *mypointer;

আপনি প্রথম শিখেছেন যে একটি চলক সৃষ্টির বামতম অংশটি ভেরিয়েবলের ধরণ নির্ধারণ করে। পয়েন্টার ঘোষণাটি সি এবং সি ++ তে এর মতো কাজ করে না। পরিবর্তে তারা বলে যে ভেরিয়েবলটি বাম দিকে টাইপের দিকে নির্দেশ করছে। এই ক্ষেত্রে: *মাইপয়েন্টার একটি ইনট দিকে নির্দেশ করছে।

আমি পয়েন্টারগুলিকে পুরোপুরি উপলব্ধি করতে পারিনি যতক্ষণ না আমি সেগুলিতে সি # তে ব্যবহার করার চেষ্টা করেছি (অনিরাপদ সহ), তারা ঠিক একইভাবে কাজ করে তবে যুক্তিযুক্ত এবং ধারাবাহিক বাক্য গঠন সহ। পয়েন্টারটি নিজেই একটি টাইপ। এখানে mypointer হয় কোন int একটি পয়েন্টার।

  int* mypointer;

এমনকি আমাকে ফাংশন পয়েন্টারে শুরুও করবেন না ...


2
আসলে, আপনার উভয় টুকরা বৈধ সি। এটি বহু বছরের সি শৈলীর বিষয় যে প্রথমটি আরও সাধারণ more দ্বিতীয়টি সি ++ তে বেশ কিছুটা সাধারণ is
RBerteig

1
দ্বিতীয় খণ্ডটি আরও জটিল ঘোষণার সাথে সত্যিই ভাল কাজ করে না। এবং সিনট্যাক্সটি "অসামঞ্জস্যপূর্ণ" হিসাবে একবার আপনি বুঝতে পারেন যে পয়েন্টার ঘোষণার ডান হাতের অংশটি আপনাকে দেখায় যে বামদিকে পারমাণবিক ধরণের স্পেসিফাইকার এর ধরণের কিছু পেতে আপনাকে পয়েন্টারে কী করতে হবে।
বার্ড জেন্ড্রিসেক

2
int *p;এর একটি সহজ অর্থ: *pএকটি পূর্ণসংখ্যা। int *p, **ppঅর্থ: *pএবং **ppপূর্ণসংখ্যা হয়।
মাইলস রাউট

@ মাইলসআরট: তবে এটাই ঠিক সমস্যা। *pএবং **ppহয় না পূর্ণসংখ্যার, কারণ আপনি ইনিশিয়ালাইজ না pবা ppবা *ppকিছু বিন্দু। আমি বুঝতে পারি যে কিছু লোক কেন এই ব্যাকরণের সাথে আঁকোকে পছন্দ করেন, বিশেষত কারণ কিছু প্রান্তের মামলা এবং জটিল ক্ষেত্রে আপনার এটি করা প্রয়োজন (যদিও এখনও তবুও আপনি তুচ্ছভাবে কাজ করতে পারেন যে সমস্ত ক্ষেত্রে আমি সচেতন) ... তবে আমি মনে করি না যে এই বিষয়গুলি ডান-সারিবদ্ধকরণ শেখানো নববিদের কাছে বিভ্রান্তিকর বিষয়টির চেয়ে গুরুত্বপূর্ণ। একরকম কুৎসিত কথা না বলে! :)
অরবিটে ডিস্ক

@ লাইটনেসেসেসিনআরবাইট টিম-রাইট-অ্যালাইনমেন্ট বিভ্রান্তিকর থেকে দূরে। এটি শেখানোর একমাত্র সঠিক উপায়। এটি শেখানো নয় বিভ্রান্তিকর।
মাইলস রাউট

5

আমি পয়েন্টারগুলির সাথে কাজ করতে পারতাম যখন আমি কেবল সি ++ জানতাম। আমি ধরনের জানতাম কিছু ক্ষেত্রে কী করা উচিত এবং ট্রায়াল / ত্রুটি থেকে কী করা উচিত না। তবে যে বিষয়টি আমাকে সম্পূর্ণ উপলব্ধি করেছে তা হ'ল সমাবেশ ভাষা। আপনার লেখা একটি অ্যাসেম্বলি ভাষা প্রোগ্রামের সাথে যদি আপনি কিছু গুরুতর নির্দেশ স্তরের ডিবাগিং করেন তবে আপনার অনেক কিছুই বুঝতে সক্ষম হওয়া উচিত।


4

আমি বাড়ির ঠিকানা সাদৃশ্য পছন্দ করি, তবে আমি সবসময় ঠিকানাটি মেইলবক্সে থাকা ভেবেছিলাম। এইভাবে আপনি পয়েন্টারটিকে ডিফেরেন্সিং (মেলবক্সটি খোলার) ধারণাটি কল্পনা করতে পারবেন।

উদাহরণস্বরূপ একটি লিঙ্কযুক্ত তালিকার নিম্নলিখিত: 1) ঠিকানা দিয়ে আপনার কাগজ দিয়ে শুরু করুন 2) কাগজের ঠিকানায় যান 3) মেলবক্সটি তার পরবর্তী ঠিকানা সহ একটি নতুন কাগজের সন্ধানের জন্য খুলুন

লিনিয়ার লিঙ্কযুক্ত তালিকায় সর্বশেষ মেলবক্সের কিছুই নেই (তালিকার শেষে)। একটি বিজ্ঞপ্তিযুক্ত লিঙ্কযুক্ত তালিকায়, সর্বশেষ মেলবক্সটির মধ্যে প্রথম মেলবক্সের ঠিকানা রয়েছে।

নোট করুন যে 3 পদক্ষেপটি যেখানে ডিসেরফেরেন্সটি ঘটে এবং যেখানে ঠিকানাটি অবৈধ থাকে আপনি কোথায় ক্রাশ হন বা ভুল হয়ে যান wrong ধরে নিই যে আপনি কোনও অবৈধ ঠিকানার মেলবক্সে যেতে পারেন, কল্পনা করুন যে সেখানে একটি ব্ল্যাকহোল বা এমন কিছু আছে যা পৃথিবীটিকে ভিতরে পরিণত করে :)


মেলবক্স-নম্বর উপমাটির সাথে একটি বাজে জটিলতা হ'ল ডেনিস রিচি দ্বারা উদ্ভাবিত ভাষা যখন বাইটের ঠিকানা এবং সেই বাইটগুলিতে সঞ্চিত মানগুলিতে আচরণের সংজ্ঞা দেয়, সি স্ট্যান্ডার্ড দ্বারা সংজ্ঞায়িত ভাষাটি আচরণ ব্যবহারের জন্য "অনুকূলকরণ" বাস্তবায়নকে আমন্ত্রণ জানায় মডেল যা আরও জটিল তবে মডেলের বিভিন্ন দিকগুলি সংজ্ঞায়িত, বিপরীতে এবং অসম্পূর্ণভাবে এমনভাবে সংজ্ঞায়িত করে।
সুপারক্যাট

3

আমি মনে করি যে লোকেরা এটির সাথে সমস্যায় পড়ার মূল কারণ হ'ল এটি সাধারণত একটি আকর্ষণীয় এবং আকর্ষণীয় পদ্ধতিতে শেখানো হয় না। আমি একজন প্রভাষককে ভিড় থেকে 10 জন স্বেচ্ছাসেবক পেতে এবং তাদের প্রত্যেককে 1 মিটার শাসক দিতে, তাদেরকে একটি নির্দিষ্ট কনফিগারেশনে দাঁড়াতে এবং শাসককে একে অপরের দিকে নির্দেশ করার জন্য ব্যবহার করতে দেখতে চাই। তারপরে পয়েন্টার গাণিতিক দেখান লোককে ঘুরে বেড়াতে (এবং যেখানে তারা তাদের শাসক দেখায়)। যান্ত্রিকগুলিতে খুব বেশি দাপট না পেয়ে ধারণাটি দেখানোর এটি একটি সহজ তবে কার্যকর (এবং সর্বোপরি স্মরণীয় সর্বোপরি) উপায়।

একবার আপনি সি এবং সি ++ এ গেলে মনে হয় কিছু লোকের পক্ষে আরও শক্ত হয়ে উঠছে। আমি নিশ্চিত না যে এটি এই কারণেই যে তারা শেষ পর্যন্ত তত্ত্বটি প্রয়োগ করছে যে তারা যথাযথভাবে অনুশীলনে অনুধাবন করছে না বা কারণ পয়েন্টার ম্যানিপুলেশন সেই ভাষাগুলিতে সহজাতভাবে আরও শক্ত। আমি আমার নিজের রূপান্তরটি খুব ভালভাবে মনে করতে পারি না, তবে আমি পাস্কালে পয়েন্টারগুলি জানতাম এবং তারপরে সিতে চলে এসে পুরোপুরি হারিয়ে গিয়েছিলাম।


2

আমি মনে করি না যে পয়েন্টারগুলি নিজেরাই বিভ্রান্ত করছে। বেশিরভাগ লোকেরা ধারণাটি বুঝতে পারে। এখন আপনি কতগুলি পয়েন্টার সম্পর্কে ভাবতে পারেন বা কত স্তর সম্পর্কে আপনাকে স্বাচ্ছন্দ্য বোধ করা যায়? লোককে প্রান্তে রাখতে খুব বেশি লাগে না। আপনার প্রোগ্রামে বাগ দ্বারা এগুলি দুর্ঘটনাক্রমে পরিবর্তিত হতে পারে এ বিষয়টি আপনার কোডে ভুল হয়ে গেলে তাদের ডিবাগ করা খুব কঠিন করে তুলতে পারে।


2

আমি মনে করি এটি আসলে একটি সিনট্যাক্স সমস্যা হতে পারে। পয়েন্টারগুলির জন্য সি / সি ++ বাক্য গঠনটি তার প্রয়োজনের চেয়ে বেমানান এবং আরও জটিল বলে মনে হচ্ছে।

হাস্যকরভাবে, জিনিসটি যা আমাকে পয়েন্টারগুলি বুঝতে সাহায্য করেছিল তা সি ++ এর মধ্যে একটি পুনরুক্তি করার ধারণার মুখোমুখি হয়েছিল স্ট্যান্ডার্ড টেম্পলেট লাইব্রেরিতে । এটি ব্যঙ্গাত্মক কারণ আমি কেবল ধরে নিতে পারি যে পুনরাবৃত্তিকে পয়েন্টারের সাধারণীকরণ হিসাবে ধারণা করা হয়েছিল।

কখনও কখনও আপনি গাছগুলি উপেক্ষা করতে না আসা পর্যন্ত আপনি কেবল বন দেখতে পাচ্ছেন না।


সমস্যাটি বেশিরভাগ সি ডিক্লেয়ারেশন সিনট্যাক্সে। তবে পয়েন্টার ব্যবহার নিশ্চিত হয়ে (*p)(p->)p->->x*p->x
ওঠার বিষয়টি

@ সলটার্স ওহে আমার you'reশ্বর আপনি মজা করছেন, তাইনা? সেখানে কোনও অসঙ্গতি নেই। a->bসহজ মানে (*a).b
মাইলস রাউথ

@ মাইলস: প্রকৃতপক্ষে, এবং সেই যুক্তিটি * p->xমানে * ((*a).b)যেখানে *p -> xঅর্থ (*(*p)) -> x। উপসর্গ এবং পোস্টফিক্স অপারেটরগুলির মিশ্রণের কারণে দ্ব্যর্থক বিশ্লেষণের কারণ হয়।
MSalters

@ এসএমএল্টাররা না, কারণ সাদা স্থান অপ্রাসঙ্গিক। এটি 1+2 * 39 বলার মতোই
মাইলস রাউট

2

বিভ্রান্তি একাধিক বিমূর্ত স্তরগুলি থেকে "পয়েন্টার" ধারণার সাথে একত্রে মিশ্রিত হয়। প্রোগ্রামাররা জাভা / পাইথনের সাধারণ রেফারেন্সগুলিতে বিভ্রান্ত হন না, তবে পয়েন্টারগুলি আলাদা যে তারা অন্তর্নিহিত মেমরি-আর্কিটেকচারের বৈশিষ্ট্যগুলি প্রকাশ করে।

পরিষ্কারভাবে বিমূর্ততার স্তর পৃথক করা ভাল নীতি, এবং পয়েন্টারগুলি এটি করে না।


1
মজার বিষয় হ'ল, সি পয়েন্টারগুলি আসলে অন্তর্নিহিত মেমরি আর্কিটেকচারের কোনও চরিত্রগত প্রকাশ করে না। জাভা রেফারেন্স এবং সি পয়েন্টারগুলির মধ্যে কেবলমাত্র পার্থক্য হ'ল আপনি পয়েন্টারগুলিতে জড়িত জটিল ধরণের থাকতে পারেন (উদাঃ int *** বা চর * ( ) (অকার্যকর * )), অ্যারেগুলির জন্য পয়েন্টার পাটিগণিত রয়েছে এবং কাঠামোর সদস্যদের পয়েন্টার, উপস্থিতি শূন্য * এর, এবং অ্যারে / পয়েন্টার দ্বৈততা। তা ছাড়া, তারা ঠিক একইভাবে কাজ করে।
jpalecek

ভাল যুক্তি. এটি পয়েন্টার গাণিতিক এবং বাফার উপচে পড়ার সম্ভাবনা - বর্তমানে প্রাসঙ্গিক মেমরির ক্ষেত্রটি ভেঙে বিমূর্ততা ছিন্ন করে - এটি করে।
জোশুয়া ফক্স

@jpalecek: পয়েন্টারগুলি অন্তর্নিহিত আর্কিটেকচারের বিবেচনায় তাদের আচরণের নথি যা বাস্তবায়নের ক্ষেত্রে পয়েন্টারগুলি কীভাবে কাজ করে তা বোঝা খুব সহজ। বলার foo[i]অর্থ একটি নির্দিষ্ট স্থানে যাওয়া, নির্দিষ্ট দূরত্বে এগিয়ে যাওয়া এবং সেখানে কী রয়েছে তা দেখার অর্থ। জিনিসগুলি কী জটিল করে তোলে তা হ'ল জটিল জটিল বিমূর্ত স্তরটি যা স্ট্যান্ডার্ড দ্বারা সংকলনটির সুবিধার জন্য সংযুক্ত করা হয়েছিল, তবে এমন একটি বিষয়কে মডেল করে তোলে যা প্রোগ্রামার চাহিদা এবং সংকলকগুলির জন্য একই রকম প্রয়োজন।
সুপারক্যাট

2

আমি এটি ব্যাখ্যা করতে যেভাবে পছন্দ করেছি সেটি অ্যারে এবং সূচকের ক্ষেত্রে ছিল - লোকেরা পয়েন্টারগুলির সাথে পরিচিত হতে পারে না তবে তারা সাধারণত জানত যে সূচকটি কী।

তাই আমি বলি যে র‌্যামটি একটি অ্যারে (এবং আপনার কাছে র‌্যামের কেবলমাত্র 10-বাইট রয়েছে):

unsigned char RAM[10] = { 10, 14, 4, 3, 2, 1, 20, 19, 50, 9 };

তারপরে কোনও ভেরিয়েবলের পয়েন্টারটি হ'ল র‌্যামের মধ্যে চলকটির (প্রথম বাইট) সূচক।

সুতরাং আপনার যদি কোনও পয়েন্টার / সূচক থাকে unsigned char index = 2, তবে মানটি অবশ্যই তৃতীয় উপাদান বা 4 নম্বর a একটি পয়েন্টারের কাছে পয়েন্টার হ'ল যেখানে আপনি সেই নম্বরটি নিয়ে যান এবং নিজেই এটি সূচক হিসাবে ব্যবহার করেন, যেমনRAM[RAM[index]]

আমি কাগজের তালিকায় একটি অ্যারে আঁকবো এবং কেবল একই মেমরি, পয়েন্টার গাণিতিক, পয়েন্টারে টু পয়েন্টার ইত্যাদির মতো অনেকগুলি পয়েন্টার দেখানোর জন্য এটি ব্যবহার করব।


1

পোস্ট অফিস বক্স নম্বর।

এটি তথ্যের একটি অংশ যা আপনাকে অন্য কিছু অ্যাক্সেস করার অনুমতি দেয়।

(এবং যদি আপনি পোস্ট অফিস বাক্সের সংখ্যাগুলিতে পাটিগণিত করেন তবে আপনার সমস্যা হতে পারে, কারণ চিঠিটি ভুল বাক্সে চলে গেছে And অন্যদিকে - যদি পোস্ট অফিস মেলটি ফরোয়ার্ড করে, তবে আপনার পয়েন্টারে একটি পয়েন্টার রয়েছে))


1

এটি ধরার কোনও খারাপ উপায় নয়, এটি পুনরুক্তিকারীদের মাধ্যমে .. তবে খোঁজ চালিয়ে যেতে দেখবেন আপনি আলেকজান্দ্রেস্কু তাদের সম্পর্কে অভিযোগ করা শুরু করবেন।

অনেক প্রাক্তন সি -++ ডেভস (এটি কখনই বুঝতে পারেনি যে ভাষাগুলি ডাম্প করার আগে পুনরাবৃত্তি একটি আধুনিক পয়েন্টার) সি # তে ঝাঁপিয়ে পড়ে এবং এখনও বিশ্বাস করে যে তাদের শালীন পুনরাবৃত্তি রয়েছে।

হুম, সমস্যাটি হ'ল রানটাইম প্ল্যাটফর্মগুলি (জাভা / সিএলআর) কী অর্জন করার চেষ্টা করছে তা প্রত্যক্ষকারীরা সম্পূর্ণ প্রতিকূলতার সাথে: নতুন, সাধারণ, প্রত্যেকেই-ই-ডে-ব্যবহার। যা ভাল হতে পারে তবে তারা এটি বেগুনি বইয়ে একবার বলেছিল এবং তারা সি এর আগে এবং আগে এটি বলেছিল:

অপ্রত্যক্ষ্যতার।

একটি খুব শক্তিশালী ধারণা তবে এটি যদি আপনি সমস্তভাবে না করেন তবে .. ইল্টরিররা দরকারী হিসাবে তারা অ্যালগরিদমের বিমূর্তকরণে সহায়তা করে, এর অন্য একটি উদাহরণ। এবং সংকলন-সময় হ'ল এক অ্যালগরিদমের জায়গা, খুব সাধারণ। আপনি কোড + ডেটা, বা সেই অন্য ভাষাতে সি জানেন:

উল্লেখযোগ্য + লাইনকিউ + ম্যাসিভ ফ্রেমওয়ার্ক = লসির 300MB রানটাইম পেনাল্টি ইন্ডিয়ারেকশন, রেফারেন্সের ধরণের উদাহরণগুলির স্তূপের মাধ্যমে অ্যাপ্লিকেশন টেনে আনতে ..

"লে পয়েন্টার সস্তা।"


4
কি এই কিছু কি আছে?
নীল উইলিয়ামস

... আপনি কী বলতে চাইছেন, "স্থির লিংক এখনকার সবচেয়ে ভাল জিনিস" এবং "আমি আগে যা শিখেছি তার চেয়ে আলাদা কিছু আমি বুঝতে পারি না"?
লুয়ান

লুয়ান, আপনি সম্ভবত জানতে পারবেন না যে 2000 সালে জেআইটি কে ছড়িয়ে দিয়ে কেউ কী শিখতে পারে আপনি কী করতে পারেন? এটি এএসএম-তে অনলাইনে 2000-এ প্রদর্শিত যেমন একটি পয়েন্টার টেবিল থেকে লাফ টেবিলে শেষ হয়, তাই ভিন্ন কিছু বুঝতে না পেরে অন্য অর্থ গ্রহণ করতে পারে: সাবধানে পড়া একটি প্রয়োজনীয় দক্ষতা, আবার চেষ্টা করুন।
রামা-জেকা তোতি

1

উপরের কিছু উত্তর দৃserted়ভাবে জানিয়েছে যে "পয়েন্টারগুলি আসলেই শক্ত নয়", তবে সরাসরি "ঠিকানাগুলি শক্ত যেখানে ঠিকানা দেওয়া যায় নি!" থেকে আসে. কয়েক বছর আগে আমি প্রথম বর্ষের সিএস শিক্ষার্থীদের প্রশিক্ষণ দিয়েছিলাম (কেবল এক বছরের জন্য, যেহেতু আমি এটি স্পষ্টভাবে চুষেছিলাম) এবং এটি আমার কাছে স্পষ্ট হয়েছিল যে পয়েন্টারের ধারণাটি শক্ত নয়। কোনটি কঠিন এবং আপনি কখন পয়েন্টার চান তা বোঝা হচ্ছে

আমি মনে করি না আপনি বৃহত্তর সফটওয়্যার ইঞ্জিনিয়ারিংয়ের সমস্যাগুলি ব্যাখ্যা করে - কেন এবং কখন কোনও পয়েন্টার ব্যবহার করবেন - এই প্রশ্নটি আপনি বিবাহবিচ্ছেদ করতে পারবেন I কেন প্রতিটি ভেরিয়েবল বৈশ্বিক চলক হওয়া উচিত নয় এবং কেন একই ফাংশনগুলিতে কারও কারও মধ্যে ফ্যাক্টর তৈরি করা উচিত (এটি, এটি পেতে, তাদের কল সাইটে তাদের আচরণটি বিশেষজ্ঞ করার জন্য পয়েন্টার ব্যবহার করুন )।


0

পয়েন্টার সম্পর্কে এত বিভ্রান্তিকর কি তা আমি দেখছি না। তারা মেমরির কোনও অবস্থানকে নির্দেশ করে, এটাই মেমরির ঠিকানা সঞ্চয় করে। সি / সি ++ তে আপনি পয়েন্টার পয়েন্টগুলি টাইপ নির্দিষ্ট করতে পারেন। উদাহরণ স্বরূপ:

int* my_int_pointer;

বলে যে my_int_pointer এর মধ্যে এমন কোনও অবস্থানের ঠিকানা রয়েছে যা অন্তর্ভুক্ত রয়েছে।

পয়েন্টারগুলির সাথে সমস্যাটি হ'ল এগুলি স্মৃতিতে কোনও অবস্থানের দিকে নির্দেশ করে, তাই আপনার কোনও স্থানে থাকা উচিত নয় এমন জায়গায় প্রবেশ করা সহজ। বরাদ্দ সীমানা অতীত)।


0

জিনিসগুলিকে আরও কিছুটা বিভ্রান্ত করতে, কখনও কখনও আপনাকে পয়েন্টারগুলির পরিবর্তে হ্যান্ডলগুলি দিয়ে কাজ করতে হয়। হ্যান্ডলগুলি পয়েন্টারগুলিতে পয়েন্টার হয়, যাতে পিছনের প্রান্তটি স্মৃতিতে জিনিসগুলি হিফটিকে ডিফ্র্যাগমেন্ট করতে সরিয়ে দেয়। যদি মধ্য রুটিনে পয়েন্টার পরিবর্তিত হয়, ফলাফল অনির্দেশ্য হয়, তাই কোনও কিছুই কোথাও না যায় তা নিশ্চিত করতে আপনাকে প্রথমে হ্যান্ডেলটি লক করতে হবে।

http://arjay.bc.ca/Modula-2/Text/Ch15/Ch15.8.html#15.8.5 আমার চেয়ে কিছুটা সুসংহতভাবে এ সম্পর্কে কথা বলে। :-)


-1: হ্যান্ডলগুলি পয়েন্টারগুলিতে পয়েন্টার নয়; তারা কোনও অর্থে পয়েন্টার নয়। তাদের বিভ্রান্ত করবেন না।
আয়ান গোল্ডবি

"এগুলি কোনও অর্থে পয়েন্টার নয়" - ওম, আমি আলাদা হতে অনুরোধ করছি।
সারেকওফভালকান

একটি পয়েন্টার একটি মেমরি অবস্থান। একটি হ্যান্ডেল যে কোনও অনন্য শনাক্তকারী। এটি একটি পয়েন্টার হতে পারে, তবে এটি ঠিক পাশাপাশি অ্যারেতে সূচক হতে পারে বা অন্য কোনও বিষয় হতে পারে। আপনি যে লিঙ্কটি দিয়েছেন তা হ'ল একটি বিশেষ ক্ষেত্রে যেখানে হ্যান্ডেলটি পয়েন্টার, তবে এটির দরকার নেই। এছাড়াও দেখুন parashift.com/c++-faq-lite/references.html#faq-8.8
ইয়ান গোল্ডবি

এই লিঙ্কটি আপনার দৃ support় সমর্থনকে সমর্থন করে না যে তারা কোনও দিক থেকে পয়েন্টার নয়, - হয় - "উদাহরণস্বরূপ, হ্যান্ডলগুলি ফ্রেড ** হতে পারে, যেখানে ফ্রেড * পয়েন্টারকে নির্দেশিত ..." আমি মনে করি না -1 ন্যায্য ছিল।
সারেকওফভালকান

0

প্রতিটি সি / সি ++ শিক্ষানবিশের একই সমস্যা থাকে এবং সেই সমস্যাটি ঘটে না কারণ "পয়েন্টারগুলি শেখা শক্ত" তবে "কে এবং কীভাবে এটি ব্যাখ্যা করা হয়"। কিছু শিখরাই এটিকে মৌখিকভাবে কিছু দৃষ্টিভঙ্গি করে এবং এটি ব্যাখ্যা করার সর্বোত্তম উপায় হ'ল "ট্রেন" উদাহরণ ব্যবহার করা (মৌখিক এবং চাক্ষুষ উদাহরণের জন্য স্যুট) ব্যবহার করা।

যেখানে "লোকোমোটিভ" এমন একটি পয়েন্টার যেখানে কোনও কিছুই ধরে রাখতে পারে না এবং "ওয়াগন" হ'ল "লোকোমোটিভ" যা টানতে চেষ্টা করে (বা নির্দেশ করে)। এরপরে, আপনি "ওয়াগন" নিজেই শ্রেণিবদ্ধ করতে পারেন, এটি প্রাণী, গাছপালা বা মানুষকে (বা তাদের একটি মিশ্রণ) ধরে রাখতে পারে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.