এর মধ্যে পার্থক্য কী:
char * const
এবং
const char *
এর মধ্যে পার্থক্য কী:
char * const
এবং
const char *
উত্তর:
পার্থক্যটি হ'ল এটি const char *
একটিটির পয়েন্টার const char
, অন্যদিকে char * const
ধ্রুবক পয়েন্টারchar
।
প্রথমটি, নির্দেশিত মানটি পরিবর্তন করা যায় না তবে পয়েন্টারটি হতে পারে। দ্বিতীয়টি, নির্দেশিত মানটি বদলে যেতে পারে তবে পয়েন্টারটি (কোনও রেফারেন্সের মতো) হতে পারে না।
এখানে আরো একটা
const char * const
যা একটি ধ্রুবক চরের স্থির নির্দেশক (সুতরাং এটি সম্পর্কে কিছুই পরিবর্তন করা যায় না)।
বিঃদ্রঃ:
নিম্নলিখিত দুটি রূপ সমতুল্য:
const char *
এবং
char const *
এর সঠিক কারণটি সি ++ স্ট্যান্ডার্ডে বর্ণিত হয়েছে তবে বিভ্রান্তিটি এড়ানো এবং এড়ানো গুরুত্বপূর্ণ। আমি বেশ কয়েকটি কোডিং মান জানি যা পছন্দ করে:
char const
উপর
const char
(সহ বা পয়েন্টার ছাড়া) যাতে বসানো const
উপাদান একটি পয়েন্টার সঙ্গে হিসাবে একই const
।
const int *foo,*bar;
উভয় ঘোষণা করা হবে foo
এবং bar
হতে int const *
কিন্তু int const *foo, *bar
ঘোষণা করা হবে foo
একটি হতে int const *
এবং bar
হতে int *
। আমি মনে করি typedef int * intptr; const intptr foo,bar;
উভয় ভেরিয়েবলকে ঘোষিত করবে int * const
; টাইপেফ ছাড়াই এই ধরণের দুটি ভেরিয়েবল তৈরি করতে সম্মিলিত ঘোষণাপত্র ব্যবহার করার কোনও উপায় আমি জানি না।
I believe const int *foo,*bar; would declare both foo and bar to be int const *
: হ্যাঁ but int const *foo, *bar would declare foo to be a int const * and bar to be int *
: না! এটি আগের মামলার মতোই হবে। (আদর্শ ফোনে / আরএসএ বি 7 এন দেখুন যেখানে আপনি ফু এবং বার উভয়ের জন্য একই ত্রুটি পান)। I think typedef int * intptr; const intptr foo,bar; would declare both variables to be int * const
: হ্যাঁ. I don't know any way to use a combined declaration to create two variables of that type without a typedef
: আচ্ছা int *const foo, *const bar;
,। সি
int const *foo, *volatile bar
না bar
? এটি উভয় const
এবং volatile
? I Miss প্যাসকেলের ঘোষিত-পরিবর্তনশীল নামের পরিষ্কার বিচ্ছেদ এবং তাদের প্রকার (পূর্ণসংখ্যার পয়েন্টার একটি অ্যারের একটি পয়েন্টার হবে var foo: ^Array[3..4] of ^Integer
।। `যে সি কিছু মজার নেস্টেড আলাদা জিনিস হতে চাই, আমি মনে করি
int const *foo, *volatile bar
" তে টাইপ অংশটি int const
(এর আগে থামবে *
) এবং ঘোষকরা হ'ল ( *foo
এক্সপ্রেশনটি *foo
ইঙ্গিত করবে int const
) এবং *volatile bar
; পড়া ডান-থেকে-বাম (জন্য নিয়ম CV-কোয়ালিফায়ার ), foo
একটি একটি পয়েন্টার const int- এ এবং bar
একটি হয় উদ্বায়ী একটি পয়েন্টার const int- এ (পয়েন্টার নিজেই উদ্বায়ী হয়, সরু int- এ const [যেমন অ্যাক্সেস] হয় না)।
[3..4]
সিনট্যাক্স, তাই 10 উপাদানের একটি অ্যারের নিয়ে যাক): int *(*foo)[10];
। এটা তার (ভবিষ্যত) একটি অভিব্যক্তি হিসাবে ব্যবহারের প্রতিফলিত: *(*foo)[i]
(সঙ্গে i
সীমার মধ্যে একটি পূর্ণসংখ্যা [0, 10)
অর্থাত [0, 9]
প্রথম ডি-রেফারেন্স হবে) foo
অ্যারে এ পেতে, তারপর সূচিতে উপাদান অ্যাক্সেস i
(কারণ পোস্টসাফিক্স []
বেঁধে উপসর্গ চেয়ে কঠিন *
), তারপর এই উপাদান ডি-রেফারেন্স, অবশেষে ফলনশীল একটি int
(দেখুন ideone.com/jgjIjR )। তবে typedef
এটিকে আরও সহজ করে তোলে (আদর্শ আইডোন.ও.ও.ডাব্লু 7 ডি দেখুন )।
বিভ্রান্তি এড়াতে, সর্বদা কনস্টের যোগ্যতা যুক্ত করুন app
int * mutable_pointer_to_mutable_int;
int const * mutable_pointer_to_constant_int;
int *const constant_pointer_to_mutable_int;
int const *const constant_pointer_to_constant_int;
p
টাইপ সঙ্গে সম্পর্কযুক্ত নয়: (const int *const)
। ভাল বা খারাপের জন্য (আপনি আমাকে জিজ্ঞাসা করলে আরও খারাপ) সি এবং সি ++ উভয়ই কনস্ট কোয়ালিফায়ারকে বোঝানো হয়েছে পোস্টফিক্স: সিএফ কনস্ট সদস্য ফাংশন void foo(int a) const;
। ঘোষণা করার সম্ভাবনা const int
হ'ল নিয়মের চেয়ে ব্যতিক্রম।
const
সর্বদা এটির (আগে বাম দিকে) আগত জিনিসটি পরিবর্তিত করে, ব্যতীত যখন এটি কোনও প্রকারের ঘোষণায় প্রথম জিনিস হয়, যেখানে এটি তার পরে (জিনিসটির ডানদিকে) আগত জিনিসটিকে সংশোধন করে।
সুতরাং এই দুটি একই:
int const *i1;
const int *i2;
তারা একটি নির্দেশক সংজ্ঞায়িত const int
। আপনি কোথায় i1
এবং i2
পয়েন্টগুলি পরিবর্তন করতে পারেন তবে তারা যে মানটিকে নির্দেশ করেছেন তা আপনি পরিবর্তন করতে পারবেন না।
এই:
int *const i3 = (int*) 0x12345678;
const
একটি পূর্ণসংখ্যার সাথে একটি পয়েন্টার সংজ্ঞা দেয় এবং 12345678 মেমরি অবস্থানের দিকে নির্দেশ করতে এটি সূচনা করে 12 আপনি 12345678 int
ঠিকানায় মানটি পরিবর্তন করতে পারেন, তবে আপনি যে ঠিকানাটি নির্দেশ করেছেন সেটি পরিবর্তন করতে পারবেন না i3
।
const * char
অবৈধ সি কোড এবং অর্থহীন। সম্ভবত আপনি বোঝাতে চেয়েছিলেন একটি const char *
এবং একটি মধ্যে পার্থক্য জিজ্ঞাসা char const *
, বা সম্ভবত একটি const char *
এবং একটি মধ্যে পার্থক্য char * const
?
const char*
একটি ধ্রুবক চরিত্রের
char* const
পয়েন্টার
const char* const
হ'ল একটি চরিত্রের একটি ধ্রুবক পয়েন্টার একটি ধ্রুবক চরিত্রের একটি ধ্রুবক পয়েন্টার
থাম্বের বিধি: ডান থেকে বামে সংজ্ঞাটি পড়ুন!
const int *foo;
"" foo
( *
) int
পরিবর্তন করতে পারে না এমন দিকে নির্দেশ করে const
")"
প্রোগ্রামারের কাছে এর অর্থ "আমি কীসের প্রতি বিন্দুতে মান পরিবর্তন করব না foo
"।
*foo = 123;
বা foo[0] = 123;
অবৈধ হবে।foo = &bar;
অনুমতি দেওয়া হয়.int *const foo;
অর্থ " foo
( const
) এবং বিন্দু ( *
) এ পরিবর্তন করতে পারে না int
"।
প্রোগ্রামারের কাছে এর অর্থ "আমি যে মেমরি ঠিকানাfoo
উল্লেখ করে তা পরিবর্তন করব না "।
*foo = 123;
বা foo[0] = 123;
অনুমোদিত।foo = &bar;
অবৈধ হবে।const int *const foo;
মানে " foo
( const
) পরিবর্তন করতে পারে না ( ) এবং ( *
) int
পরিবর্তন করতে পারে না ( const
)"।
প্রোগ্রামারের কাছে এর অর্থ "আমি কীসের মান পরিবর্তন করব নাfoo
নির্দেশ করে , বা আমি যে ঠিকানাটিfoo
উল্লেখ করেছি তা পরিবর্তন করব না "।
*foo = 123;
বা foo[0] = 123;
অবৈধ হবে।foo = &bar;
অবৈধ হবে।কনস্ট চর * x এখানে এক্স মূলত একটি অক্ষর পয়েন্টার যা একটি ধ্রুবক মানের দিকে নির্দেশ করে
চর * কনট এক্সটি অক্ষর নির্দেশককে উল্লেখ করা হয় যা ধ্রুবক, তবে এটি যে অবস্থানটি নির্দেশ করছে সেটি পরিবর্তন হতে পারে।
কনস্ট চর * কনস্ট এক্স হল 1 এবং 2 এর সংমিশ্রণ, এর অর্থ এটি একটি ধ্রুবক অক্ষর পয়েন্টার যা ধ্রুবক মানের দিকে নির্দেশ করছে।
কনস্ট * চর x একটি সংকলক ত্রুটির কারণ হবে। এটা ঘোষণা করা যাবে না।
চর কনস্ট * x পয়েন্ট 1 এর সমান।
থাম্বের নিয়মটি হ'ল যদি কনটটি ভের নামের সাথে থাকে তবে পয়েন্টারটি ধ্রুবক হবে তবে পয়েন্টার অবস্থানটি পরিবর্তন করা যেতে পারে , অন্যথায় পয়েন্টারটি একটি স্থির অবস্থানের দিকে নির্দেশ করবে এবং পয়েন্টার অন্য কোনও স্থানে নির্দেশ করতে পারে তবে পয়েন্টিং অবস্থানের সামগ্রীটি পরিবর্তন হতে পারে না ।
পরিবর্তনীয় ঘোষণার এই বিশেষ উদাহরণটি বুঝতে প্রচুর উত্তর নির্দিষ্ট কৌশলগুলি, থাম্বগুলির নিয়ম ইত্যাদি সরবরাহ করে। তবে যে কোনও ঘোষণা বোঝার একটি জেনেরিক কৌশল রয়েছে:
ক্লকওয়াইজ / সর্পিল বিধি
ক)
const char *a;
ক্লকওয়াইজ / সর্পিল নিয়ম অনুসারে a
চরিত্রের দিকে নির্দেশ করা যা স্থির থাকে। যার অর্থ চরিত্রটি স্থির থাকে তবে পয়েন্টারটি পরিবর্তন করতে পারে। অর্থাত্ a = "other string";
ঠিক আছে তবে a[2] = 'c';
সংকলন করতে ব্যর্থ হবে
বি)
char * const a;
নিয়ম অনুসারে, a
একটি চরিত্রের প্রতি বিন্দু নির্দেশক। যেমন আপনি করতে পারেন a[2] = 'c';
তবে আপনি পারবেন নাa = "other string";
আমি মনে করি আপনার অর্থ কনস্ট চার্জ এবং চর * কনস্ট।
প্রথম, কনস্টের চর *, একটি ধ্রুবক চরিত্রের পয়েন্টার। পয়েন্টারটি নিজেই পরিবর্তনযোগ্য।
দ্বিতীয়, চর * কনস্ট্ট একটি চরিত্রের একটি ধ্রুবক পয়েন্টার। পয়েন্টারটি পরিবর্তন করতে পারে না, যে চরিত্রটি এটি নির্দেশ করতে পারে।
এবং তারপরে কনস্ট চর * কনস্টেন্ট রয়েছে যেখানে পয়েন্টার এবং চরিত্রটি পরিবর্তন করতে পারে না।
এখানে কোড সহ একটি বিশদ ব্যাখ্যা
/*const char * p;
char * const p;
const char * const p;*/ // these are the three conditions,
// const char *p;const char * const p; pointer value cannot be changed
// char * const p; pointer address cannot be changed
// const char * const p; both cannot be changed.
#include<stdio.h>
/*int main()
{
const char * p; // value cannot be changed
char z;
//*p = 'c'; // this will not work
p = &z;
printf(" %c\n",*p);
return 0;
}*/
/*int main()
{
char * const p; // address cannot be changed
char z;
*p = 'c';
//p = &z; // this will not work
printf(" %c\n",*p);
return 0;
}*/
/*int main()
{
const char * const p; // both address and value cannot be changed
char z;
*p = 'c'; // this will not work
p = &z; // this will not work
printf(" %c\n",*p);
return 0;
}*/
// Some more complex constant variable/pointer declaration.
// Observing cases when we get error and warning would help
// understanding it better.
int main(void)
{
char ca1[10]= "aaaa"; // char array 1
char ca2[10]= "bbbb"; // char array 2
char *pca1= ca1;
char *pca2= ca2;
char const *ccs= pca1;
char * const csc= pca2;
ccs[1]='m'; // Bad - error: assignment of read-only location ‘*(ccs + 1u)’
ccs= csc; // Good
csc[1]='n'; // Good
csc= ccs; // Bad - error: assignment of read-only variable ‘csc’
char const **ccss= &ccs; // Good
char const **ccss1= &csc; // Bad - warning: initialization from incompatible pointer type
char * const *cscs= &csc; // Good
char * const *cscs1= &ccs; // Bad - warning: initialization from incompatible pointer type
char ** const cssc= &pca1; // Good
char ** const cssc1= &ccs; // Bad - warning: initialization from incompatible pointer type
char ** const cssc2= &csc; // Bad - warning: initialization discards ‘const’
// qualifier from pointer target type
*ccss[1]= 'x'; // Bad - error: assignment of read-only location ‘**(ccss + 8u)’
*ccss= ccs; // Good
*ccss= csc; // Good
ccss= ccss1; // Good
ccss= cscs; // Bad - warning: assignment from incompatible pointer type
*cscs[1]= 'y'; // Good
*cscs= ccs; // Bad - error: assignment of read-only location ‘*cscs’
*cscs= csc; // Bad - error: assignment of read-only location ‘*cscs’
cscs= cscs1; // Good
cscs= cssc; // Good
*cssc[1]= 'z'; // Good
*cssc= ccs; // Bad - warning: assignment discards ‘const’
// qualifier from pointer target type
*cssc= csc; // Good
*cssc= pca2; // Good
cssc= ccss; // Bad - error: assignment of read-only variable ‘cssc’
cssc= cscs; // Bad - error: assignment of read-only variable ‘cssc’
cssc= cssc1; // Bad - error: assignment of read-only variable ‘cssc’
}
বাক্য গঠন:
datatype *const var;
char *const
এই ক্ষেত্রে আসে।
/*program to illustrate the behaviour of constant pointer */
#include<stdio.h>
int main(){
int a=10;
int *const ptr=&a;
*ptr=100;/* we can change the value of object but we cannot point it to another variable.suppose another variable int b=20; and ptr=&b; gives you error*/
printf("%d",*ptr);
return 0;
}
বাক্য গঠন:
const datatype *var
অথবা datatype const *var
const char*
এই ক্ষেত্রে আসে।
/* program to illustrate the behavior of pointer to a constant*/
#include<stdio.h>
int main(){
int a=10,b=20;
int const *ptr=&a;
printf("%d\n",*ptr);
/* *ptr=100 is not possible i.e we cannot change the value of the object pointed by the pointer*/
ptr=&b;
printf("%d",*ptr);
/*we can point it to another object*/
return 0;
}
চর * কনস্ট এবং কনস্টের চর *?
const char * p;
// মান পরিবর্তন করা যায় না
char * const p;
// ঠিকানা পরিবর্তন করা যায় না
const char * const p;
// উভয়ই পরিবর্তন করা যায় না।
const
পরিবর্তক তার বাঁদিকে অবিলম্বে শব্দটি প্রয়োগ করা হয়। এটির একমাত্র ব্যতিক্রম হ'ল যখন তার বামে কিছুই নেই, তখন এটি তার ডানদিকে তত্ক্ষণাত প্রযোজ্য।
এগুলি "একটি ধ্রুবককে ধ্রুবক নির্দেশক" বলার সমস্ত সমতুল্য উপায় char
:
const char * const
const char const *
char const * const
char const const *
দুটি নিয়ম
If const is between char and *, it will affect the left one.
If const is not between char and *, it will affect the nearest one.
যেমন
char const *. This is a pointer points to a constant char.
char * const. This is a constant pointer points to a char.
আমি উল্লেখ করতে চাই যে int const *
(বা const int *
) ব্যবহারটি কোনও const int
ভেরিয়েবলের দিকে নির্দেশকারী পয়েন্টার সম্পর্কে নয় , তবে এই ভেরিয়েবলটি const
এই নির্দিষ্ট পয়েন্টারের জন্য।
উদাহরণ স্বরূপ:
int var = 10;
int const * _p = &var;
উপরের কোডটি পুরোপুরি সূক্ষ্মভাবে সংকলন করে। _p
একটি const
পরিবর্তনশীলকে নির্দেশ করে, যদিও এটি var
নিজেই ধ্রুবক নয়।
আমি সি সম্পর্কে চেক বই থেকে মনে পড়েছি: আপনি ভেরিয়েবলটি দিয়ে শুরু করে বাম দিকে যান এই ঘোষণাটি পড়ুন। অনেক দূরে
char * const a;
আপনি এই হিসাবে পড়তে পারেন: " a
ধ্রুবক পয়েন্টারটিতে ধরণের পরিবর্তনশীল char
",
char const * a;
আপনি এই হিসাবে পড়তে পারেন: "a
ধরণের ধরণের ধ্রুবক পরিবর্তনের জন্য পয়েন্টার। আমি আশা করি এটি সাহায্য করবে।
বোনাস:
const char * const a;
a
ধরণের ধরণের ধ্রুবক পরিবর্তনের স্থির পয়েন্টার হিসাবে আপনি পড়বেন ।