2011-01-28 4 views
5

変数ポインタの内容を変更する:このコードで

#include <iostream> 
int main() 
{ 
const char* name = "Abc"; 
std::cout<<*name<<std::endl; 
return 0; 
} 

がどのようにポインタ変数の内容を変更することができ、ないそれが指しているものには?

そして、なぜこのプログラムの出力としてAが得られますか?

ありがとうございました。

答えて

11

char*ポインタを逆参照しているため、charが表示されます。

次の操作を行うことにより内容を変更することができます:文字列リテラルの内容を変更することがC未定義行動を持って、

*a = 'B'; // your char* would contain "Bbc" 
a[0] = 'B'; // your char* would contain "Bbc" 
a[1] = 'B'; // your char* would contain "ABc" 
a[2] = 'B'; // your char* would contain "AbB" 

をしかし。だからあなたはそれをしてはいけません。代わりに、char*を動的に設定する必要があります。このようなもので:

char *a; 
a = malloc(sizeof(char)*100); // a string with a maximum of 99 chars 
strcpy(a, "Abc"); 
// now you can safely change char* contents: 
a[0] = '1'; 
a[1] = '1'; 
a[2] = '1'; 
printf("%s", a); // will print 111 

文字列操作は、Cのような言語ではそう簡単ではありません。あなたが使用している構文では、C++コンパイラでコードをコンパイルしているようだから、charへのポインタを使用する代わりに、stringクラスを試してみてください。あなたは私がBの印刷*(Name+1)となどをしたいfyou を持っているメモリ内の最初の場所を指し*Nameにアクセスしている

1

..

あなたが内容を変更したい場合は、値を代入する*名前または*(名前+ 1)またはあなたが今どこにいてもかまいません。

+0

警告:文字列リテラルを変更することは未定義の動作です - 非常に良い理由のためにconstです – Flexo

4

const char *変数の内容を変更しないでください。それは定義上一定です。変更可能な文字列が必要な場合は、std :: stringを使用するか、代わりにchar * buffer []を割り当てます。

1

リテラル別の文字列のアドレスに変更することができますnameのアドレス値に変更するには:

const char* newname = "def"; 
name = newname; 

名前がまだのconst char型へのポインタであるように。

0

あなたはポインタに関してconstを理解する必要があります。

const char *は、変更できないデータへのポインタを意味しますが、ポインタを移動することはできます。

const char * name = "Abc"; 
name = "Def"; // allowed 
name[1]='B'; // compiler error 

あなたが移動することはできませんポインタは、次に使用する場合

const char * const name = "Abc"; // cannot move to point at something else 
char data[] = "ghi"; 
char * const name = &data[0]; 
name[1] = 'H'; // permitted 
name = &data[1]; // not allowed as name is a constant pointer 

あなたの出力がある*名前がchar、1つのあなたのポインタが、文字列のため、最初の1つであるため。