এটি সাধারণ প্রশ্ন হতে পারে তবে কেন কনস্ট চরকে * নির্দেশ করতে মেমরির ঠিকানা প্রয়োজন হয় না?
উদাহরণ:
const char* a = "Anthony";
এবং না:
const char *a = // Address to const char
অন্যান্য ধরণের মত কি?
এটি সাধারণ প্রশ্ন হতে পারে তবে কেন কনস্ট চরকে * নির্দেশ করতে মেমরির ঠিকানা প্রয়োজন হয় না?
উদাহরণ:
const char* a = "Anthony";
এবং না:
const char *a = // Address to const char
অন্যান্য ধরণের মত কি?
উত্তর:
আপনি এই ঘোষণা কল্পনা করতে পারেন
const char* a = "Anthony";
নিম্নলিখিত উপায়
const char string_literal[] = "Anthony";
const char *a = string_literal;
এটিই সংকলক স্থিতিশীল স্টোরেজ সময়কাল সহ অক্ষরের একটি অ্যারে তৈরি করে যা স্ট্রিং "Anthony"
এবং অ্যারের প্রথম অক্ষরের ঠিকানা (তাদের প্রথম অক্ষরের সাথে পয়েন্টারগুলিতে অ্যারে ডিজাইনারদের অন্তর্নিহিত রূপান্তরের কারণে) পয়েন্টারে নির্ধারিত হয় a
।
এখানে একটি বিক্ষোভমূলক প্রোগ্রাম যা দেখায় যে স্ট্রিং লিটারালগুলি চরিত্রের অ্যারে হয়।
#include <iostream>
#include <type_traits>
decltype( auto ) f()
{
return ( "Anthony" );
}
template <size_t N>
void g( const char ( &s )[N] )
{
std::cout << s << '\n';
}
int main()
{
decltype( auto ) r = f();
std::cout << "The size of the referenced array is "
<< std::extent<std::remove_reference<decltype( r )>::type>::value
<< '\n';
g( r );
return 0;
}
প্রোগ্রাম আউটপুট হয়
The size of the referenced array is 8
Anthony
স্ট্রিংয়ের আক্ষরিক আকার (স্ট্রিং আক্ষরিক সংরক্ষণ করে এমন অ্যারের) এর সমান হয় 8
কারণ স্ট্রিংটিতে সমাপনী শূন্য বর্ণও অন্তর্ভুক্ত থাকে ' \0'
।
বিক্ষোভমূলক কর্মসূচিতে প্রকাশ
std::extent<std::remove_reference<decltype( r )>::type>::value
কেবল প্রকাশের জন্য প্রতিস্থাপন করা যেতে পারে
sizeof( r )
কেন কনস্টের চরকে নির্দেশ করতে মেমরির ঠিকানা প্রয়োজন হয় না? *
এটা করে.
একটি সি স্ট্রিং আক্ষরিক মত
"Anthony"
এর 1 ম চরিত্রের ঠিকানায় ক্ষয় হয় । লাইক, বিটিডাব্লু; সি কোন অ্যারে করে।
const char[8]
(সি ++ এ, সি-তে থাকতে পারে char [8]
, নিশ্চিত নয়) এবং এটি অন্তর্নির্মিত অ্যারেগুলির মতো, যখন এটির মান হিসাবে এটি তার প্রথম উপাদানটির দিকে নির্দেশ করে।
char [8]
সি তে: c-faq.com/ansi/strlitnotconst.html
এটির জন্য একটি মেমরি ঠিকানা প্রয়োজন নেই এবং এটির একটি মেমরি ঠিকানা রয়েছে। আপনার উদাহরণে এটি স্ট্রিংয়ের সূচনার স্মৃতি ঠিকানা। সংকলনের সময় আরম্ভ করা অন্য যে কোনও অ্যারে ভেরিয়েবলের সাথে এটি একই রকম, উদাহরণস্বরূপ "ইনট অ্যারে [] = {0, 1, 2, 3};"।;
যদি আপনি এক্সিকিউটেবলটি দেখতে বাইনারি সম্পাদক ব্যবহার করেন তবে আপনি সেখানে "অ্যান্টনি" স্ট্রিংটি দেখতে পাবেন। যদি আপনি "প্রিন্টফ" ("এ% p \ n", (শূন্য *) ক) রেখাটি রেখে দেন; " আপনার প্রোগ্রামে, তারপরে এটি সংকলন ও চালনা করুন, আপনি ঠিকানাটি দেখতে পাবেন।
"কেন
const char*
একটি মেমরি ঠিকানার পয়েন্টার প্রয়োজন হয় না?"
আসলে, এটি নির্দেশ করার জন্য এটির একটি মেমরি ঠিকানা প্রয়োজন নেই ।
const char* a
মানে a
হল একটি স্ট্রিং আক্ষরিক বা অক্ষর ধ্রুবকের পয়েন্টার।
একটি পয়েন্টারটির সর্বদা নির্দেশ করার জন্য একটি ঠিকানা প্রয়োজন কারণ স্মৃতিতে একটি নির্দিষ্ট অবজেক্টের দিকে নির্দেশ করা পয়েন্টারের প্রকৃতি। সুতরাং, a
এবং অন্য কোন পয়েন্টার const char
এছাড়াও।
একটি স্ট্রিং আক্ষরিক যেমন "Hi My Name is Alfred!"
একটি অ্যাসাইনমেন্ট দ্বারা:
const char* a;
a = "Hi My Name is Alfred!";
আক্ষরিক স্ট্রিংয়ের প্রথম উপাদানটির ঠিকানার দিকে নির্দেশ করে।
পরিবর্তে মানে, a
স্ট্রিং আক্ষরিকের প্রথম উপাদানটির ঠিকানা দ্বারা নির্ধারিত হয় "Hi My Name is Alfred!"
যা মৃত্যুর পরিবেশের উপর নির্ভর করে স্মৃতিতে যে কোনও জায়গায় সংরক্ষণ করা যেতে পারে।
এটি কোনও প্রোগ্রামারের শক্তিতে নেই যেখানে স্ট্রিং আক্ষরিক ঠিক সংরক্ষণ করা হয়। আপনার অ্যাসাইনমেন্টটি কেবলমাত্র উপযুক্ত পয়েন্টারটিকে যথাযথভাবে অর্পণ এবং পরিচালনা করার জন্য।