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

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

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

C++11は2011年に容認されたC++のISO標準です。以前のC++03に代わるもので、中枢の言語の変更・修正、標準ライブラリの拡張・改善を加えたものです。

C

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

C++

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

Q&A

解決済

2回答

2112閲覧

ポインタの配列(C++/C)の基礎

yamato_user

総合スコア2321

C++11

C++11は2011年に容認されたC++のISO標準です。以前のC++03に代わるもので、中枢の言語の変更・修正、標準ライブラリの拡張・改善を加えたものです。

C

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

C++

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

0グッド

0クリップ

投稿2020/06/25 07:07

C++言語を勉強し始めたところです。

まずは、下記のプログラムを見てください。

C++

1int main() { 2 char char_array[10]; 3 char* char_array_pointer; 4 char_array_pointer = char_array; 5 printf("%p \n", char_array); 6 for (int i = 0; i < 10; i++) { 7 char_array[i] = i; 8 printf("=========== \n"); 9 printf("a[%d] ポインタ:%p 値:%d 値:%d \n", i, char_array + i, char_array[i],*(char_array + i)); 10 // 配列のアドレスが入ったpointerは下記のようにすることでアクセス可能 11 printf("a[%d] ポインタ:%p 値:%d 値:%d \n", i, char_array_pointer + i, char_array_pointer[i], *(char_array_pointer + i)); 12 } 13} 14 15>> 出力 160137FC34 17=========== 18a[0] ポインタ:0137FC34 値:0 値:0 19a[0] ポインタ:0137FC34 値:0 値:0 20=========== 21a[1] ポインタ:0137FC35 値:1 値:1 22a[1] ポインタ:0137FC35 値:1 値:1 23以下略

質問は下記3点です。

  1. 「char_array[10]」には、アドレスが入っているとサイトや参考書などに記載がありましたが、それなら「*(char_array + i)」で要素の値を参照できることはわかりますが、「char_array[i]」でも要素を参照できるのはなぜでしょうか?自分のイメージだと、「char_array[i]」は、アドレスが出力されると思っていました。
  2. 「* char_array_pointer」のような配列の使い方を紹介しているサイトや参考書が多くありますが、使い道がわかりません。「char_array[10]」だけで要素の値にもアドレスにもアクセスできるので、「* char_array_pointer」のようにポインタ配列(?)を使用するメリットがわかりません。
  3. そもそも、このプログラムに限らず、ポインタの使い道がわかりません。具体例を用いて、役立つ場面を教えてほしいです。*もともとPythonエンジニアです。

以上よろしくお願いいたします。

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

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

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

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

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

guest

回答2

0

回答します。

  1. 構文糖(syntax sugar)です。

  2. 配列ではなくポインタを使うと脳汁がでるシチュエーションがあるのです。配列の概念とポインタの概念は基本的に違うものですが、共通する部分も多いのでそこは初心者を混乱させるかもしれません。ポインタというのは、アセンブリ言語におけるアドレスの概念に型の概念を付加したものです。ポインタというものは低レベルな表現なのです。

例えばこの初期化コードを考えます。

C++

1int a[100]; 2for (int i = 0; i < 100; ++i) a[i] = 0;

これは、このように書くと無駄な演算を省略できるので多少高速になります。

C++

1int a[100]; 2int *pe = a + 100; 3for (int *p = a; p < pe; ++p) *p = 0;
  1. C/C++の配列は固定長であり、あまり大きなサイズを確保することができません。C/C++で可変長で大きなサイズのメモリを確保するにはmallocかnewを用います。このときにポインタが必要となります。このときa[n]という表現よりも*(a + n)のほうが簡潔で汎用的であることに気づくと思います。

投稿2020/06/25 07:47

anndonut

総合スコア667

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

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

0

ベストアンサー

「*(char_array + i)」で要素の値を参照できることはわかりますが、「char_array[i]」でも要素を参照できるのはなぜでしょうか?

char_array[i]*(char_array + i)の略記法で、意味は全く同じです(ほぼ意味はないですが、i[char_array]とも書けます)。

「* char_array_pointer」のような配列の使い方

* char_array_pointerは、char_array_pointer[0]と全く同じ意味です。表記が違うだけで、やっていることは何も変わりません

そもそも、このプログラムに限らず、ポインタの使い道がわかりません。

C++では、生のポインタは使わないほうがいいです。参照やSTLなど、代替手段も豊富です。

投稿2020/06/25 07:15

maisumakun

総合スコア146018

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

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

maisumakun

2020/06/25 07:16

一部の例外を除き、配列を式中に書くと、それは「配列の先頭アドレスを指すポインタ」として解釈されます。
yamato_user

2020/06/25 07:23

類似の質問もさせていただきたいです。 下記は参照渡しの関数だと思いますが、自分のイメージだと「*x=1」としないと変更できないと思っていましたが、これは処理が通ります。なぜでしょうか? void func2(int& x) { x = 1; } 現に、下記のような場合は最終行でコンパイルエラーが起きます。 「*pointer = 1;」とすれば処理は通ります。 int x = 100; int* pointer; pointer = &x; pointer = 1;
anndonut

2020/06/25 07:23

> C++では、生のポインタは使わないほうがいいです。参照やSTLなど、代替手段も豊富です。 これは人によるかもですね。ポインタは確かに問題も多いですが古くから使われているものなのでコードの定石が決まっており、ポインタを正しく運用すれば読みやすくなるでしょう。私は関数の引数にむやみにconstと記述するほうが害悪が大きいと思っていますし、洗練された文法はコンパイラに負荷をかけるのでできるだけポインタの定石を掴んでいったほうがいいのではないかと思います。
maisumakun

2020/06/25 07:25

> これは処理が通ります。なぜでしょうか? 参照はそういうものです。*xはポインタに対して行う操作です。
ozwk

2020/06/25 07:27

紛らわしいんですが、 上のコードの&と 下のコードの&の意味が全く違います
yamato_user

2020/06/25 07:29

なるほど。何となく頭の中整理できました。皆様ありがとうございます。
yumetodo

2020/06/26 10:58

> これは処理が通ります。なぜでしょうか? 今更ですがせっかく回答依頼が来てたので補足しておくと、参照とは別名をつける機能といえます。 --- 配列とはメモリーを確保する機能でしかなく、それに対する操作はすべてポインタを介して行われていることを意識してみてください。 Re:Cのポインタと配列の関係について考察してみる - Qiita https://qiita.com/yumetodo/items/2e4a1daac5e4e46b99ef
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問