ショボ短歌会

#include <iostream> #include <string>int main() { std::string str = "abcdef"; std::size_t i = 1; std::cout <<str[i] <<std::endl; std::cout <<&str[i] <<std::endl; return 0; } において、 std::cout <<&str[i] <<std::endl;の&str[i] はアドレスを扱うと思っていたのですが、Cでは&str[i] はアドレスを扱うのにC++では&str[i] はアドレスではなく文字や文字列を扱うのでしょうか? ちなみに、Cのように以下のプログラムのようにC++で一文字だけ扱うように書くにはどう書けばいいのでしょうか? char* p, * q; int ch; ch = *q; また、こちらのプログラムは実行してもエラーが起きるのですが、何が原因なのでしょうか? #include <iostream>#include <string>int main() { std::string str = "abcdef"; std::size_t i = 1; std::cout <<*(str + i) <<std::endl; std::cout <<(str + i) <<std::endl; std::cout <<&*(str + i) <<std::endl; return 0; } ちなみに、 std::cout <<*(str + i) <<std::endl; は文字列の先頭のアドレスを+1したメモリにある数値(文字コード)を文字として表示する。 std::cout <<(str + i) <<std::endl; は文字列の先頭のアドレスを+1したメモリのアドレスを表示する。 std::cout <<&*(str + i) <<std::endl; は文字列の先頭のアドレスを+1したメモリのアドレスを表示する。 だと思っているのですが、CとC++では同じ書き方でも扱い方が違うので自信はありません。違う場合は正しい答えを教えてください。

A 回答 (3件)

とりあえず、いわゆる C文字列(C++でもそのまま使える)と、std::string は、別物です。


C文字列は、Cの時代に文字列を直接扱う方法がなかったので、char のポインタを経由して「文字列もどき」にしたものですし、std::string は、ちゃんとした文字列です(で、おまけとして、C文字列風に使う機能もあります)

あと、
> 実行してもエラーが起きるのですが
という質問をする場合には、エラーの内容は明示しましょう。
    • good
    • 0

>Cでは --------- 扱うのにC++では ------- 扱うのでしょうか?


例外はあるかもしれませんが、
 Cとして解釈できるC++の記載は、Cの記載と等しい意味である
と理解してよいと思いますよ。
    • good
    • 0

&str[1]は1以降の全ての文字列


Cでも同じ

アドレスが見たいなら
printfで%pとしてフォーマットを合わせてあげないとアドレスは見れませんよ
    • good
    • 2

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!