4

重複の可能性:
char * const と const char * の違いは何ですか?
const char * const と const char *?

c で関数を定義すると、 (const char *str) 、 (char const *str) または (char *const str) を変数として使用できます。それらの違いは何ですか?

4

4 に答える 4

8

最初の 2 つは同等でconst char *strあり、char const *strどちらも char 定数へのポインターであることを宣言strます (つまり、char 自体を変更してはならないことを意味しchar *const strます)。 t は変更できません) を a (それ自体は自由に変更できます) にします。char

型宣言の読み方に関する興味深い記事があるので、確認したい場合はこちらを参照してください。

于 2012-10-09T14:30:07.637 に答える
5

char const * strconst char * strconst は左側の項に適用されるか、左側に型がない場合は右側の項に適用されるため、とは同じです。そのため、 で 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!
于 2012-10-09T14:29:18.540 に答える
2

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;
于 2012-10-09T14:38:48.740 に答える
1
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;
于 2012-10-09T14:28:28.683 に答える