変数ポインタの内容を変更する:このコードで
#include <iostream>
int main()
{
const char* name = "Abc";
std::cout<<*name<<std::endl;
return 0;
}
がどのようにポインタ変数の内容を変更することができ、ないそれが指しているものには?
そして、なぜこのプログラムの出力としてA
が得られますか?
ありがとうございました。
変数ポインタの内容を変更する:このコードで
#include <iostream>
int main()
{
const char* name = "Abc";
std::cout<<*name<<std::endl;
return 0;
}
がどのようにポインタ変数の内容を変更することができ、ないそれが指しているものには?
そして、なぜこのプログラムの出力としてA
が得られますか?
ありがとうございました。
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)またはあなたが今どこにいてもかまいません。
const char *変数の内容を変更しないでください。それは定義上一定です。変更可能な文字列が必要な場合は、std :: stringを使用するか、代わりにchar * buffer []を割り当てます。
リテラル別の文字列のアドレスに変更することができますname
のアドレス値に変更するには:
const char* newname = "def";
name = newname;
名前がまだのconst char型へのポインタであるように。
あなたはポインタに関して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つであるため。
警告:文字列リテラルを変更することは未定義の動作です - 非常に良い理由のためにconstです – Flexo