লোকেরা সি পয়েন্টার সম্পর্কে কী অসুবিধে পায়? [বন্ধ]


173

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

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

সুতরাং, যদি আপনি পয়েন্টারগুলির সাথে লড়াই করে থাকেন, বা আপনি সম্প্রতি কিন্তু হঠাৎ "পেয়ে গেছেন", পয়েন্টারের এমন দিকগুলি কী ছিল যা আপনাকে সমস্যা তৈরি করেছিল?


54
স্পর্শকাতর, অহঙ্কারী, অযথা বিতর্কিত, সত্যের দানা দিয়ে উত্তর দিন: এগুলি পঙ্গু হয়েছে --- মানসিকভাবে বিকৃত হয়েছে, আমি তাদের বলি 'ইয়া --- এর মধ্যে প্রথমে তাদের "এক্সপ্রেরেটিভ" উচ্চ স্তরের ভাষাগুলি প্রকাশ করে। Shouldশ্বরের মতো একটি খালি ধাতুতে প্রোগ্রামিংয়ের মাধ্যমে তাদের শুরু করা উচিত ড্যানিয়েল বুন!
ডিএমকেকে --- প্রাক্তন-মডারেটর বিড়ালছানা

3
... এবং প্রোগ্রামার আরও ভাল হবে কারণ এটি আপনার সর্বোত্তম প্রচেষ্টা সত্ত্বেও এটি আলোচনার দিকে বিকশিত হবে
ডিএমকেকে --- প্রাক্তন-মডারেটর বিড়ালছানা

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

2
@ সাম জাফরন: যদিও আমি সাধারণত একমত যে এটি একটি প্রোগ্রামার বেশি SE তারা হয়।
জেকেরিয়ান

3
কেউ এই আনতে রয়েছে: --Bruce লি "এটা একটি আঙ্গুল চাঁদ দূরে নির্দেশ মত হল আঙুল মনোযোগ নেই অথবা যে সব স্বর্গীয় মহিমা মিস করবেন না।"
মিউ খুব ছোট

উত্তর:


86

আমি সন্দেহ করি লোকেরা তাদের উত্তরগুলিতে কিছুটা গভীর যাচ্ছে। সময়সূচী, প্রকৃত সিপিইউ ক্রিয়াকলাপ, বা সমাবেশ-স্তরের মেমরি পরিচালনার বোঝার সত্যই প্রয়োজন হয় না।

আমি যখন পড়াচ্ছিলাম, তখন আমি শিক্ষার্থীদের বোঝার মধ্যে নিম্নলিখিত ছিদ্রগুলি সমস্যার সর্বাধিক সাধারণ উত্স হিসাবে পেয়েছি:

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

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

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


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

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

9
@ জন মার্কেটি: আরও বেশি ... এই প্রশ্নটি দেওয়া হয়েছিল যে "পয়েন্টারগুলির সাথে জনগণের সমস্যাটি মূল সমস্যাটি কী", আমি মনে করি না যে পয়েন্টার সম্পর্কিত প্রশ্নকারী লোকেরা "আপনি ডন" দ্বারা ভয়াবহভাবে মুগ্ধ হবেন? "উত্তর হিসাবে সত্যই জানতে হবে" স্পষ্টতই তারা একমত না। :)
জেকেরিয়ান

3
@ জাকারিয়ান এটি পুরানো হতে পারে তবে কে ও আর এর তিন বা চার পৃষ্ঠাগুলি যা পয়েন্টারগুলি ব্যাখ্যা করে তা বাস্তবায়নের বিশদ প্রয়োজন ছাড়াই এটি করে। বাস্তবায়নের বিশদ সম্পর্কিত জ্ঞান বিভিন্ন কারণে কার্যকর, তবে আইএমএইচও, কোনও ভাষার মূল গঠন বোঝার জন্য এটি পূর্বশর্ত হওয়া উচিত নয়।
সিগজুইস

3
"সাধারণত বিভিন্ন স্থানে স্পষ্টত কাল্পনিক ঠিকানা দেওয়া সাহায্য করে।" -> +1
ফ্রেডওভারফ্লো

146

যখন আমি প্রথম তাদের সাথে কাজ শুরু করি তখন আমার সবচেয়ে বড় সমস্যাটি ছিল সিনট্যাক্স।

int* ip;
int * ip;
int *ip;

সব একই।

কিন্তু:

int* ip1, ip2;  //second one isn't a pointer!
int *ip1, *ip2;

কেন? কারণ ঘোষণার "পয়েন্টার" অংশটি ভেরিয়েবলের সাথে সম্পর্কিত, এবং প্রকারের নয়।

এবং তারপরে জিনিসটিকে ডিফারেন্সিংয়ের সাথে খুব মিল খুঁজে পাওয়া যায়:

*ip = 4;  //sets the value of the thing pointed to by ip to '4'
x = ip;   //hey, that's not '4'!
x = *ip;  //ahh... there's that '4'

যখন আপনাকে আসলে পয়েন্টার পাওয়ার দরকার হয় ... তবে আপনি একটি অ্যাম্পারস্যান্ড ব্যবহার করেন!

int *ip = &x;

ধারাবাহিকতার জন্য হুর!

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

void foo(****ipppArr);

এটি কল করার জন্য, আমার পয়েন্টারগুলিতে ইন্টের পয়েন্টারগুলিতে পয়েন্টারগুলির অ্যারের ঠিকানা প্রয়োজন:

foo(&(***ipppArr));

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


21
প্রথমটিতে আপনার মন্তব্য, >> * আইপি = 4; // আইপি-র মান '4' এ সেট করে << ভুল। এটি হওয়া উচিত >> // আইপি দ্বারা নির্দেশিত জিনিসটির মান '4' এ সেট করে
aaaa bbbb

