重複の可能性:
char * const と const char * の違いは何ですか?
const char * const と const char *?
c で関数を定義すると、 (const char *str) 、 (char const *str) または (char *const str) を変数として使用できます。それらの違いは何ですか?
重複の可能性:
char * const と const char * の違いは何ですか?
const char * const と const char *?
c で関数を定義すると、 (const char *str) 、 (char const *str) または (char *const str) を変数として使用できます。それらの違いは何ですか?
最初の 2 つは同等でconst char *str
あり、char const *str
どちらも char 定数へのポインターであることを宣言しstr
ます (つまり、char 自体を変更してはならないことを意味しchar *const str
ます)。 t は変更できません) を a (それ自体は自由に変更できます) にします。char
型宣言の読み方に関する興味深い記事があるので、確認したい場合はこちらを参照してください。
char const * str
const char * str
const は左側の項に適用されるか、左側に型がない場合は右側の項に適用されるため、とは同じです。そのため、 で double const エラーが発生しconst char const *
ます。どちらも定数 char へのポインターです。ポインターの値は変更できますが、逆参照された値は変更できません。
const char * my_const_str;
my_const_str = "Hello world!"; // ok
my_const_str[0] = "h"; // error: my_const_str[0] is const!
char * const
一方、定数ポインターです。ポインターを変更することはできませんが、ポインターによって逆参照される値は変更できます。
char * const my_const_ptr = malloc(10*sizeof(char));
my_const_str[0] = "h"; // ok
my_const_str = "hello world"; // error, you would change the value of my_const_str!
C 宣言を次のように読み取ります。
変数から始めます。右を見て、左を見て、また右を見てください (英国で道路を横断するようなものです)。*
「ポインター」と言うとき、「[]
配列」と言うとき、()
「関数」と言うときなどです。あなたの例では、右に何もありません。
const char *str
「str は定数である char へのポインタです」
char const *str
「str は定数 char へのポインタです」(上記と同じ)
char *const str
「str は char への定数ポインタです」
char ch = 'x';
const char cch = 'y';
const char *str = &cch;
char const *str = &cch;
char * const str = &ch;
const char * str1: declare str as pointer to const char
char const * str2: declare str as pointer to const char
char * const str3: declare str as const pointer to char
したがって、最初の 2 つのケースでは、ポインターは変更可能ですが、ポインターによって参照されるデータはそうではありません。
最後のケースでは、ポインターは可変ではありませんが、内部のデータは可変です。
それでは、いくつかの操作を見てみましょう。
str1[0]; // legal;
str1[0] += 3; // illegal;
str1 = NULL; // legal;
str3[0]; // legal;
str3[0] += 3; // legal;
str3 = NULL; // illegal;