- ベストアンサー
正しいsizeofの使い方とcharのポインタについて教えてくださいm(__)m
C言語なのですが、 例えば、次のように実験してみました。 char * rec_fld[12]; int x,y; char tt[11]; ※rec_fld[1]には”私は完全な素人” という文字が入っていると思ってください。 x = sizeof( rec_fld[1] ); strcpy( tt, rec_fld[1] ); y = sizeof( tt ); すると、xは4とかいう数字が格納されていて、 yには11という数字が格納されていました。 ttが11なのは分かりやすいのですが、 なんで、xは、文字数の14とかにならないのでしょうか? sizeofの中の書き方が違うのでしょうか? あと、char *で配列宣言するのと、charで宣言するのとは 何が違うのでしょうか? どなたか、教えて下さいませ。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
sizeof は「文字数」なんて高尚なものを理解しません. rec_fld[1] の型は char *. だから sizeof(rec_fld[1]) の値は sizeof(char *) と同じで (あなたの環境の場合) 4. 一方 tt の型は char[11] だから sizeof(tt) の値は sizeof(char[11]) と同じで 11.
その他の回答 (2)
- chie65536(@chie65535)
- ベストアンサー率44% (8740/19838)
>char * rec_fld[12]; これは「どっかの文字列を指している、アドレスが12個並んでいる配列」です。 >※rec_fld[1]には”私は完全な素人” >という文字が入っていると思ってください。 rec_fld[1]には、上記のような文字は入れられません。 ”私は完全な素人”という文字列が「どこか」にあって、rec_fld[1]には「その『どこか』を指すアドレス」が入っています。 >x = sizeof( rec_fld[1] ); 「その『どこか』を指すアドレス」が何バイトなのかをxに入れるから、xは「アドレスを表現するのに必要なバイト数」になります。 32ビットCPUで、アドレス空間が32ビットなら、アドレスは4バイトで表わせるので「sizeof(どっかのアドレス)」は4です。 rec_fld[1]は「char *」です。なので「sizeof(rec_fld[1])」は「sizeof(char *)」と同じ値になります。 >あと、char *で配列宣言するのと、charで宣言するのとは何が違うのでしょうか? char c; char *p; の違いは判ってますか? 「c」は「文字」を1文字だけ入れられます。「p」は「どっかにある文字のアドレス」を入れられます。 上記の違いが判ってるなら char ac[10]; char *ap[10]; の違いも判りますね? これは「上記のc、pが10個セットで並んでるだけ」です。 つまり「acは文字が10個」「apはアドレスが10個」です。
お礼
chie様、分かりやすくご説明ありがとうございます! 一昨日、この問題で4、5時間も時間を消費してしまいました… char ac[10];と、char *ap[10];の違い分かりました!! ありがとうございます!
- khons_moon
- ベストアンサー率53% (52/97)
「*」を付けるのはポインタ宣言と呼ばれるものです。「*」を付ける事によって、アドレス(パソコンの番地)を格納するものとして宣言されています。 ポインタはC言語の難関なので理解が難しいかと思います。変に覚えられても困るので、参考に分かりやすそうなサイトを… http://www9.plala.or.jp/sgwr-t/c/sec10.html ここで、注目したいのはrec_fld[12]がポインタとして宣言されている事です。 つまりrec_fldはパソコンのアドレスを格納するための変数になっているわけです。普通パソコンのアドレスを格納するためには32bit=4バイト必要です。(64bitパソコンなら8バイト) sizeof(rec_fld[1])というのはアドレスを格納するための変数1個分のサイズという意味になるので=4バイトとなります。
お礼
moonさん、勝手に短縮形で呼ばせていただきますが、 ありがとうございます! 参考のURL驚くほど分かりやすかったです。 加えて、本日、ポインタの参考書買って来ました;D 勉強します…
お礼
taco様の大変少ない言葉の中に私の必要なすべてが入っていました!! なるほどーそーなのか、サイズなんですね;D ありがとうございました!