8
একে অপরের উপরে অনেক ধরণের স্ট্যাক করা কোনও ভাষাতেই খারাপ ধারণা। আপনি "foo (& (*** ipppArr))" লেখা লিখতে পারেন; সি-তে অদ্ভুত, তবে "std :: map <std :: جوڑ <int, int>, std :: جوڑ <std :: vector <int>, std :: tuple <int, Double, std :: list এর মতো কিছু লিখছেন" <int> >>> "সি ++ এও খুব জটিল। এর অর্থ এই নয় যে সি ++ এর সি বা এসটিএল পাত্রে পয়েন্টারগুলি জটিল। এটির অর্থ হ'ল আপনার কোডের পাঠকের পক্ষে এটি বোঝার জন্য আপনাকে আরও ভাল টাইপ-সংজ্ঞা ব্যবহার করতে হবে।
প্যাট্রিক

20
আমি আন্তরিকভাবে বিশ্বাস করতে পারি না সিনট্যাক্সের একটি ভুল বোঝাবুঝি সবচেয়ে বেশি ভোট দেওয়া উত্তর। এটি পয়েন্টার সম্পর্কে সহজতম অংশ।
জেসন

4
এমনকি এই উত্তরটি পড়ে, আমি কাগজের একটি শীট পেতে এবং ছবি আঁকার জন্য প্রলুব্ধ হয়েছিল। সি তে, আমি সবসময় ছবি আঁকতাম।
মাইকেল ইস্টার

19
@ জেসন সংখ্যাগরিষ্ঠ মানুষ যে সমস্যাটিকে কঠিন বলে মনে করেন, তার ব্যতীত আর কী উদ্দেশ্যমূলক সমস্যা রয়েছে?
রূপার্ট ম্যাডেন-অ্যাবট

52

পয়েন্টারগুলির সঠিক বোঝার জন্য অন্তর্নিহিত মেশিনের আর্কিটেকচার সম্পর্কে জ্ঞান প্রয়োজন requires

বর্তমানে অনেক প্রোগ্রামার জানেন না যে তাদের মেশিন কীভাবে কাজ করে, ঠিক তেমনই যারা গাড়ি চালাতে জানেন তাদের বেশিরভাগ লোক ইঞ্জিন সম্পর্কে কিছুই জানেন না।


18
@ ডিএমকে: ঠিক আছে, আমি কি ভুল করছি? কতটি জাভা প্রোগ্রামাররা সেগফোল্টের সাথে ডিল করতে পারে?
রবার্ট হার্ভে

5
সেগফাল্টস কি স্টিক শিফটে কিছু করার আছে? - একটি জাভা প্রোগ্রামার
টম অ্যান্ডারসন

6
@ রবার্ট: এটি একটি আসল পরিপূরক হিসাবে বোঝানো হয়েছিল। মানুষের অনুভূতিতে আঘাত না দিয়ে আলোচনা করার পক্ষে এটি একটি কঠিন বিষয়। এবং আমি ভয় করি যে আমার মন্তব্যটি খুব দ্বন্দ্বকে সরিয়ে নিয়েছে আমি ভেবেছিলাম আপনি এড়াতে সক্ষম হবেন। মাই কাপলা।
ডিএমকেকে --- প্রাক্তন-মডারেটর বিড়ালছানা

30
আমি দ্বিমত পোষণ করি; পয়েন্টার পেতে আপনাকে অন্তর্নিহিত আর্কিটেকচারটি বোঝার দরকার নেই (তারা যাই হোক না কেন বিমূর্ততা)।
জেসন

11
@ জেসন: সি-তে একটি পয়েন্টার মূলত একটি মেমরি ঠিকানা is মেশিনের আর্কিটেকচার না বুঝে নিরাপদে তাদের সাথে কাজ করা অসম্ভব। দেখুন en.wikipedia.org/wiki/Pointer_(computing) এবং boredzo.org/pointers/#definition
রবার্ট হার্ভে

42

পয়েন্টারগুলির সাথে কাজ করার সময়, বিভ্রান্ত হয়ে পড়ে এমন ব্যক্তিরা দুটি শিবিরের একটিতে ব্যাপকভাবে থাকে। আমি দুজনেই ছিলাম (আছি?)

array[]ভিড়

এটি এমন ভিড় যা সরাসরি জানে না কীভাবে পয়েন্টার নোটেশন থেকে অ্যারে স্বরলিপিতে অনুবাদ করতে হয় (বা এমনকি তারা জানে না যে তারা এমনকি সম্পর্কিত)। এখানে অ্যারের উপাদানগুলি অ্যাক্সেস করার চারটি উপায় রয়েছে:

  1. অ্যারের নামের সাথে অ্যারে স্বরলিপি (সূচীকরণ)
  2. পয়েন্টার নামের সাথে অ্যারে স্বরলিপি (সূচীকরণ)
  3. পয়েন্টার নামের সাথে পয়েন্টার স্বরলিপি (* *)
  4. অ্যারের নামের সাথে পয়েন্টার স্বরলিপি (* *)

 

int vals[5] = {10, 20, 30, 40, 50};
int *ptr;
ptr = vals;

array       element            pointer
notation    number     vals    notation

vals[0]     0          10      *(ptr + 0)
ptr[0]                         *(vals + 0)

vals[1]     1          20      *(ptr + 1)
ptr[1]                         *(vals + 1)

vals[2]     2          30      *(ptr + 2)
ptr[2]                         *(vals + 2)

vals[3]     3          40      *(ptr + 3)
ptr[3]                         *(vals + 3)

vals[4]     4          50      *(ptr + 4)
ptr[4]                         *(vals + 4)

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

reference to a pointerএবং pointer to a pointerভিড়

এই একটি দুর্দান্ত নিবন্ধ যা পার্থক্যটি ব্যাখ্যা করে এবং যা আমি উদ্ধৃত করব এবং এর থেকে কিছু কোড চুরি করব :)

