কেন কনট চর * কোনও মেমরি ঠিকানার পয়েন্টারের প্রয়োজন হয় না?


18

এটি সাধারণ প্রশ্ন হতে পারে তবে কেন কনস্ট চরকে * নির্দেশ করতে মেমরির ঠিকানা প্রয়োজন হয় না?

উদাহরণ:

const char* a = "Anthony";

এবং না:

const char *a = // Address to const char

অন্যান্য ধরণের মত কি?


8
স্ট্রিং আক্ষরিকের মেমরি ঠিকানা নেই বলে আপনি কী ভাবছেন?
ব্যবহারকারী 207421

2
একমত। আমি কারও কাছে এই প্রশ্ন জিজ্ঞাসা করে এমনকী মান বিভাগগুলির উপস্থিতি জানতে চাইব না , কেবল তাদের নাম আছে তা ছেড়ে দিন।
ব্যবহারকারী 4581301

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

উত্তর:


26

আপনি এই ঘোষণা কল্পনা করতে পারেন

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 )

5

কেন কনস্টের চরকে নির্দেশ করতে মেমরির ঠিকানা প্রয়োজন হয় না? *

এটা করে.

একটি সি স্ট্রিং আক্ষরিক মত

"Anthony"

এর 1 চরিত্রের ঠিকানায় ক্ষয় হয় । লাইক, বিটিডাব্লু; সি কোন অ্যারে করে।


আরও সুনির্দিষ্টভাবে বলা যায়, এটি টাইপ const char[8](সি ++ এ, সি-তে থাকতে পারে char [8], নিশ্চিত নয়) এবং এটি অন্তর্নির্মিত অ্যারেগুলির মতো, যখন এটির মান হিসাবে এটি তার প্রথম উপাদানটির দিকে নির্দেশ করে।
নিকোস সি

@ নিকোসসি .: এই প্রসঙ্গে সবচেয়ে গুরুত্বপূর্ণ যাদু ক্রিয়াটি আমাকে স্মরণ করিয়ে দেওয়ার জন্য ধন্যবাদ! ;)
এক্কে

উত্তরের জন্য ধন্যবাদ! আমি ভাবছিলাম যে এটি কোথা থেকে স্মৃতি পেয়ে যায়।
ওয়েডেলিক্স

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

2
@NikosC। char [8]সি তে: c-faq.com/ansi/strlitnotconst.html
ডেভিড

1

এটির জন্য একটি মেমরি ঠিকানা প্রয়োজন নেই এবং এটির একটি মেমরি ঠিকানা রয়েছে। আপনার উদাহরণে এটি স্ট্রিংয়ের সূচনার স্মৃতি ঠিকানা। সংকলনের সময় আরম্ভ করা অন্য যে কোনও অ্যারে ভেরিয়েবলের সাথে এটি একই রকম, উদাহরণস্বরূপ "ইনট অ্যারে [] = {0, 1, 2, 3};"।;

যদি আপনি এক্সিকিউটেবলটি দেখতে বাইনারি সম্পাদক ব্যবহার করেন তবে আপনি সেখানে "অ্যান্টনি" স্ট্রিংটি দেখতে পাবেন। যদি আপনি "প্রিন্টফ" ("এ% p \ n", (শূন্য *) ক) রেখাটি রেখে দেন; " আপনার প্রোগ্রামে, তারপরে এটি সংকলন ও চালনা করুন, আপনি ঠিকানাটি দেখতে পাবেন।


0

"কেন 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!"যা মৃত্যুর পরিবেশের উপর নির্ভর করে স্মৃতিতে যে কোনও জায়গায় সংরক্ষণ করা যেতে পারে।

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

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