を初期化私はどのように主な機能は、const
変数に値を割り当てることができる疑問に思ってが静的チャーCONST * SOMEVAR
#include ...
static char const *program_name;
...
int main(int argc, char** argv){
program_name = argv[0];
...
}
がである、コードの一部を読んでいます。どんな助けもありがとう!
を初期化私はどのように主な機能は、const
変数に値を割り当てることができる疑問に思ってが静的チャーCONST * SOMEVAR
#include ...
static char const *program_name;
...
int main(int argc, char** argv){
program_name = argv[0];
...
}
がである、コードの一部を読んでいます。どんな助けもありがとう!
宣言:
static char const *program_name;
はprogram_name
が一定の文字(変数)のポインタであると言います。ポインタは変更できるので(main()
で割り当てることができます)、このポインタを介して指す文字列を変更することはできません。
を用いて比較対照:
static char * const unalterable_pointer = "Hedwig";
これは、可変データに一定のポインタです。
static char owls[] = "Pigwidgeon";
static char * const owl_name = owls;
strcpy(owl_name, "Hedwig");
/* owl_name = "Hermes"; */ /* Not allowed */
またして比較対照:
static char const * const fixed_pointer_to_fixed_data = "Hermes";
これはそれがで指すように初期化された文字列リテラルではなかった場合は、文字列を変更することができても、ポインタは、変更することはできません定数データへの定数ポインタ。
program_name
はconstポインタではなくconst charへのポインタです。代入文は、pointeeにではなくポインタに値を代入します。
あなたの答えも意味がありますが、私はジョナサンの詳細な説明を好みます。それでも、ありがとう! – AoZ
他の2つの例をありがとう!そして、 '* program_name'は元の方法で宣言されていれば' const'です、つまり 'static char const * program_name;'です。それはあなたが意味することですか? – AoZ
正しい。 'program_name = 'a';'を書くことはできませんでした。これは 'program_name'が定数データを指しているからです。このポインタを使ってデータを変更することはできません(同じデータへの他のポインタがそれを変更できるかもしれませんが - この場合、あなたは '* argv [0] = 'a';を書くことができます。そのようにしたいと望んだ理由はないと思う)。 –