2013-01-11 11 views
9

を初期化私はどのように主な機能は、const変数に値を割り当てることができる疑問に思ってが静的​​チャーCONST * SOMEVAR

#include ... 

static char const *program_name; 

... 
int main(int argc, char** argv){ 
program_name = argv[0]; 

... 
} 

がである、コードの一部を読んでいます。どんな助けもありがとう!

答えて

12

宣言:

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"; 

これはそれがで指すように初期化された文字列リテラルではなかった場合は、文字列を変更することができても、ポインタは、変更することはできません定数データへの定数ポインタ。

+0

他の2つの例をありがとう!そして、 '* program_name'は元の方法で宣言されていれば' const'です、つまり 'static char const * program_name;'です。それはあなたが意味することですか? – AoZ

+0

正しい。 'program_name = 'a';'を書くことはできませんでした。これは 'program_name'が定数データを指しているからです。このポインタを使ってデータを変更することはできません(同じデータへの他のポインタがそれを変更できるかもしれませんが - この場合、あなたは '* argv [0] = 'a';を書くことができます。そのようにしたいと望んだ理由はないと思う)。 –

7

program_nameはconstポインタではなくconst charへのポインタです。代入文は、pointeeにではなくポインタに値を代入します。

+0

あなたの答えも意味がありますが、私はジョナサンの詳細な説明を好みます。それでも、ありがとう! – AoZ

関連する問題