質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

87.77%

ポインタ

受付中

回答 3

投稿

  • 評価
  • クリップ 0
  • VIEW 1,269

score 18

ある本に乗っていたソースコードです。

#include<stdio.h>
#include<string.h>

int main(){
    
    char str_a[20];
    char *pointer;
    char *pointer2;
    
    strcpy(str_a,"Hello, world!\n");
    pointer = str_a;
    printf(pointer);
    
    pointer2 = pointer + 2;
    printf(pointer2);
    strcpy(pointer2,"y you guys!\n");
    printf(pointer);
}

出力結果:

イメージ説明
最後の部分が理解できません。
strcpy(pointer2,"y you guys!\n");
printf(pointer);
この部分で、pointer2にstrcpyしているのに
printf(pointer)でなぜこのような出力になるのでしょうか。

日本語が曖昧ですが、教えていただけると助かります。
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 3

+1

本筋とは関係ありませんが…。
printfの第一引数として指定する文字列はフォーマットを示すためのものなので、動的に生成した文字列を指定するのは一般に不適切です。
※フォーマット文字列と他の引数との不整合や、場合によってはメモリ上のゴミ等からバグが顕在化する可能性がある
文字列sに対し、fputs(s,stdout)やputs(s) (改行付)、printf("%s",s) 等が良いです。
strcpyについては、領域溢れのチェックがないので、一般に使わない方が良い危険な関数です。
文字数の上限を定められる snprintf か、やや問題がありますが strncpy ( 文字数がぴったりの場合、明示的にNUL終端する必要がある ) あたりで。
「ポインタの挙動を見る」という目的に対しては無関係ではあるのですが、参考書のサンプルコードは、一般的に避けた方が良い書き方を注釈なしに ( 単に筆者に理解が無いだけの場合も ) していることがあります。もしもそういった書き方が普通だと思ってしまうと、後々大きな負債を抱えることになりますのでご注意を、と老婆心ながら。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

pointer2 = pointer + 2;

で、pointer2に(pointerの2文字目のアドレス)が入ります。
そのあとで

strcpy(pointer2,"y you guys!\n");

することで、pointer2に入っている(pointerの2文字目のアドレス)以降に、"y you guys!\n"がコピーされます。

pointerには(str_aの文字列の先頭のアドレス)が入っているので
                      〈str_aは配列なので、str_a自身もポインタのはずです〉

printf(pointer);

すると、str_aの内容が出力されます。


という感じだったはずです。もう、C忘れました…

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/03/18 22:16

    使ってなかったな… 先頭と言っている。すいません。

    キャンセル

  • 2015/03/18 23:12

    あ、すみません。
    コメント内に「0文字目」と書いてありますね。
    最初から「2文字目」と書いているので「○文字目」が「配列の○番目」という意味だと認識できませんでした。
    配列としてではなく文字列として扱っているのかと思ってしまいました。
    失礼しました。

    キャンセル

  • 2015/03/19 13:54

    回答ありがとうございました。
    謎は解けました。

    キャンセル

0

大体のニュアンスで回答します。

pointer・・・str_aの先頭アドレスが格納されています。str_aにはHello, world!と書かれています。
             str_a[0]=H,str_a[1]=e,str_a[2]=l・・・str_a[12]=!,str_a[13]=\n

pointer2 ・・・pointer+2なので、pointerが指しているstr_aの先頭アドレス+2→str_a[2]のアドレスを指します。
        そして、y you guys!を書き込むので
        str_a[2]=y str_a[3]= ,str_a[4]=y・・・str_a[12]=!,str_a[13]=\nとなります

pointerはstr_aの先頭アドレスを格納しているので、Hey you guys!と表示されます

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 87.77%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る