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

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

新規登録して質問してみよう
ただいま回答率
85.48%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

3回答

1996閲覧

CとC++での&str[i]の使い方について。

carnage0216

総合スコア194

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

1クリップ

投稿2021/07/29 07:35

編集2021/07/29 07:43
#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; }

気になる質問をクリップする

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

fana

2021/07/29 08:03

Hey, stop it! Don't open the door to C++ yet. No one can use std::string without understanding "char", "array of char", "pointer", and other basics of C. This is really serious advice!!
maisumakun

2021/07/29 08:08

> こちらのプログラムは実行してもエラーが起きるのですが そもそも、コンパイルに成功するのですか? (paiza.ioに投げてみたらコンパイルに失敗しましたので、「実行してのエラー」を確認することはできませんでした)
episteme

2021/07/29 08:09

> こちらのプログラムは実行してもエラーが起きるのですが、何が原因なのでしょうか? コンパイルすら失敗します。実行できません。
guest

回答3

0

&はアドレス、*は中身、[]は添字、{}は配列、""は文字列、

投稿2021/07/29 11:44

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

episteme

2021/07/29 12:44

質問に答えていない。低評価。
guest

0

質問に質問で返して申し訳ないのですが:

C++

1#include <iostream> 2#include <string> 3int main() 4{ 5 { 6 std::cout << "--- C-str" << std::endl; 7 char str[] = "abcdef"; 8 std::size_t i = 1; 9 std::cout << str[i] << std::endl; 10 std::cout << &str[i] << std::endl; 11 } 12 { 13 std::cout << "--- std::string" << std::endl; 14 std::string str = "abcdef"; 15 std::size_t i = 1; 16 std::cout << str[i] << std::endl; 17 std::cout << &str[i] << std::endl; 18 } 19 return 0; 20}

実行結果:

--- C-str b bcdef --- std::string b bcdef

char[] と std::string で同じ結果となりました。

std::cout << &str[i] << std::endl;の&str[i] はアドレスを扱うと思っていたのですが、Cでは&str[i] はアドレスを扱うのにC++では&str[i] はアドレスではなく文字や文字列を扱うのでしょうか?

この質問は何を根拠に発せられたのでしょうか?

投稿2021/07/29 07:47

episteme

総合スコア16614

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

carnage0216

2021/07/29 10:08

#include <stdio.h> int main(void){ // Your code here! char str[5]={"abcde"}; int i; for(i = 0; i < 1; i++){ printf("%c\n", str[i]); printf("%c\n", *(str + i)); printf("0p%x\n", &str[i]); printf("0p%x\n", str + i); printf("0p%x\n", &*(str + i)); } } のprintf("0p%x\n", &str[i]);の実行結果は0x7ffc155edf10でした。 しかし、std::cout << &str[i] << std::endl;の実行結果はbcdefでした。やはりCとC++では&str[i]の使い方が異なるようです。
episteme

2021/07/29 13:50 編集

> やはりCとC++では&str[i]の使い方が異なるようです。 そのとおり。違って当然です。 # というか、この違いは printf と cout << の違いです。
carnage0216

2021/07/29 22:02

では、std::cout << &str[i] << std::endl;のどこを書き換えればアドレスを表示するのでしょうか?
carnage0216

2021/07/29 22:20

また、エラーが出るプログラムはなぜエラーが出るのでしょうか?簡単に説明していただけるとありがたいです。 また、正しいプログラムを教えて下さい。
kazuma-s

2021/07/29 22:25 編集

std::cout << (void*)&str[i] << std::endl; > こちらのプログラムは実行してもエラーが起きるのですが コンパイルエラーになるのに、なぜ実行できるのですか? エラーが出るとは、具体的にどうなるのですか? エラーメッセージは出ますか?
episteme

2021/07/29 23:06

> std::cout << &str[i] << std::endl;のどこを書き換えればアドレスを表示するのでしょうか? &str[i] を void* にキャストします。
episteme

2021/07/29 23:12

> エラーが出るプログラムはなぜエラーが出るのでしょうか? std::string に size_t を足す演算は定義されていないから。 > 正しいプログラムを教えて下さい。 どんな出力を期待しているかが示されていないので教えようがありません。
guest

0

また、こちらのプログラムは実行してもエラーが起きるのですが、何が原因なのでしょうか?

なにを出力してるのか説明できますか。

投稿2021/07/29 07:40

y_waiwai

総合スコア87782

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

carnage0216

2021/07/29 07:48

std::cout << *(str + i) << std::endl; は文字列の先頭のアドレスを+1したメモリにある数値(文字コード)を文字として表示する。 std::cout << (str + i) << std::endl; は文字列の先頭のアドレスを+1したメモリのアドレスを表示する。 std::cout << &*(str + i) << std::endl; は文字列の先頭のアドレスを+1したメモリのアドレスを表示する。 だと思います。
y_waiwai

2021/07/29 07:55

str はstring型です。アドレスってわけではないので、+1できません
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問