এর মধ্যে পার্থক্য কী
char* name
যা একটি ধ্রুব স্ট্রিং আক্ষরিক নির্দেশ করে, এবং
const char* name
এর মধ্যে পার্থক্য কী
char* name
যা একটি ধ্রুব স্ট্রিং আক্ষরিক নির্দেশ করে, এবং
const char* name
উত্তর:
char*
একটি হল চপল একটি পয়েন্টার চপল চরিত্র / পংক্তি।
const char*
একটি হল চপল একটি পয়েন্টার অপরিবর্তনীয় চরিত্র / পংক্তি। আপনি এই পয়েন্টারটি যে অবস্থানটির (গুলি) নির্দেশ করেছেন সেগুলির সামগ্রী পরিবর্তন করতে পারবেন না। এছাড়াও, সংকলকগণ যখন আপনি এটি করার চেষ্টা করছেন ত্রুটি বার্তা দিতে হবে। একই কারণে, থেকে রুপান্তরের const char *
জন্য char*
অসমর্থিত হয়েছে।
char* const
একটি অপরিবর্তনীয় পয়েন্টার (এটি অন্য কোনও জায়গায় নির্দেশ করতে পারে না) তবে অবস্থানের বিষয়বস্তু যেখানে এটি নির্দেশ করে তা পরিবর্তনীয় ।
const char* const
অপরিবর্তনীয় চরিত্র / স্ট্রিংয়ের এক অপরিবর্তনীয় পয়েন্টার ।
char const *
char *
চলমান অবস্থায় বিভাগকে ত্রুটি দেবে না ?
const
যদি আমি কম্পাইলারটি ত্রুটি দিতে চাই তা ভুল করে ডেটা ভুলে গিয়ে পরিবর্তন করি, তাই না?
char *name
আপনি যে name
বিন্দুতে চরটি পরিবর্তন করতে পারেন এবং এটি যে বিন্দুতে ইঙ্গিত করেছে তাও পরিবর্তন করতে পারবেন ।
const char* name
আপনি চরকে কোন name
পয়েন্টে পরিবর্তন করতে পারেন, তবে আপনি যে চরকে এটি নির্দেশ করেছেন তা পরিবর্তন করতে পারবেন না।
সংশোধন: আপনি পয়েন্টার পরিবর্তন করতে পারেন কিন্তু না গৃহস্থালির কাজ যা name
পয়েন্ট ( https://msdn.microsoft.com/en-us/library/vstudio/whkd4k6a(v=vs.100).aspx দেখুন "উদাহরণ" )। এই ক্ষেত্রে, const
নির্দিষ্টকারকটি প্রয়োগ হয় char
, নক্ষত্রের উপরে নয়।
এমএসডিএন পৃষ্ঠা এবং http://en.cppreferences.com/w/cpp/language/declations অনুসারে , এর const
আগে *
ডেসেল-স্পেসিফায়ার ক্রমের অংশ , যখন const
পরে *
ঘোষণাকারীর অংশ।
একটি ঘোষণাপত্রের স্পেসিফায়ার ক্রমটি একাধিক ডিক্লেয়ারের দ্বারা অনুসরণ করা যেতে পারে, এজন্যই হিসাবে এবং হিসাবে const char * c1, c2
ঘোষণা c1
করা হয় ।const char *
c2
const char
সম্পাদনা করুন:
মন্তব্যগুলি থেকে, আপনার প্রশ্নটি দুটি ঘোষণার মধ্যে পার্থক্য সম্পর্কে জিজ্ঞাসা করছে বলে মনে হচ্ছে যখন পয়েন্টারটি একটি স্ট্রিং আক্ষরিককে নির্দেশ করে।
যে ক্ষেত্রে, আপনি করা উচিত নয় যা গৃহস্থালির কাজ সংশোধন name
, পয়েন্ট যেমন হতে পারে অনির্ধারিত আচরণ । স্ট্রিং লিটারালগুলি কেবল পঠনযোগ্য মেমরি অঞ্চলে বরাদ্দ করা যেতে পারে (বাস্তবায়িত সংজ্ঞায়িত) এবং কোনও ব্যবহারকারী প্রোগ্রাম কোনওভাবেই এটি পরিবর্তন করতে হবে না। এটি করার যে কোনও প্রয়াসই ফলাফলহীন আচরণের ফলাফল in
সুতরাং ক্ষেত্রে একমাত্র পার্থক্য (স্ট্রিং আক্ষরিক সাথে ব্যবহারের) দ্বিতীয় ঘোষণাটি আপনাকে সামান্য সুবিধা দেয়। আপনি দ্বিতীয় ক্ষেত্রে স্ট্রিংকে আক্ষরিক সংশোধন করার চেষ্টা করার ক্ষেত্রে কমপাইলাররা সাধারণত আপনাকে একটি সতর্কতা দেয়।
#include <string.h>
int main()
{
char *str1 = "string Literal";
const char *str2 = "string Literal";
char source[] = "Sample string";
strcpy(str1,source); //No warning or error, just Undefined Behavior
strcpy(str2,source); //Compiler issues a warning
return 0;
}
আউটপুট:
সিসি 1: সতর্কতাগুলি ত্রুটিগুলি
প্রগ হিসাবে বিবেচিত হবে :
ফাংশনটিতে 'প্রধান': প্রগ্যাক: 9: ত্রুটি: ' স্ট্রাইকপি'-র 1 টি আর্গুমেন্ট পয়েন্টার টার্গেট টাইপ থেকে বাছাইয়ের যোগ্যতা ছাড়বে
লক্ষ্য করুন যে সংকলকটি দ্বিতীয় ক্ষেত্রে সাবধান করে তবে প্রথমটির জন্য নয়।
name
পারেন case.It পয়েন্ট UB হতে পারে।
char mystring[101] = "My sample string";
const char * constcharp = mystring; // (1)
char const * charconstp = mystring; // (2) the same as (1)
char * const charpconst = mystring; // (3)
constcharp++; // ok
charconstp++; // ok
charpconst++; // compile error
constcharp[3] = '\0'; // compile error
charconstp[3] = '\0'; // compile error
charpconst[3] = '\0'; // ok
// String literals
char * lcharp = "My string literal";
const char * lconstcharp = "My string literal";
lcharp[0] = 'X'; // Segmentation fault (crash) during run-time
lconstcharp[0] = 'X'; // compile error
// *not* a string literal
const char astr[101] = "My mutable string";
astr[0] = 'X'; // compile error
((char*)astr)[0] = 'X'; // ok
char *
মানটি পরিবর্তনের ফলে বিভাগকে ত্রুটি দেওয়া যায় যেহেতু আমরা একটি স্ট্রিং আক্ষরিক (যা কেবলমাত্র পঠনযোগ্য স্মৃতিতে উপস্থিত রয়েছে) সংশোধন করার চেষ্টা করছি
তন্ন তন্ন যদি আপনি স্ট্রিং আক্ষরিক পয়েন্টার হিসেবে ঘোষণা করা আছে কিনা নির্বিশেষে একটি স্ট্রিং আক্ষরিক পরিবর্তন করতে পারেন, char *
বা const char *
।
তবে পার্থক্যটি হ'ল যদি পয়েন্টারটি হয় const char *
তবে সংকলককে অবশ্যই একটি ডায়াগনস্টিক দিতে হবে যদি আপনি পয়েন্ট-টু মানটি সংশোধন করার চেষ্টা করেন তবে পয়েন্টারটি যদি হয় char *
তবে তা হয় না।
extern ... name
এবং অন্য একটি ফাইল থাকতে পারে এবং থাকতে পারে *name = 'X';
। 'যথাযথ অপারেটিং সিস্টেম'-এ, এটি ব্যর্থ হতে পারে তবে এম্বেড হওয়া সিস্টেমে আমি প্ল্যাটফর্ম / সংকলকটি নির্দিষ্ট কিছু আশা করব।
মামলা 1:
char *str = "Hello";
str[0] = 'M' //Warning may be issued by compiler, and will cause segmentation fault upon running the programme
উপরের সেটগুলি অক্ষরে অক্ষরে অক্ষরে অক্ষরে অক্ষরে অক্ষরে অক্ষরে অক্ষরে অক্ষরে অক্ষরে অক্ষরে অক্ষরে অক্ষরে অক্ষরে অক্ষরে অক্ষরে অক্ষরে অক্ষরে অক্ষরে অক্ষরে অক্ষরে অক্ষরে অক্ষরে অক্ষরে অক্ষরে অক্ষরে অক্ষরে অক্ষরে অক্ষরে অক্ষরে অক্ষরে অক্ষরে চিহ্নিত করা হয়েছে যা এই স্ট্রিং আক্ষরিক কোনও পরিবর্তন অবৈধ এবং এর ফলে বিভাজন ত্রুটি ঘটবে।
CASE 2:
const char *str = "Hello";
str[0] = 'M' //Compile time error
মামলা 3:
char str[] = "Hello";
str[0] = 'M'; // legal and change the str = "Mello".
আপনি চাইলে প্রথমে আপনি আসলে পরিবর্তন করতে পারবেন, দ্বিতীয়টি আপনি পারবেন না। const
নির্ভুলতা সম্পর্কে পড়ুন (পার্থক্য সম্পর্কে কিছু চমৎকার গাইড আছে)। এমন একটি জায়গা রয়েছে char const * name
যেখানে আপনি এটিকে পুনরায় দমন করতে পারবেন না।
প্রশ্ন এর মধ্যে পার্থক্য কি
char *name
যা একটি ধ্রুব স্ট্রিং আক্ষরিক নির্দেশ করে, এবং
const char *cname
আই
char *name = "foo";
এবং
const char *cname = "foo";
2 এর মধ্যে খুব বেশি পার্থক্য নেই এবং উভয়ই সঠিক হিসাবে দেখা যেতে পারে। সি কোডের দীর্ঘ উত্তরাধিকারের কারণে, স্ট্রিং লিটারালগুলির একটি ধরণের ছিল char[]
, না const char[]
, এবং প্রচুর পুরানো কোড রয়েছে যা একইভাবে char *
পরিবর্তে স্বীকার করে const char *
, এমনকি তারা যুক্তি পরিবর্তন না করে।
সাধারণভাবে 2 এর প্রধান পার্থক্য হ'ল *cname
বা cname[n]
প্রকারের মূল্যকে মূল্যায়ন করবে const char
, যেখানে *name
বা name[n]
প্রকারের মূল্যকে মূল্যায়ন করবে char
, যা পরিবর্তনযোগ্য লভ্যগুলি । যদি একটি কার্যনির্বাহী সংকলক প্রয়োজন হয় যদি ডায়াগনস্টিকস বার্তা তৈরি করতে হয় যদি অ্যাসাইনমেন্টের লক্ষ্যমাত্রা পরিবর্তনযোগ্য লভ্যালু না হয় ; এটিকে বিভিন্ন ধরণের অ্যাসাইনমেন্ট সম্পর্কে কোনও সতর্কতা তৈরি করার দরকার নেই char
:
name[0] = 'x'; // no diagnostics *needed*
cname[0] = 'x'; // a conforming compiler *must* produce a diagnostics message
কম্পাইলার হয় না প্রয়োজন উভয় ক্ষেত্রে সংকলন বন্ধ করে দেবেন | এটি যথেষ্ট যে এটি কার্যভারের জন্য একটি সতর্কতা তৈরি করে cname[0]
। ফলস্বরূপ প্রোগ্রামটি একটি সঠিক প্রোগ্রাম নয়। কনস্ট্রাক্ট আচরণ করা হয় অনির্দিষ্ট । এটি ক্রাশ হতে পারে, বা আরও খারাপ এটি ক্রাশ নাও হতে পারে এবং স্মৃতিতে স্ট্রিংকে আক্ষরিক পরিবর্তিত করতে পারে।
আসলে, char* name
একটি ধ্রুবকের পয়েন্টার নয়, তবে ভেরিয়েবলের পয়েন্টার। আপনি এই অন্যান্য প্রশ্ন সম্পর্কে কথা বলতে পারে।