একটি ছোট উদাহরণ হিসাবে, আপনি যদি এরকম কিছু পেয়ে থাকেন তবে লেখক ঠিক কী করতে চেয়েছিলেন তা দেখতে খুব কঠিন হতে পারে:

//function prototype
void func(int*& rpInt); // I mean, seriously, int*& ??

int main()
{
  int nvar=2;
  int* pvar=&nvar;
  func(pvar);
  ....
  return 0;
}

বা, কিছুটা হলেও এরকম কিছু:

//function prototype
void func(int** ppInt);

int main()
{
  int nvar=2;
  int* pvar=&nvar;
  func(&pvar);
  ....
  return 0;
}

সুতরাং দিনের শেষে, আমরা সত্যিই কি এই সব জবাবদিহি সঙ্গে সমাধান? কিছুই নেই।

এখন আমরা পিটিআর-টু-পিটিআর এবং রেফ-টু-পিটিআর-র সিনট্যাক্স দেখেছি। একে অপরের ওপরে কোনও সুবিধা আছে কি? আমি ভীত, না। কিছু প্রোগ্রামারদের জন্য উভয়ের মধ্যে একটির ব্যবহার কেবল ব্যক্তিগত পছন্দ। কিছু যারা রেফ-টু-পিটিআর ব্যবহার করেন তারা বলেন সিনট্যাক্সটি "ক্লিনার" আবার কেউ কেউ পিটিআর-টু-পিটিআর ব্যবহার করেন বলে পিটিআর-টু-পিটিআর সিনট্যাক্সটি আপনি কী করছেন তা পড়ার ক্ষেত্রে এটি আরও স্পষ্ট করে তোলে।

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

পূর্ববর্তী উত্তরে মন্তব্য করা হয়েছে, অনেক সময় আপনার কাছে এই হটশট প্রোগ্রামাররা মনে করে যে তারা ব্যবহার করে চালাক হয়ে ******awesome_var->lol_im_so_clever()উঠছে এবং আমাদের মধ্যে বেশিরভাগ লোকেরা এই সময়ে এমন নৃশংসতা লেখার জন্য দোষী হয় তবে এটি কেবল ভাল কোড নয়, এবং এটি অবশ্যই রক্ষণাবেক্ষণযোগ্য নয় ।

এই উত্তরটি আমার প্রত্যাশার চেয়ে দীর্ঘ হতে পারে ...


5
আমি মনে করি আপনি এখানে একটি সি প্রশ্নের উত্তর দিতে পারেন ... কমপক্ষে দ্বিতীয় অংশটি।
অবধি

পয়েন্টারগুলিতে পয়েন্টারগুলি সি-
তেও

1
হেহ? অ্যারে ঘুরে দেখার সময় আমি কেবল পয়েন্টারগুলিকেই দেখি - আপনার দ্বিতীয় উদাহরণটি বেশিরভাগ শালীন সি কোডের জন্য সত্যিকারের জন্য প্রযোজ্য নয়। এছাড়াও, আপনি সিটিকে সি ++ এর মেসে টেনে আনছেন - সি-তে রেফারেন্স বিদ্যমান নেই।
new123456

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

2
"রেফারেন্সের নির্দেশকগুলি সি তে অবৈধ" - আরও "অনুপস্থিত" এর মতো :)
কোস

29

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

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


3
হ্যাঁ. 'int foo = 5; int * pfoo = & foo; দেখুন যে কিভাবে দরকারী? ঠিক আছে, পাশাপাশি চলুন ... 'আমি নিজের ডাবল-লিঙ্কযুক্ত তালিকার লাইব্রেরি না লিখে আমি সত্যই পয়েন্টার ব্যবহার করি না।
জন লোপেজ

2
+1 টি। আমি সিএস 100 শিক্ষার্থীদের টিউটর ব্যবহার করি এবং তাদের অনেকগুলি সমস্যার সমাধান কেবলমাত্র একটি বোধগম্য উপায়ে পয়েন্টারগুলিতে গিয়ে সমাধান করা হয়েছিল।
বেনজাদো

1
1তিহাসিক প্রেক্ষাপটের জন্য +1। দীর্ঘ সময় পরে শুরু করার পরে, এটি আমার কাছে কখনও ঘটেনি।
লুমি

26

জোয়েল স্পলস্কির সাইটে - জাভাস্কুলগুলির দ্য পেরিলস - এর পক্ষে পয়েন্টারগুলি কঠোর ধারণাটিকে সমর্থন করার জন্য একটি দুর্দান্ত নিবন্ধ রয়েছে

[অস্বীকৃতি - আমি প্রতি সেভা জাভা-বিদ্বেষী নই ]]


2
@ জেসন - এটি সত্য তবে তর্কটিকে তুচ্ছ করে না।
স্টিভ টাউনসেন্ড

4
স্পোলস্কি বলছেন না যে জাভাস্কুলগুলি লোকেরা পয়েন্টারগুলিকে কঠিন বলে মনে করে। তিনি বলছেন যে তারা কম্পিউটার সায়েন্স ডিগ্রি সহ পয়েন্টার-নিরক্ষর লোকদের ফলাফল দেয়।
বেনজাদো

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

1
@ স্টিভ টাউনসেন্ড: আমি মনে করি আপনি মিঃ স্পলস্কির যুক্তির বিন্দুটি অনুপস্থিত।
জেসন

2
@ স্টিভ টাউনসেন্ড: মিঃ স্পলস্কি যুক্তি দিচ্ছেন যে জাভা স্কুলগুলি এমন একটি প্রজন্মের প্রোগ্রামার উত্থাপন করছে যা পয়েন্টার এবং পুনরাবৃত্তি জানে না, জাভা স্কুলগুলির প্রচলনের কারণে পয়েন্টারগুলি শক্ত নয়। আপনি যেমনটি বলেছেন যে "এটি কেন কঠোর তা সম্পর্কে একটি দুর্দান্ত নিবন্ধ আছে" এবং উক্ত নিবন্ধটির সাথে লিঙ্কযুক্ত বলে মনে হচ্ছে আপনার পরবর্তী ব্যাখ্যাটি রয়েছে। আমি ভুল হলে আমাকে ক্ষমা করুন।
জেসন

