同じような質問ばっかりたて続けにしてしまってすみません・・
あの,以下のような例の時↓
------
{
char array[7];
char *ptr;
strcpy(array, "abcdef");
ptr = &(array[0]);
printf(" array = %s\n ptr = %s\n", array, ptr);
}
------
これを実行したら、
array = abcdef
ptr = abcdef
となりますが、ポインタとして宣言してるptrから文字列を得たい時は
*ptr と書くんではないのでしょうか?
%s のように出力形式のところを指定をするだけで
文字列で表示してくれるのはなぜですか?
上の例のように書くのが正しいのでしょうか
A 回答 (6件)
- 最新から表示
- 回答順に表示
No.3
- 回答日時:
失礼ですが、もう一度C言語の教科書を
読み直しましょう。
まず、ポインタの前に文字型以外の配列の勉強を
して正しい理解をしてください。
(「文字列」はちょっと特殊なので、、、)
「*ptr」の「*」は「ptr」が参照する先のアドレス
の中身(特定の1バイト)を参照するための演算子です。
ですから、*(ptr+1)とすれば「b」を指します。
printf(" array = %s\n ptr = %s\n", array+1, ptr+1);
とすれば、
array = bcdef
ptr = bcdef
と表示されます。
array自身はアドレスを指していますので
「array+1」で「array」から「sizeof(char)*1」分
だけアドレスがインクリメントされるため
「*(array+1)」は「array[1]」と等価となり、「array+1」は「&array[1]」と等価となります。
「%s」書式指定子には参照先のアドレスを指定します。
「%s」書式指定子は指示されたアドレスから開始
され、「\0(null文字)」までのバイト列を単純に
表示するだけの機能です。
「ptr+1」も同様で「ptr」の参照先は「&array[0]」
なので「ptr+1」で「&array[1]」と等価となります。
No.4
- 回答日時:
C言語を勉強している人が陥りやすいワナにかかりましたね
C言語というものはシンプルですからもっと客観的に考える必要があります
それぞれの変数にどんな値が入っているかを良く考えながらもう一度トレース
してみてはいかがでしょうか
ちなみにこのプログラムでは
ptr = &(array[0]);
の処理の結果 ptr == array となります
( ただし array は変数ではないですが
代入できない char * 変数と考えればOKです )
ですからこの行の処理は
ptr = array;
とやっていることはまったく同じです
この行に置き換えてこのプログラムを見直してみてください
・・・いかがでしょう、少しはわかりやすくなったのでは・・・?
No.5
- 回答日時:
printf(" array = %s\n ptr = %s\n", array, ptr);
を良く見て下さい。
array は何と等価でしょうか?
配列を配列名だけで書いたときは、その値は配列の先頭アドレスをさします。
つまり、arrey は &arrey[0] とは同じアドレス(つまり同じ値です)を差し
ています。
また printf のフォーマット部分で %s は他の方も書かれているように、
「ポインタの指し示すアドレスから\0 が見つかるまでを文字列として表示する。」
というprintf への指示です。
そのため、yuki7505 さんの書いたプログラムは、yuki7505 さんの書かれたような
結果が返ってきたのです。
また、*ptr とした場合は arrey 配列の先頭の文字 "a" の値が得られます。
これは、char *型の変数は はコンパイラから見てchar 配列のポインタなのか
char 変数のポインタなのかはまったく区別つかないし、区別してはいけない
ものだからです。そうしないと、配列用のポインタ、1文字変数用のポインタ・・・
ととんでもない数の型を言語仕様で作らなければならなくなります。
それで、*ptr と書いた場合は char 型の値が帰ってくるのです。では
*ptr が差すものが、配列だったらどうするの?と言われると、
「それはプログラマがそれを配列として扱い処理する。」
と言うことになります。
ということでたぶん、yuki7505 さんは、
printf("arrey = %s\n ptr = %08x\n",arrey,ptr);
として、文字列とそのアドレスを表示されることを期待していたのではと思い
ますがどうでしょうか?
No.6
- 回答日時:
%dや%xは、引数の値を表示する機能です。
%sは引数の値をアドレスとみなして、その先にあるメモリーを
0x00が現れるまで文字列として表示する機能です。
char *ptr;という定義があって、実行文中で*ptrと書くと
「ptrのさすメモリー」の中にあるデーターの値を意味します。
このとき、型定義にしたがって最終的な値はcharとして扱われます。
ただ単にptrと書くと、変数の型定義にしたがってchar *の意味、
つまり「「charの入っているメモリー」のアドレス」の意味になります。
printf("%s",*ptr);の意味は、
printf("引数をアドレスとみなしその先のメモリーを表示する",
「ptrのさすメモリーの中のデーター」をアドレスとして使う);
printf("%s",ptr);の意味は
printf("引数をアドレスとみなしその先のメモリーを表示する",
ptrそのもの(←つまり"abcdef"の入っているメモリーのアドレス) );
ちょっと難しいですが、仕様にたちかえって説明してみました。
最初はこんがらがりますが、がんばってください。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) VBAでのMATCH関数 3 2022/10/17 19:06
- C言語・C++・C# c言語の問題です 課題1 (二分探索木とセット) 大きさ size の配列 array を考える。す 2 2023/01/10 21:08
- Visual Basic(VBA) エクセルのマクロについて教えてください。 4 2023/03/02 08:40
- PHP PHPでCSVを出力するさいに、ループの中で前の行の値を変更したい 3 2022/10/27 17:44
- PHP PHPでCSVを出力するさいに、ループの中で前の行の値を変更したい 1 2022/10/27 14:21
- Visual Basic(VBA) エクセルのマクロについて教えてください。 1 2023/03/07 14:05
- C言語・C++・C# c言語について array[i]-‘0’ これってどーゆー意味ですか? (ちなみに16進数を10進数 5 2022/12/06 18:39
- PHP ファイルの書き込みについて教えて下さい。 1 2023/03/20 12:01
- C言語・C++・C# 宣言する関数の形が決まっている状態で、 str1とstr2の文字列をこの順に引っ付けてstrに保存し 2 2022/05/30 18:21
- C言語・C++・C# C言語初心者 ポインタについて、お助けください、、 2 2023/03/15 23:50
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
プログラミングのPythonのnoteb...
-
PHPのmin関数、「1」以上の数値...
-
スカラーのベクトル微分
-
Perlで重複行を削除したい
-
特定の文からメールアドレスの...
-
MySQLのデータをPHPで多次元...
-
数独かを判断するプログラム
-
CArrayの要素としてCStringArra...
-
PHP 文字化けについて
-
C言語 最大値と最小値を求めて...
-
pythonのnumpyでの繰り返しでの...
-
Pager::factory()の使い方がわ...
-
配列データのMySQLへの登録
-
c言語 単位行列
-
mb_encode_numericentityでタグ...
-
連想配列で値が空だったら、要...
-
濁点のソート
-
delphi 2次元配列がわかりません
-
プルダウンメニューにDBの内容...
-
file_existsでファイル名の部分...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
スカラーのベクトル微分
-
特定の文からメールアドレスの...
-
読み(あ行~わ行)ごとに分け...
-
ファイルの書き込みについて教...
-
php で1から100までの素数の表...
-
C言語の配列をPush(追加)する...
-
配列の要素(value)に、変数を...
-
STLのvectorで作った配列をメン...
-
C言語 最大値と最小値を求めて...
-
行列
-
verilogで、配列の一部をタスク...
-
CArrayのソート
-
PHPのセレクトボックスの初期値...
-
Perlで重複行を削除したい
-
pythonのnumpyでの繰り返しでの...
-
System.String.Splitでエラー
-
連想配列から<th>を含むテーブ...
-
2次元配列CSVのソート
-
Pager::factory()の使い方がわ...
-
【PHP】配列のキー名の修正は可...
おすすめ情報