char*pとchar p[]の違い
4724 ワード
:
char* p , , "abc123ABC" , , char p[] , , "abc123ABC" ,
質問:
char *p , ?
回答:
, ?
, , , , ,
:
char ca[] ="abcd";
char *cb = "abcd";
ca[] ca[x] , cb abcd , , ?
解決:
:
char ca[]="abcd";——ca ( ) , ;ca , ; "abcd" , 。 , "abcd" ca, 。
char* cb = "abcd";( C++ deprecated, const char* cb = "abcd"; )—— cb "abcd" ( & sizeof ), 。
, , C++ , 。 ,ISO C , , 。
:
char ca[]="abcd";// , 。
char *cb = "abcd";// , , , 。
宣言:
char s[] = "abc", t[3] = "abc";
「平原」char配列オブジェクトSおよびTを定義する要素は、文字初期化文字列である.この宣言は同じ文字です
s[] = { 'a', 'b', 'c', '\0' }, t[] = { 'a', 'b', 'c' };
配列の内容が変更されました.一方、宣言
char *p = "abc";
定義型「ポインタはchar」pと、1つのタイプのオブジェクト「配列char」の長さ4を指す文字列初期化要素を初期化します.pを使用して配列の内容を変更しようとすると、この動作は定義されていません.
C/C++を何年も使っている人は、次の文字列の付与文に慣れていないと信じています. char* p = "test";同时に、私も信じて、各位はこのような文を使った后に多くの苦しみを食べたことがあるのも少なくないでしょうか?ポインタpを利用して文字列の内容を変更したい場合は、プログラムがメモリを失って不正に操作されます.たとえば、p[0]='s'; strcpy(p, "haoel");原因はchar*p=「test」である.この声明は、ポインタを宣言していますが、このポインタはグローバルなconstメモリ領域を指しています.constメモリ領域はもちろん、変更したいなら変更しません.だから、このメモリを書かなければならないなら、それは非常に深刻なメモリエラーです.また、「グローバルconstメモリ領域」を太くするのは、信じない場合は、p 1とp 2のアドレスが同じかどうかを確認するために、次のコードを試してみてください. char* p1 = "anything"; char* p2 = "anything"; printf(“ p1=%x, p2=%x ”, p1, p2);これはよく知られている問題だと思います.代わりに、初期化宣言に配列を使用する必要があります.例えば、char str[]=「hello world」;なぜC++を学ぶ人にそんなに厳しいのかと聞かれると、C++を学んだ人はC++のconstキーワードがどのような権力を持っているかを知っているので、C++がconstに対して比類のない配慮と愛を持っていることを知っているはずです.ほとんどのC++に関する本はconstというものが言及されています.だから、C++のプログラマーとして、もしあなたが知らないなら、それはあまりにも言えません.二重引用符による文字列はconstであることを知っています.だから、C++の世界では、const char*p=「test」という声明を行うべきです.このように、この文字列の内容を変更すると、コンパイラはあなたにエラーを与え、プログラムのコンパイルが失敗し、実行時のメモリエラーが発生しません.しかし、問題は、C++のようなタイプに厳しい言語では、char*p=「test」などのプログラムをコンパイルするときにエラーがなく、警告さえありません(g++とvc++7).まさかこれは彼のバグなのか.これは古いCに対する下向きの互換性だと思います.なぜなら、Cの世界では、このような使い方が多すぎるからです.C++では、例えば、関数のパラメータや異常なキャプチャには、(コンパイラによっては、gcc 3.4.3版では、次の例の異常例はキャプチャできないが、VC++6ではキャプチャできる)func(char*p){}//このように関数func(「abc」)を呼び出すという問題がある. try { thow “exception”;}catch(char*p){}これらはすべてC++コンパイラがconst char*をchar*に変える罪を黙認しているので、間違いなくみんなに誤解を与えるに違いない.恐れることなくその中に入って、自分が正しい道に入ったと思っているほどだ.このように見ると、このような下向きの互換性のあるC++基準は、少し間違っているように見えます.しかし、幸いなことに、C++標準委員会はすでにこの点を意識している.このC++のfeatureは「Deprescated Feature」、すなわち「推奨されない特性」として定義される.将来、この特性はC++から削除され、現在のプログラムは新しいC++コンパイラでコンパイルできません.プログラムの移植性にとって、今日書いたコードは特にこれらの「Deprescated Feature」に注意しなければならない.私の知る限りでは、現在C++に「Deprescated Feature」と記載されている以下の(正確ではないかもしれませんが、ご指摘ください)のfeatureは、C++標準委員会によってfeatrueの廃止に定められています.一、暗い文字列のconst変換.char *p = "test";w_char *pw = L"test";1つのconstの文字列タイプをnon-constに変換します.ポインタと配列が含まれます.二、暗黙のタイプ宣言.func(){}//関数の暗黙的な戻りタイプはintstatic numである.//変数の暗黙のタイプはintというfeatureはC 89でも使用できますが、C 99とC++では除去されています.(gcc 3.4バージョンではこの宣言に対してコンパイルエラーが与えられ、VC++6.0ではこれが合法的なプログラムとみなされる)三、ブール変数の累積操作.bool isConn = false;isConn++;//この操作はisConnをtrueに変える現在では、ほとんどのコンパイラがこの操作を認めていますが、この使い方も提案されず、いつかキャンセルされます.四、親メンバーのアクセス権限を変更します.class B{ protected: int i;};class D : public B{ public: B::i;