24

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

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

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


1
এটি শেখার একটি ভাল উপায় হ'ল 8-বিট মাইক্রোকন্ট্রোলারগুলি প্রোগ্রাম করা। তারা বুঝতে সহজ। Atmel এভিআর নিয়ন্ত্রণকারীদের নিন; এমনকি তারা জিসিসি দ্বারা সমর্থিত।
জেনু

@ শেনু: আমি একমত আমার জন্য এটি ইন্টেল 8008 এবং 8051 :-) ছিল
মাইক ডুনলাভে

আমার কাছে এটি ছিল সময়ের কাস্টম মিস্টগুলিতে এমআইটিতে একটি কাস্টম 8-বিট কম্পিউটার ("সম্ভবত")।
কোয়ান্টামমেকানিক

মাইক - আপনার শিক্ষার্থীদের একটি
কার্ডিয়াক করা

1
@ কোয়ান্টাম: CARDIAC- ভাল, এটি শুনে নি। "সম্ভবত" - আমাকে অনুমান করুন, যখন সসমান (এট আল) লোকেরা মিড-কনওয়ের বইটি পড়ত এবং তাদের নিজস্ব এলএসআই চিপস আঁকছিল? ওখানে আমার সময় কাটার একটু পরে।
মাইক ডুনলাভে

17

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

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

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

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


4
এম্বেড থাকা অ্যাপ্লিকেশনগুলিতে (র‌্যাম, রম, সিপিইউ) কাজ করার জন্য আপনার যদি সীমিত সংস্থান থাকে তবে পয়েন্টারগুলি আরও অনেক বেশি অর্থবোধ করে।
নিক টি

নিকের মন্তব্যের জন্য +1 - বিশেষত স্ট্রাস্টগুলি পাস করার জন্য।
new123456

12

এখানে একটি পয়েন্টার / অ্যারের উদাহরণ যা আমাকে বিরতি দিয়েছে। ধরুন আপনার দুটি অ্যারে রয়েছে:

uint8_t source[16] = { /* some initialization values here */ };
uint8_t destination[16];

এবং আপনার লক্ষ্য হ'ল মেমকি () ব্যবহার করে উত্স গন্তব্য থেকে uint8_t সামগ্রীগুলি অনুলিপি করা। অনুমান করুন যে নিম্নলিখিতটি কোনটি অর্জন করে:

memcpy(destination, source, sizeof(source));
memcpy(&destination, source, sizeof(source));
memcpy(&destination[0], source, sizeof(source));
memcpy(destination, &source, sizeof(source));
memcpy(&destination, &source, sizeof(source));
memcpy(&destination[0], &source, sizeof(source));
memcpy(destination, &source[0], sizeof(source));
memcpy(&destination, &source[0], sizeof(source));
memcpy(&destination[0], &source[0], sizeof(source));

উত্তর (স্পোলার সতর্কতা!) তাদের মধ্যে সমস্ত। "গন্তব্য", "& গন্তব্য", এবং "& গন্তব্য [0]" সমস্ত একই মান। "এবং গন্তব্য" অন্য দুটির চেয়ে আলাদা ধরণের , তবে এটি এখনও একই মান। "উত্স" এর ক্রমানুসারে একই হয় same

একদিকে যেমন আমি ব্যক্তিগতভাবে প্রথম সংস্করণ পছন্দ করি।


আমি প্রথম সংস্করণটিও পছন্দ করি (কম বিরামচিহ্ন)।
সিগজুইস

++ আমিও তাই করি তবে আপনার অবশ্যই সত্যই যত্নবান হওয়া দরকার sizeof(source)কারণ যদি sourceপয়েন্টার হয় তবে sizeofএটি আপনি যা চান তা তা নয়। আমি মাঝে মাঝে (সর্বদা নয়) sizeof(source[0]) * number_of_elements_of_sourceকেবল এই বাগ থেকে দূরে থাকতে লিখি ।
মাইক ডুনলাভে

গন্তব্য, এবং গন্তব্য, এবং গন্তব্য [0] একেবারে এক নয় - তবে মেমকিতে ব্যবহার করার সময় প্রতিটি আলাদা ব্যবস্থার মাধ্যমে একই অকার্যকর * রূপান্তরিত হবে। যাইহোক, আকারের যুক্তি হিসাবে ব্যবহার করার সময়, আপনি দুটি পৃথক ফলাফল পাবেন এবং তিনটি পৃথক ফলাফল সম্ভব।
gnasher729

আমি ভাবলাম অপারেটরের ঠিকানা দরকার ছিল?
মার্কাসজে

7

আমার বলা শুরু করা উচিত যে সি এবং সি ++ প্রথম প্রোগ্রামিং ভাষা আমি শিখেছিলাম। আমি সি দিয়ে শুরু করেছি, তারপরে স্কুলে সি ++ করেছি, অনেক কিছু, এবং তারপরে সি ফ্ল্যাশ হয়ে ফিরে এলাম back

সি শিখার সময় পয়েন্টার সম্পর্কে আমাকে প্রথম যে বিষয়টি বিভ্রান্ত করেছিল তা হ'ল সহজ:

char ch;
char str[100];
scanf("%c %s", &ch, str);

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

এটি সম্পর্কে বিভ্রান্তিকর বিষয়টি হ'ল যা &chআসলে এর অর্থ হ'ল কেন strএটির প্রয়োজন হয়নি।

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

char * x = NULL;
if (y) {
     char z[100];
     x = z;
}

