
呼び出す関数が 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は正しいのでしょうか?
また間違っているものやおかしい使い方などが
あれば教えていただけないでしょうか。
それぞれの番号の処理について教えていただければ
幸いです。
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です。配列に初期値を代入している事になります。ややこしいですね。(^^;
No.4
- 回答日時:
既に質問への回答は他の方がなさっていますので、
別なアプローチとして。
過去の質問から察するにビルダーをお使いですか?
もしそうであれば老婆心ながら、文字列の処理はAnsiStringを使うと便利ですよ。
AnsiStringの使い方はHELPを参照してください。
C/C++の学習の為の質問であるなら、全く見当違いの回答ですが・・・
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";
のほうが安全。
ご回答ありがとうございます。
またまた質問になりますが
宣言時に
char *c = "abcde";
と記載するのと
char *c;
c = "abcde";
は同じことなのでしょうか?
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# 宣言する関数の形が決まっている状態で、 str1とstr2の文字列をこの順に引っ付けてstrに保存し 2 2022/05/30 18:21
- C言語・C++・C# スタックフレームの消滅 6 2023/05/20 12:33
- C言語・C++・C# c言語 プログラムのエラー 1 2023/02/11 20:31
- C言語・C++・C# c言語配列の結合についてです。 なぜうまくいかないのでしょうか。 #include <stdio.h 4 2022/05/30 22:42
- C言語・C++・C# const char** p;のとき、free(p)でC4090エラーとなるのはなぜですか 3 2023/03/31 16:28
- UNIX・Linux bashの変数でブランクがあるかチェックする方法教えて下さい。 3 2023/04/06 16:09
- C言語・C++・C# C言語初心者 ポインタについて、お助けください、、 2 2023/03/15 23:50
- C言語・C++・C# c言語 コマンドライン引数 4 2023/02/09 18:47
- C言語・C++・C# プログラミングの授業の課題です 1 2023/01/17 22:15
- Windows 10 bash の -z オプションがうまく動作しない原因を教えて下さい。 4 2023/03/22 18:04
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
CStringからchar*への型変換に...
-
char*を初期化したいのですが
-
C言語のintとcharの違いってな...
-
char型にint型の数値を代入する。
-
C言語にて構造体のメンバがNULL...
-
fgetc( )の戻り値はなぜ整数??
-
char 文字列型 の表現範囲が-12...
-
fstream型オブジェクトを関数の...
-
C++17で、unsigned char * 配列...
-
DWORDとcharの変換
-
文字列内の数字削除
-
new charとnew char[N]の違いは?
-
文字型配列に格納した空白の切捨て
-
C++Builder 2009 テキスト...
-
csvファイルをfscanfで読み込む...
-
文字列の途中から途中までを抽出
-
[C] 構造体メンバーのカンマ区...
-
エクセルのMID関数は、C言語では?
-
小数点入りの文字列をfloat型に...
-
wsprintf( ポインタ , "%d" , "...
おすすめ情報