- ベストアンサー
ポインタによる文字列の出力
- C++のポインタを使用して文字列を出力する方法について解説します。
- Visual Studioを使用している場合、ポインタの初期化に関する警告が表示されることがあります。
- プログラム力が低い場合でも、ポインタを正しく扱うための方法を学ぶことができます。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
>""を使ってポインタがさす文字列を変更できるとあるのですが。 あってますよ。 しかし、 char *abc="abcd"; だとしたら、書き換わるのが「ソース上の文字」になっちゃいません? 実際には、一般保護例外が発生します。後ろの文字が"const"(書き換えられない)になっているためです。 さっき#1さんが書いた通りです。 もしも、 char buffer[256]; char *p=buffer; strcpy(buffer,"waaaa"); これなら、OKです。 "waaaa"はCONSTですが、それをbufferにコピーしているからです。 bufferはCONSTではないので、書き換えができるという具合! なので、 buffer[0]='A'; これで出力すれば画面には、 "Aaaaa"と、"w"が書き換えられて表示できますよ! char abc[]="waaaa";との違いは、このように書くと長さが、 "waaaa"の長さまでになるということで、私が書いたようにbufferの256文字まで なら、再度strcpy(...)などで、再代入して使えるだけのメリットです。 なお、文字には最後に"\0"=文字コード0が入っており、 見た目の長さ+1バイトが確保されてますので、そこもご注意を! なお、こうやって「長さをプログラマーが書いている」時代の書き方は 簡単にバッファオーバーフロー(指定の長さ以上をアクセスしてしまいやすい) ことから、今はあまりお勧めできる書き方ではなくなってますが、 ポインタの勉強の時は、逆にわかりやすいかもしれません。
その他の回答 (4)
- AsarKingChang
- ベストアンサー率46% (3467/7474)
ごめ・・・ char *p=buffer; ↑これを使うのを忘れた^^ これは、char *p = (char *)&buffer[0]; と同じで、 bufferの先頭の位置の「アドレス」をpに入れろ! なので、 (*p)='Z'; ならbuffer[0]='Z';と同じです。(最初のポインタ移動前) なのですが、pはポインタなので、 p++; これで、ポインタがbuffer[1]を指します。 なのでその後の(*p)='A'は、buffer[1]='A'と同等。 という感じで、オフセット位置が動かせます。 おまけですがp[0]=でも、同じことができちゃいますが。 pそのものが動かせるので、使う場合は、今いる位置に注意です。 そのうちなれてくれば・・・ ポインタの場所を格納しておくポインタ。。 なんて、具合が悪くなるソースも出てくる日が来ますよ。。 char **p; <- (ポインタp)へのポインタです。 とか。。
お礼
回答ありがとうございます。
- asuncion
- ベストアンサー率33% (2127/6290)
>char buffer[256]; >char *p=buffer; >strcpy(buffer,"waaaa"); 2行目いらない。
お礼
回答ありがとうございます。
- AsarKingChang
- ベストアンサー率46% (3467/7474)
char* str = "Hello"; ←ここでエラー ~~~~~~~ ~~~~~~ 前半がchar *型で 後半がconst char *型ですよね。 なので、型が違うと言ってます。
お礼
回答ありがとうございます。 この初期化の仕方で、実行をする方法はあるのでしょうか? ""を使ってポインタがさす文字列を変更できるとあるのですが。
- f272
- ベストアンサー率46% (8625/18445)
普通は初期化するときは配列に代入する。 char str_array[] = "Hello"; char *str = str_array;
お礼
回答ありがとうございます。 この章の例題がおかしいのかもわかりませんが、 この初期化の仕方で実行することは不可能なのでしょうか? というかここの例題は使わないのですかね。
お礼
回答ありがとうございます。