অন্য উত্তরগুলি সঠিক, তবে তাদের মধ্যে কেউই এই ধারণার উপর জোর দেয়নি যে তিনজনের পক্ষে একই মানের ধারণ করা সম্ভব এবং তাই তারা কোনও উপায়ে অসম্পূর্ণ।
অন্যান্য উত্তরগুলি থেকে এটি বোঝা যায় না তার কারণ হ'ল সমস্ত চিত্রগুলি বেশিরভাগ পরিস্থিতিতে সহায়ক এবং স্পষ্টভাবে যুক্তিসঙ্গত হলেও পয়েন্টারটি x
নিজের দিকে নির্দেশ করে এমন পরিস্থিতিটি coverাকতে ব্যর্থ হয় ।
এটি নির্মাণ করা বেশ সহজ, তবে স্পষ্টভাবে বুঝতে কিছুটা শক্ত। নীচের প্রোগ্রামে আমরা দেখতে পাব কীভাবে আমরা তিনটি মানকে অভিন্ন হতে পারি can
দ্রষ্টব্য: এই প্রোগ্রামের আচরণটি অপরিজ্ঞাত, তবে আমি এখানে এটি শুদ্ধভাবে পোস্ট করছি যাতে কিছু এমন একটি আকর্ষণীয় প্রদর্শন যা পয়েন্টারগুলি করতে পারে তবে তা করা উচিত নয় ।
#include <stdio.h>
int main () {
int *(*x)[5];
x = (int *(*)[5]) &x;
printf("%p\n", x[0]);
printf("%p\n", x[0][0]);
printf("%p\n", x[0][0][0]);
}
এটি C89 এবং C99 উভয় ক্ষেত্রেই সতর্কতা ছাড়াই সংকলন করে এবং আউটপুটটি নিম্নলিখিত:
$ ./ptrs
0xbfd9198c
0xbfd9198c
0xbfd9198c
আকর্ষণীয়ভাবে যথেষ্ট, তিনটি মানই অভিন্ন। তবে এটি আশ্চর্য হওয়া উচিত নয়! প্রথমে প্রোগ্রামটি ভেঙে দেওয়া যাক।
আমরা x
5 টি উপাদানের একটি অ্যারে যেখানে পয়েন্টার হিসাবে প্রতিটি উপাদান টাইপ পয়েন্টার টাইপ হয়। এই ঘোষণাপত্রটি রানটাইম স্ট্যাকের 4 বাট বরাদ্দ করে (বা আরও আপনার প্রয়োগের উপর নির্ভর করে; আমার মেশিন পয়েন্টারগুলিতে 4 বাইট রয়েছে), তাই x
প্রকৃত মেমরির অবস্থান উল্লেখ করা হচ্ছে। ভাষার সি পরিবারে বিষয়বস্তুগুলি x
কেবল আবর্জনা, অবস্থানের আগের ব্যবহার থেকে কিছু বাদ পড়েছে, তাই x
নিজেই কোথাও নির্দেশ করে না - অবশ্যই বরাদ্দ স্থানকে নয়।
সুতরাং, স্বাভাবিকভাবেই, আমরা চলকটির ঠিকানা নিতে পারি x
এবং এটি কোথাও রেখে দিতে পারি, তাই আমরা যা করি ঠিক তেমনই। তবে আমরা এগিয়ে যাব এবং এটিকে x এর মধ্যে রেখে দেব। যেহেতু &x
ভিন্ন ধরণের রয়েছে x
তাই আমাদের একটি কাস্ট করা দরকার যাতে আমাদের সতর্কতা না পাওয়া যায়।
মেমরির মডেলটি এরকম কিছু দেখবে:
0xbfd9198c
+------------+
| 0xbfd9198c |
+------------+
সুতরাং ঠিকানায় মেমরির 4-বাইট ব্লকে 0xbfd9198c
হেক্সাডেসিমাল মানের সাথে সম্পর্কিত বিট প্যাটার্ন রয়েছে 0xbfd9198c
। যথেষ্ট সহজ।
এর পরে, আমরা তিনটি মান মুদ্রণ করব। অন্যান্য উত্তরগুলি প্রতিটি অভিব্যক্তিকে কী বোঝায় তা ব্যাখ্যা করে, সুতরাং সম্পর্কটি এখন পরিষ্কার হওয়া উচিত।
আমরা দেখতে পাচ্ছি যে মানগুলি একই, তবে কেবলমাত্র খুব নিম্ন স্তরের অর্থে ... তাদের বিট নিদর্শনগুলি অভিন্ন, তবে প্রতিটি অভিব্যক্তির সাথে সম্পর্কিত টাইপের ডেটা বলতে বোঝায় যে তাদের ব্যাখ্যা করা মানগুলি আলাদা। উদাহরণস্বরূপ, আমরা যদি x[0][0][0]
ফর্ম্যাট স্ট্রিংটি ব্যবহার করে মুদ্রণ করি তবে আমরা %d
একটি বিশাল নেতিবাচক সংখ্যা পাই, সুতরাং "মানগুলি", বাস্তবে ভিন্ন, তবে বিট প্যাটার্নটি একই।
এটি আসলেই খুব সহজ ... ডায়াগ্রামগুলিতে তীরগুলি কেবল একই মেমরি ঠিকানার দিকে আলাদা করে নির্দেশ করে ones যাইহোক, আমরা অপরিবর্তিত আচরণের কারণে একটি প্রত্যাশিত ফলাফলকে জোর করতে সক্ষম হয়েছি, এটি কেবল — অপরিজ্ঞাত। এটি প্রোডাকশন কোড নয় বরং সম্পূর্ণতার স্বার্থে কেবল একটি প্রদর্শনী।
যুক্তিসঙ্গত পরিস্থিতিতে আপনি malloc
5 টি ইনট পয়েন্টারগুলির অ্যারে তৈরি করতে এবং আবার সেই অ্যারেটিতে নির্দেশিত ইনসটি তৈরি করতে ব্যবহার করবেন। malloc
সর্বদা একটি অনন্য ঠিকানা ফেরত দেয় (যদি না আপনি স্মৃতি থেকে দূরে থাকেন, তবে এটি যদি নুল বা 0 ফেরত দেয়), তাই আপনাকে কখনই এই জাতীয় স্ব-রেফারেন্সিয়াল পয়েন্টার সম্পর্কে চিন্তা করতে হবে না।
আশা করি এটি আপনি সম্পূর্ণ উত্তরটি সন্ধান করছেন। আপনি আশা করতে পারে না x[0]
, x[0][0]
আর x[0][0][0]
সমান হতে, কিন্তু তারা যদি বাধ্য হতে পারে। যদি আপনার মাথার উপরে কিছু চলে যায় তবে আমাকে জানিয়ে দিন যাতে আমি স্পষ্ট করে বলতে পারি!
x[0]
,x[0][0]
এবংx[0][0][0]
বিভিন্ন ধরণের আছে। তাদের তুলনা করা যায় না। আপনি কি বলতে চাইছেন!=
?