重要なお知らせ

「教えて! goo」は2025年9月17日(水)をもちまして、サービスを終了いたします。詳細はこちら>

電子書籍の厳選無料作品が豊富!

呼び出す関数が 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は正しいのでしょうか?
また間違っているものやおかしい使い方などが
あれば教えていただけないでしょうか。
それぞれの番号の処理について教えていただければ
幸いです。

A 回答 (4件)

ちょっと勘違いされているようですね。



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です。配列に初期値を代入している事になります。ややこしいですね。(^^;
    • good
    • 0
この回答へのお礼

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

お礼日時:2006/12/26 22:22

既に質問への回答は他の方がなさっていますので、


別なアプローチとして。

過去の質問から察するにビルダーをお使いですか?
もしそうであれば老婆心ながら、文字列の処理はAnsiStringを使うと便利ですよ。
AnsiStringの使い方はHELPを参照してください。

C/C++の学習の為の質問であるなら、全く見当違いの回答ですが・・・
    • good
    • 0
この回答へのお礼

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

お礼日時:2006/12/26 22:24

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";
のほうが安全。
    • good
    • 0
この回答へのお礼

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

お礼日時:2006/12/26 22:19

> char *c[SIZE]


が勘違いしている様に思われ。これですと「char型ポインタの配列」を定義している事になります。

1~4についてあっているところもあれば間違っているところもありますが、そういうのは実際にコンパイラに通してみれば、一発でわかりますので、そこででたエラーメッセージについて調べる方が学習効果が高いと思います。
    • good
    • 0
この回答へのお礼

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

お礼日時:2006/12/26 22:15

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!