গতিশীলভাবে কিছু জায়গা বরাদ্দ করার চেষ্টা করার জন্য। এটি কাজ করে না। আমি নিশ্চিত ছিল না যে এটি কাজ করবে, তবে আমি জানি না এটি কীভাবে কাজ করবে।

আমি পরে সম্বন্ধে শিখেছিল mallocএবং new, কিন্তু তারা সত্যিই আমাকে ঐন্দ্রজালিক মেমরির জেনারেটর ভালো লাগে। তারা কীভাবে কাজ করতে পারে সে সম্পর্কে আমি কিছুই জানতাম না।

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

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

যেহেতু আমি পরের বা দু'বছর স্কুলের জন্য সি ++ লিখছিলাম আমি ডেটা স্ট্রাকচারের জন্য পয়েন্টার ব্যবহার করে প্রচুর অভিজ্ঞতা পেয়েছি। এখানে আমার সমস্যার একটি নতুন সেট ছিল - পয়েন্টারগুলি মিশ্রণ করে। আমার কাছে একাধিক স্তরের পয়েন্টার (জিনিসগুলি node ***ptr;) আমাকে ট্রিপ করতে হবে। আমি একটি পয়েন্টারকে ভুল সংখ্যক বারের মতো করে *দেব এবং শেষ পর্যন্ত পরীক্ষার এবং ত্রুটির দ্বারা আমার কতটুকু দরকার তা খুঁজে বের করার চেষ্টা করব।

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

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

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

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

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

