-PR-
締切済み

charのポインタについて

  • 困ってます
  • 質問No.45913
  • 閲覧数94
  • ありがとう数8
  • 気になる数0
  • 回答数6
  • コメント数0

お礼率 54% (23/42)

同じような質問ばっかりたて続けにしてしまってすみません・・
あの,以下のような例の時↓
------
{
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 のように出力形式のところを指定をするだけで
文字列で表示してくれるのはなぜですか?
上の例のように書くのが正しいのでしょうか
通報する
  • 回答数6
  • 気になる
    質問をブックマークします。
    マイページでまとめて確認できます。

回答 (全6件)

  • 回答No.2

 %s は、指定された変数をポインタとして見るからです。 ...続きを読む
 %s は、指定された変数をポインタとして見るからです。
お礼コメント
yuki7505

お礼率 54% (23/42)

ありがとうございます。
投稿日時 - 2001-03-02 11:26:19
関連するQ&A
  • 回答No.3
レベル12

ベストアンサー率 41% (324/772)

失礼ですが、もう一度C言語の教科書を 読み直しましょう。 まず、ポインタの前に文字型以外の配列の勉強を して正しい理解をしてください。 (「文字列」はちょっと特殊なので、、、) 「*ptr」の「*」は「ptr」が参照する先のアドレス の中身(特定の1バイト)を参照するための演算子です。 ですから、*(ptr+1)とすれば「b」を指します。 printf(" array = ...続きを読む
失礼ですが、もう一度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]」と等価となります。
お礼コメント
yuki7505

お礼率 54% (23/42)

ありがとうございます。
投稿日時 - 2001-03-02 11:26:40
  • 回答No.4
レベル7

ベストアンサー率 33% (3/9)

C言語を勉強している人が陥りやすいワナにかかりましたね C言語というものはシンプルですからもっと客観的に考える必要があります それぞれの変数にどんな値が入っているかを良く考えながらもう一度トレース してみてはいかがでしょうか ちなみにこのプログラムでは ptr = &(array[0]); の処理の結果 ptr == array となります ( ただし array は変数で ...続きを読む
C言語を勉強している人が陥りやすいワナにかかりましたね
C言語というものはシンプルですからもっと客観的に考える必要があります
それぞれの変数にどんな値が入っているかを良く考えながらもう一度トレース
してみてはいかがでしょうか
ちなみにこのプログラムでは

ptr = &(array[0]);

の処理の結果 ptr == array となります
( ただし array は変数ではないですが
代入できない char * 変数と考えればOKです )
ですからこの行の処理は

ptr = array;

とやっていることはまったく同じです
この行に置き換えてこのプログラムを見直してみてください
・・・いかがでしょう、少しはわかりやすくなったのでは・・・?
お礼コメント
yuki7505

お礼率 54% (23/42)

ありがとうございます。色々試してみます。
投稿日時 - 2001-03-02 11:28:32
  • 回答No.5
レベル8

ベストアンサー率 57% (11/19)

printf(" array = %s\n ptr = %s\n", array, ptr); を良く見て下さい。 array は何と等価でしょうか? 配列を配列名だけで書いたときは、その値は配列の先頭アドレスをさします。 つまり、arrey は &arrey[0] とは同じアドレス(つまり同じ値です)を差し ています。 また printf のフォーマット ...続きを読む
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);

として、文字列とそのアドレスを表示されることを期待していたのではと思い
ますがどうでしょうか?
お礼コメント
yuki7505

お礼率 54% (23/42)

そう期待してたんですが違うんですね。もっともっと勉強します。ありがとうございました。
投稿日時 - 2001-03-02 11:30:39
  • 回答No.1
レベル14

ベストアンサー率 24% (612/2465)

*ptrで宣言した場合は、文字列表示する場合はptrと書くのが正しいのです。 ptrが文字列の先頭ポインタをさします。 ...続きを読む
*ptrで宣言した場合は、文字列表示する場合はptrと書くのが正しいのです。
ptrが文字列の先頭ポインタをさします。
お礼コメント
yuki7505

お礼率 54% (23/42)

ありがとうございます。
投稿日時 - 2001-03-02 11:25:50
  • 回答No.6
レベル8

ベストアンサー率 34% (19/55)

%dや%xは、引数の値を表示する機能です。 %sは引数の値をアドレスとみなして、その先にあるメモリーを 0x00が現れるまで文字列として表示する機能です。 char *ptr;という定義があって、実行文中で*ptrと書くと 「ptrのさすメモリー」の中にあるデーターの値を意味します。 このとき、型定義にしたがって最終的な値はcharとして扱われます。 ただ単にptrと書くと、変数の型定義に ...続きを読む
%dや%xは、引数の値を表示する機能です。
%sは引数の値をアドレスとみなして、その先にあるメモリーを
0x00が現れるまで文字列として表示する機能です。

char *ptr;という定義があって、実行文中で*ptrと書くと
「ptrのさすメモリー」の中にあるデーターの値を意味します。
このとき、型定義にしたがって最終的な値はcharとして扱われます。
ただ単にptrと書くと、変数の型定義にしたがってchar *の意味、
つまり「「charの入っているメモリー」のアドレス」の意味になります。

printf("%s",*ptr);の意味は、
printf("引数をアドレスとみなしその先のメモリーを表示する",
  「ptrのさすメモリーの中のデーター」をアドレスとして使う);

printf("%s",ptr);の意味は
printf("引数をアドレスとみなしその先のメモリーを表示する",
  ptrそのもの(←つまり"abcdef"の入っているメモリーのアドレス) );

ちょっと難しいですが、仕様にたちかえって説明してみました。
最初はこんがらがりますが、がんばってください。
お礼コメント
yuki7505

お礼率 54% (23/42)

すごく頭がこんがらまってます。はあ。。むずかしいですね・・。もっと勉強します。
投稿日時 - 2001-03-02 11:31:38
このQ&Aのテーマ
このQ&Aで解決しましたか?
関連するQ&A
-PR-
-PR-
こんな書き方もあるよ!この情報は知ってる?あなたの知識を教えて!
このQ&Aにはまだコメントがありません。
あなたの思ったこと、知っていることをここにコメントしてみましょう。

その他の関連するQ&A、テーマをキーワードで探す

キーワードでQ&A、テーマを検索する
-PR-
-PR-
-PR-

特集


新大学生・新社会人のパソコンの悩みを解決!

いま みんなが気になるQ&A

関連するQ&A

-PR-

ピックアップ

-PR-
ページ先頭へ