• ベストアンサー

文字列の関数引渡しについて

呼び出す関数が int sample(char *moji)となります。 呼び出しもとで1、2と記載するのは正しいのでしょうか? 1. char *c[SIZE]; *c = DialogBox1->FileName.c_str(); /*FileNameは abcde */ sample(*c); 2. sample("abcde"); 3. char *c[SIZE]="abcde"; sample(c); 4. char *c[SIZE]; c = "abcde"; sample(c); 呼び出す関数にはアドレスを渡すものと思っているのですが 3や4は正しいのでしょうか? また間違っているものやおかしい使い方などが あれば教えていただけないでしょうか。 それぞれの番号の処理について教えていただければ 幸いです。

質問者が選んだベストアンサー

  • ベストアンサー
  • venzou
  • ベストアンサー率71% (311/435)
回答No.3

ちょっと勘違いされているようですね。 char c[SIZE]; C言語の文字列は文字の配列です。文字列を格納するには、配列を使います。SIZEバイト分のメモリが確保され、そこに文字を入れることが出来ます。 char *c; ポインタで宣言すると、確保されるメモリはアドレスを格納するための4バイトです。これに直接文字を格納することは出来ません。ポインタは他の変数を参照する為のものですから、文字列は別のところでメモリを確保し、格納する必要があります。 char *c[SIZE]; この宣言は、ポインタの配列になります。確保されるのはアドレスを格納するための4バイト×SIZEで、上記のポインタと同様、文字列を格納する為のメモリは確保されていません。 上記をふまえ 1. char *c[SIZE]; これはポインタの配列です。 *c = DialogBox1->FileName.c_str(); /*FileNameは abcde */ *cはc[0]と同じで、ポインタの配列の一番目の要素を指します。 DialogBox1->FileName.c_str()から返される文字列へのポインタを、ポインタの配列の一番目の要素に代入しています。 sample(*c); 上記と同様*cはc[0]と同じで、ポインタの配列の一番目の要素です。 ここには先ほどの文字列へのポインタが代入してあるので、それを関数へ渡しています。 きっと、勘違いして使っていますが、正常に動くと思います。 2. sample("abcde"); 静的に確保されている文字列の先頭アドレスを渡しています。問題ないです。 3. char *c[SIZE]="abcde"; コンパイルエラーです。ポインタの配列なので、文字列では初期化できません。 4. char *c[SIZE]; c = "abcde"; 文字列の話とは関係なく、配列で宣言されている変数に、直接値を代入すること自体がエラーになります。 5. char c[SIZE]; c = "abcde"; これもエラーになります。4.と同じです。静的に確保されている配列のアドレスを変更することは出来ません。 6. char c[SIZE] = "abcde"; sample(c); しかし、これはOKです。配列に初期値を代入している事になります。ややこしいですね。(^^;

noname#25605
質問者

お礼

ご回答ありがとうございます。 すごくわかりやすくて勉強になりました。

その他の回答 (3)

  • nerosuke
  • ベストアンサー率33% (39/115)
回答No.4

既に質問への回答は他の方がなさっていますので、 別なアプローチとして。 過去の質問から察するにビルダーをお使いですか? もしそうであれば老婆心ながら、文字列の処理はAnsiStringを使うと便利ですよ。 AnsiStringの使い方はHELPを参照してください。 C/C++の学習の為の質問であるなら、全く見当違いの回答ですが・・・

noname#25605
質問者

お礼

ご回答ありがとうございます。 AnsiStringも現在勉強中です。 ご指摘ありがとうございます。

  • Interest
  • ベストアンサー率31% (207/659)
回答No.2

1,3,4はコンパイルエラーになりませんでしたか? 1.は  char *c;  c = DialogBox1->FileName.c_str();  sample(c); なら話は分かります。 2.はOK。問題なし。 3.は、  char c[SIZE]="abcde";  sample(c); なら納得できます。 4.は、  char *c = "abcde";   sample(c); なら可能。sample(c)の中で変数c をいじられたくないので、 const char *c = "abcde"; のほうが安全。

noname#25605
質問者

お礼

ご回答ありがとうございます。 またまた質問になりますが 宣言時に  char *c = "abcde"; と記載するのと  char *c; c = "abcde"; は同じことなのでしょうか?

  • osamuy
  • ベストアンサー率42% (1231/2878)
回答No.1

> char *c[SIZE] が勘違いしている様に思われ。これですと「char型ポインタの配列」を定義している事になります。 1~4についてあっているところもあれば間違っているところもありますが、そういうのは実際にコンパイラに通してみれば、一発でわかりますので、そこででたエラーメッセージについて調べる方が学習効果が高いと思います。

noname#25605
質問者

お礼

ご回答ありがとうございます。 いろいろ調べてみます。

関連するQ&A

専門家に質問してみよう