int foo(struct frog * f, int x, int y) {
    struct leg * g = f->left_leg;
    struct toe * t = g->big_toe;
    process(t);

যাতে আমি যদি কোনও পয়েন্টার টাইপ স্ক্রু করি তবে সমস্যাটি কী তা সংকলক ত্রুটি দ্বারা এটি খুব পরিষ্কার। যদি আমি করতাম:

int foo(struct frog * f, int x, int y) {
    process(f->left_leg->big_toe);

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


1
+1 টি। পুরো এবং অন্তর্দৃষ্টিপূর্ণ। আমি স্ক্যানফ সম্পর্কে ভুলে গিয়েছিলাম, তবে এখন আপনি এটি আনেন, মনে আছে একই বিভ্রান্তি রয়েছে।
জো হোয়াইট

6

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

  1. একটি রুটিন রচনা যা একটি পূর্ণসংখ্যার দিকে পয়েন্টার নিয়ে যায় এবং পূর্ণসংখ্যাকে সংশোধন করে। এটি আমাকে প্রয়োজনীয় ফর্ম দিয়েছে যার উপর পয়েন্টার কীভাবে কাজ করে তার কোনও মানসিক মডেল তৈরি করতে পারে।

  2. এক-মাত্রিক গতিশীল মেমরি বরাদ্দ। 1-ডি মেমরির বরাদ্দ নির্ধারণের ফলে আমাকে পয়েন্টারের ধারণাটি বোঝায়।

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

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

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

এখন আপনার মূল প্রশ্নে ফিরে আসুন। পূর্ববর্তী তালিকার উপর ভিত্তি করে, বেশ কয়েকটি আইটেম ছিল যা মূলত আঁকতে আমার অসুবিধা হয়েছিল।

  1. কিভাবে এবং কেন একজন পয়েন্টার ব্যবহার করবে।
  2. তারা কীভাবে আলাদা এবং তবুও অ্যারেগুলির সাথে সমান।
  3. পয়েন্টার তথ্য কোথায় সঞ্চয় করা হয়েছে তা বোঝা।
  4. এটি কী এবং কোথায় এটি পয়েন্টারটি নির্দেশ করছে।

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

1
@ অ্যালেক্স স্টারবাক - এর অর্থ হ'ল ফ্লিপ্যান্ট বাজানো নয়, তবে বৈজ্ঞানিক পদ্ধতিটি একটি দুর্দান্ত সরঞ্জাম। কোনও নির্দিষ্ট দৃশ্যের জন্য আপনি কী ভাবতে পারেন সে সম্পর্কে নিজেকে একটি ছবি আঁকুন। এটি পরীক্ষা করার জন্য কিছু প্রোগ্রাম করুন এবং আপনি কী পেয়েছেন তা বিশ্লেষণ করুন। আপনার প্রত্যাশার সাথে কি মিলছে? যদি তা না হয় তবে কোথায় আলাদা? প্রয়োজনীয় হিসাবে পুনরাবৃত্তি করুন, ধীরে ধীরে আপনার বোধগম্যতা এবং মানসিক মডেল উভয়কে পরীক্ষা করার জন্য জটিলতা বাড়িয়ে তুলুন।
স্পার্কি

6

সিতে কিছু টেলিফোনি প্রোগ্রামে কাজ করার জন্য আমার "পয়েন্টার মুহুর্ত" ছিল আমার প্রোটোকল বিশ্লেষক ব্যবহার করে একটি এক্সএক্স 10 এক্সচেঞ্জ এমুলেটর লিখতে হয়েছিল যা কেবল ক্লাসিক সি বুঝতে পেরেছিল সবকিছুই পয়েন্টারগুলি জানার সাথে জড়িত। আমি তাদের ছাড়াই আমার কোড লেখার চেষ্টা করেছি (আরে, আমি "প্রি-পয়েন্টার" ছিলাম আমাকে কিছুটা স্ল্যাক কেটে দিয়েছিলাম) এবং পুরোপুরি ব্যর্থ হয়েছিল।

সেগুলি বোঝার মূল কথাটি আমার জন্য, & (ঠিকানা) অপারেটর ছিল। একবার আমি বুঝতে পেরেছিলাম যে &i"i এর ঠিকানা" এর অর্থ বোঝা যাচ্ছে তারপরে বোঝা যা *i"i দ্বারা নির্দেশিত ঠিকানার বিষয়বস্তু" কিছুটা পরে এসেছিল। আমি যখনই আমার কোডটি লিখি বা পড়ি তখন আমি সর্বদা "&" এর অর্থ এবং "*" বলতে কী বোঝায় এবং শেষ পর্যন্ত আমি এগুলি স্বজ্ঞাতভাবে ব্যবহার করতে এসেছি।

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


যদি &iঠিকানা *iহয় এবং বিষয়বস্তু হয়, কি i?
থমাস আহলে

2
আমি আই এর ব্যবহারকে ওভারলোড করার ধরণের করছি। স্বেচ্ছাসেবী ভেরিয়েবলের জন্য আমি, এবং আমার অর্থ "আমি" এর ঠিকানা, আমি এর নিজের অর্থ "& i এর বিষয়বস্তু", এবং * আমি "& এর বিষয়বস্তুকে ঠিকানা হিসাবে বিবেচনা করি, সেই ঠিকানায় যান এবং ফিরে পাস করুন pass বিষয়বস্তু "।
গ্যারি রোয়ে

5

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

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

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


4
সত্যিই, পয়েন্টারগুলির সাথে আপনার এখনও অসুবিধা রয়েছে তা নিশ্চিত করেই, আমি নিশ্চিত নই যে কর্নেলের আপনার অভিজ্ঞতা জোয়েলের নিবন্ধের সাথে বিরোধিতা করে। স্পষ্টতই আপনার মস্তিষ্কের একটি জাভা-মানসিকতায় তার বক্তব্য তৈরির পক্ষে যথেষ্ট পরিমাণে তারযুক্ত।
জেকেরিয়ান

5
ওয়াত? জাভা সম্পর্কিত রেফারেন্স (বা সি #, বা পাইথন, বা সম্ভবত কয়েক ডজন অন্যান্য ভাষা) পাটিগণিত ছাড়াই কেবল পয়েন্টার। পয়েন্টারগুলি বোঝার অর্থ বোঝা যাচ্ছে যে যুক্তিটি void foo(Clazz obj) { obj = new Clazz(); }void bar(Clazz obj) { obj.quux = new Quux(); }

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

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

5

এখানে একটি উত্তর নেই: এটি নির্ধারণের জন্য সিডেক্সেল (বা সি ++ ডেসেল) ব্যবহার করুন:

eisbaw@leno:~$ cdecl explain 'int (*(*foo)(const void *))[3]'
declare foo as pointer to function (pointer to const void) returning pointer to array 3 of int

4

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

int a;
a = 5

সেখানে পরিবর্তনের শুধুমাত্র এক জিনিস আছে: a। আপনি লিখতে পারেন a = 6এবং ফলাফল বেশিরভাগ লোকের কাছে সুস্পষ্ট। তবে এখন বিবেচনা করুন:

int *a;
a = &some_int;

সে সম্পর্কে দুটি aসময়ে বিভিন্ন সময়ে প্রাসঙ্গিক: aপয়েন্টারটির আসল মান , পয়েন্টার এবং মানটির পিছনে "মান" থাকে। আপনি পরিবর্তন করতে পারেন a:

a = &some_other_int;

... এবং some_intএখনও একই মান সঙ্গে কোথাও আছে। তবে আপনি যে জিনিসটিকে নির্দেশ করেছেন সেটিও আপনি পরিবর্তন করতে পারবেন:

*a = 6;

এর মধ্যে একটি ধারণাগত ব্যবধান রয়েছে a = 6, যার কেবল স্থানীয় পার্শ্ব প্রতিক্রিয়া রয়েছে এবং *a = 6যা অন্যান্য জায়গাগুলির গুচ্ছকে প্রভাবিত করতে পারে। এখানে আমার বক্তব্যটি নয় যে ইন্ডিরিয়ারেশন ধারণাটি অন্তর্নিহিতভাবে জটিল but তবে এটি যেহেতু আপনি তাত্ক্ষণিক, স্থানীয় জিনিস বা অপ্রত্যক্ষভাবে উভয়a জিনিসই করতে পারেন *a... এটিই হয়ত মানুষকে বিভ্রান্ত করে।


4

আমি 2 বছরের মত সি ++ এ প্রোগ্রাম করেছিলাম এবং তারপর জাভাতে পরিণত হয়েছিলাম (5 বছর) এবং কখনই পিছনে ফিরে তাকাতে পারি নি। যাইহোক, যখন আমি সম্প্রতি কিছু নেটিভ স্টাফ ব্যবহার করতে হয়েছিলাম, আমি খুঁজে পেয়েছি (অবাক করে দিয়ে) যে আমি পয়েন্টারগুলি সম্পর্কে কিছুই ভুলে যাইনি এবং আমি সেগুলি ব্যবহার করতে সহজও পেয়েছি। আমি 7 বছর আগে যখন আমি ধারণাটি উপলব্ধি করার চেষ্টা করেছি তখন এটির তীব্র বিপরীত। সুতরাং, আমি অনুমান করি এবং পছন্দ করা প্রোগ্রামিংয়ের পরিপক্কতার বিষয়? :)

অথবা

পয়েন্টারগুলি বাইক চালানোর মতো, একবার আপনি কীভাবে তাদের সাথে কাজ করবেন তা বুঝতে পারলে, এটি ভুলে যাওয়ার কোনও দরকার নেই।

সব মিলিয়ে, বোঝা শক্ত বা না, পুরো পয়েন্টার ধারণাটি খুব শিক্ষামূলক এবং আমি বিশ্বাস করি যে প্রতিটি প্রোগ্রামার যদি পয়েন্টার সহ কোনও ভাষাতে প্রোগ্রাম করেন বা না করেন তবে তা প্রতিটি প্রোগ্রামারের দ্বারা বোঝা উচিত understood


3

ইন্ডিয়ারেশনের কারণে পয়েন্টারগুলি কঠিন।


"এটি বলা হয়ে থাকে যে কম্পিউটার বিজ্ঞানে এমন কোনও সমস্যা নেই যা আরও এক মাত্রার ইন্ডিয়ারেশনের মাধ্যমে সমাধান করা যায় না" (যদিও কে প্রথমে এটি বলেছিল তা ধারণা নেই)
দ্য আরটিটিপাল পল ২:5

এটি ম্যাজিকের মতো, যেখানে ভুল দিকনির্দেশটিই মানুষকে বিভ্রান্ত করে (তবে সম্পূর্ণ দুর্দান্ত)
নিক টি ২

3

পয়েন্টারগুলি (নিম্ন-স্তরের কাজের আরও কিছু দিকের সাথে) ব্যবহারকারীর যাদুটি সরিয়ে নিতে হবে।

বেশিরভাগ উচ্চ স্তরের প্রোগ্রামার যাদু পছন্দ করে।


3

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

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

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

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

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


3

আমি মনে করি যে সি পয়েন্টারগুলি মুশকিল হবার একটি কারণ হ'ল তারা বেশ কয়েকটি ধারণা ধারণ করে যা সত্যিকারের সমতুল্য নয়; তবুও, কারণ এগুলি সমস্ত পয়েন্টার ব্যবহার করে বাস্তবায়ন করা হয়েছে, তাই ধারণাগুলি ভেঙে ফেলার জন্য লোকেরা কঠিন সময় কাটাতে পারে।

সি-তে, পয়েন্টারগুলি অন্যান্য জিনিসগুলিতে ব্যবহৃত হয়:

  • পুনরাবৃত্ত তথ্য স্ট্রাকচারের সংজ্ঞা দিন

সি তে আপনি এই জাতীয় সংখ্যার লিঙ্কযুক্ত তালিকাটি সংজ্ঞায়িত করতে পারবেন:

struct node {
  int value;
  struct node* next;
}

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

data List = List Int List | Null

বেশ সোজা - একটি তালিকা হয় ফাঁকা, অথবা একটি মান এবং তালিকার বাকী অংশ থেকে গঠিত।

  • স্ট্রিং এবং অ্যারে ওভার ইটারেট করুন

আপনি এখানে fooসি স্ট্রিংয়ের প্রতিটি চরিত্রের জন্য কীভাবে কোনও ফাংশন প্রয়োগ করতে পারেন তা এখানে :

char *c;
for (c = "hello, world!"; *c != '\0'; c++) { foo(c); }

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

  • পলিমারফিজম অর্জন করুন

এখানে গ্লিবের একটি প্রকৃত ফাংশন স্বাক্ষর পাওয়া যায় :

typedef struct g_list GList;

void  g_list_foreach    (GList *list,
                 void (*func)(void *data, void *user_data),
                         void* user_data);

ওহো! এটি বেশ মুখের void*। এবং এটি কেবল কেবল এমন কোনও ফাংশন ঘোষণার জন্য যা প্রতিটি সদস্যের সাথে একটি ফাংশন প্রয়োগ করে কোনও ধরণের তালিকার উপরে পুনরাবৃত্তি করে thing mapহাস্কেল-এ কীভাবে ঘোষণা করা হয়েছে তার সাথে এটি তুলনা করুন :

map::(a->b)->[a]->[b]

যে আরো অনেক সহজবোধ্য আছে: mapএকটি ফাংশন যে একটা ফাংশন যা পরিবর্তন করে নেয় aএকটি থেকে b, এবং একটি তালিকায় তা প্রযোজ্য a'র একটি তালিকা উত্পাদ bs' এর। শুধু সি ফাংশনে মত g_list_foreach, mapধরনের যা এটি প্রয়োগ করা হবে সম্পর্কে তার নিজস্ব সংজ্ঞা কিছু জানা প্রয়োজন নেই।

সংক্ষেপে:

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


c != NULLআপনার "হ্যালো ওয়ার্ল্ড" উদাহরণে অপব্যবহার ... আপনার অর্থ *c != '\0'
ওলাফ সেবার্ট

2

আমি মনে করি এটির জন্য একটি শক্ত ভিত্তি প্রয়োজন সম্ভবত মেশিন স্তর থেকে কিছু মেশিন কোড, সমাবেশ এবং র‍্যামে আইটেম এবং ডেটা কাঠামোর উপস্থাপনা কীভাবে করা যায় with এটি একটু সময় নেয়, কিছু বাড়ির কাজ বা সমস্যা সমাধানের অনুশীলন এবং কিছু চিন্তাভাবনা।

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


2
গ্রাঙ্ক পয়েন্টারগুলিতে মেশিন কোড বা সমাবেশের বোঝার প্রয়োজন হয় না।
জেসন

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

2

আমার সর্বদা যে সমস্যাটি ছিল (মূলত স্ব-শিক্ষিত) সেটি হল পয়েন্টার ব্যবহার করার "কখন"। আমি পয়েন্টার তৈরির জন্য সিনট্যাক্সের চারপাশে আমার মাথাটি গুটিয়ে রাখতে পারি তবে কোন পরিস্থিতিতে পয়েন্টার ব্যবহার করা উচিত তা আমার জানতে হবে।

এই মানসিকতা নিয়ে আমিই কি একা? ;-)


আমি তা পেয়েছি আমার প্রতিক্রিয়া কিন্ডা এর সাথে ডিল করে।
জে পোল্ফার

2

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


2

দেখে মনে হচ্ছে অনেক শিক্ষার্থীর ইন্ডিরিয়ারেশন ধারণাটি নিয়ে সমস্যা রয়েছে, বিশেষত যখন তারা প্রথমবারের মতো ইন্ডিরিয়ারেশন ধারণার সাথে মিলিত হয়। আমার যখন আমি ছাত্র ছিলাম তখন থেকে আমার মনে আছে যে আমার কোর্সের +100 শিক্ষার্থীর মধ্যে কেবল কয়েক মুঠো লোকেরা সত্যই বুঝতে পেরেছিল।

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


2

আমি সম্প্রতি সবেমাত্র পয়েন্টার ক্লিকের মুহূর্তটি পেয়েছি, এবং আমি অবাক হয়েছি যে আমি এটি বিভ্রান্তির সাথে খুঁজে পেয়েছি। এটি আরও বেশি ছিল যে প্রত্যেকে এটি সম্পর্কে এত বেশি কথা বলেছিল যে আমি ধরে নিয়েছিলাম কিছু গা dark় যাদু চলছে।

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

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

অন্তত আমি এই মুহূর্তে এটি দেখতে উপায়!


চিন্তার পরে, আপনি ইমেজ / অডিও / ভিডিও ধারণের জন্য একটি নির্দিষ্ট পরিমাণের মেমরির সংজ্ঞা দিতে পারেন, মেমোরি সীমিত ডিভাইসে বলুন তবে তারপরে আপনাকে মেমরি সলিউশনটিতে কিছুটা স্ট্রিমিং বা আউট আউট করতে হবে।
ক্রিস ব্যারি

1

এখানে সি ++ নবাগত হিসাবে কথা বলা:

পয়েন্টার সিস্টেমটি হজম করতে আমার কিছুটা সময় নিয়েছিল অগত্যা ধারণাটির কারণে নয় তবে জাভা সম্পর্কিত সি ++ বাক্য গঠনগুলির কারণে। আমি বিভ্রান্তিকর কয়েকটি জিনিস পেয়েছি:

(1) পরিবর্তনীয় ঘোষণা:

A a(1);

বনাম

A a = A(1);

বনাম

A* a = new A(1); 

এবং স্পষ্টতই

A a(); 

একটি ফাংশন ঘোষণা এবং পরিবর্তনীয় ঘোষণা নয়। অন্যান্য ভাষায়, ভেরিয়েবল ঘোষণার মূলত একটি উপায়।

(২) অ্যাম্পারস্যান্ডটি কয়েকটি ভিন্ন উপায়ে ব্যবহৃত হয়। যদি হয়

int* i = &a;

তারপরে & ক একটি মেমরি ঠিকানা।

OTOH, যদি হয়

void f(int &a) {}

তারপরে & এ হল একটি পাস-বাই-রেফারেন্স প্যারামিটার।

যদিও এটি তুচ্ছ মনে হলেও এটি নতুন ব্যবহারকারীদের জন্য বিভ্রান্তিকর হতে পারে - আমি জাভা এবং জাভার একটি ভাষা থেকে অপারেটরদের আরও অভিন্ন ব্যবহার করে এসেছি came

(3) অ্যারে-পয়েন্টার সম্পর্ক

বোঝার জন্য বাজে হতাশার মধ্যে একটি জিনিস এটি একটি পয়েন্টার

int* i

কোন int এর পয়েন্টার হতে পারে

int *i = &n; // 

অথবা

কোন int এর অ্যারে হতে পারে

int* i = new int[5];

এবং তারপরে কেবল জিনিসগুলিকে আরও মেসওয়্যার করতে, পয়েন্টার এবং অ্যারে সব ক্ষেত্রেই বিনিময়যোগ্য হয় না এবং পয়েন্টারগুলি অ্যারে প্যারামিটার হিসাবে পাস করা যায় না।

এটি সি / সি ++ এবং এর পয়েন্টারগুলির সাথে আমার যে কয়েকটি বেসিক হতাশাগুলি ছিল তার সংক্ষিপ্তসার ঘটায় যা আইএমও, সি / সি +++ এর সাথে এই সমস্ত ভাষা-নির্দিষ্ট quirks রয়েছে তা দ্বারা ব্যাপকভাবে মিশ্রিত হয়।


ভেরিয়েবল ঘোষণার ক্ষেত্রে সি ++ ২০১১ সালে কিছুটা উন্নতি করেছে।
gnasher729

0

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


0

পয়েন্টারস .. হাহ .. আমার মাথার সমস্ত পয়েন্টার হ'ল এটি একটি মেমরি ঠিকানা দেয় যেখানে এর রেফারেন্স যাই হোক না কেন তার আসল মূল্যবোধগুলি .. সুতরাং এটি সম্পর্কে কোনও জাদু নেই .. আপনি যদি কিছু সমাবেশ শিখেন তবে আপনার এত সমস্যা শেখার সমস্যা হবে না পয়েন্টার কীভাবে কাজ করে .. ছেলেরা আসুন ... এমনকি জাভাতেও সমস্ত কিছু রেফারেন্স ..


0

প্রধান সমস্যা লোকেরা কেন তাদের পয়েন্টার প্রয়োজন তা বুঝতে পারে না। কারণ তারা স্ট্যাক এবং গাদা সম্পর্কে পরিষ্কার নয়। ক্ষুদ্র মেমরি মোডের সাথে x86 এর জন্য 16 বিট অ্যাসেমব্লার থেকে শুরু করা ভাল। এটি অনেক লোককে স্ট্যাক, গাদা এবং "ঠিকানা" সম্পর্কে ধারণা পেতে সহায়তা করে। এবং বাইট :) আধুনিক প্রোগ্রামাররা মাঝে মাঝে আপনাকে 32 বিট স্পেসের ঠিকানার জন্য কতগুলি বাইট প্রয়োজন তা বলতে পারে না। তারা কীভাবে পয়েন্টারগুলির ধারণা পেতে পারে?

দ্বিতীয় মুহূর্তটি স্বরলিপি: আপনি পয়েন্টারটিকে * হিসাবে ঘোষণা করেন, আপনি ঠিকানা হিসাবে পান এবং কিছু লোকের পক্ষে এটি বোঝা সহজ নয়।

এবং সর্বশেষ জিনিসটি আমি দেখেছি স্টোরেজ সমস্যা: তারা গাদা এবং স্ট্যাক বুঝতে পারে তবে "স্থিতিশীল" ধারণা পেতে পারে না।

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