🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
参照

参照は、プログラミングにおいて変数や関数といったメモリ空間上での所在を指示するデータのことを指します。その中にはデータ自体は含まれず、他の場所にある情報を間接的に指示するプログラムです。

関数

関数(ファンクション・メソッド・サブルーチンとも呼ばれる)は、はプログラムのコードの一部であり、ある特定のタスクを処理するように設計されたものです。

C++

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

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

Q&A

解決済

2回答

1539閲覧

配列の表記vectorと[]の違い

kinnobitou

総合スコア2

参照

参照は、プログラミングにおいて変数や関数といったメモリ空間上での所在を指示するデータのことを指します。その中にはデータ自体は含まれず、他の場所にある情報を間接的に指示するプログラムです。

関数

関数(ファンクション・メソッド・サブルーチンとも呼ばれる)は、はプログラムのコードの一部であり、ある特定のタスクを処理するように設計されたものです。

C++

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

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

0グッド

0クリップ

投稿2021/02/22 15:23

前提・実現したいこと

投げた配列を整頓してくれる関数(sort関数のようなもの)を教科書を見ながら作っています。教科書では配列がint A[]の形で表記されていました。一番上に記したコードで、関数に投げる配列は参照になっていません。
しかし後にvectorで配列を宣言して同様の関数を作ってみたところ、参照にしないと投げた関数は並び替えた形にはなりませんでした。

本来参照にしないと関数に投げた値は変化しないままだと思うのですが、なぜint A[]の配列は参照せずとも中身の配列が入れ替わったのでしょうか?

該当のソースコード

C++

1void bubbleSort(int A[]){ 2 //配列を並び替える操作 3} 4 5int main(){ 6 int A[5] = {5,4,2,1,3}; 7 bubbleSort(A); 8//配列を全て出力{1,2,3,4,5} 9 10return 0; 11}

C++

1void bubbleSort(vector<int> &A){ 2 //配列を並び替える操作 3} 4 5int main(){ 6 vector<int> A(5); 7 A = {5,4,2,1,3}; 8 bubbleSort(A); 9//配列を全て出力{1,2,3,4,5} 10 11return 0; 12}

C++

1void bubbleSort(vector<int> A){ 2 //配列を並び替える操作 3} 4 5int main(){ 6 vector<int> A(5); 7 A = {5,4,2,1,3}; 8 bubbleSort(A); 9//配列を全て出力{5,4,2,1,3} 10 11return 0; 12}

試したこと

int A[]に参照&を付けて実行してみましたが、int A[]に参照は付けられないようでエラーになりました。

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

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

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

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

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

guest

回答2

0

配列に関する特別なルールです。

  • 式の中に現れる配列は (一部の例外を除いて) その配列の先頭要素を指すポインタに暗黙に型変換されます。
  • 関数の仮引数に現れる配列形式の宣言はポインタに読み替えられます。

つまり、質問のコードは

cpp

1void bubbleSort(int* A){ 2 //配列を並び替える操作 3} 4 5int main(){ 6 int A[5] = {5,4,2,1,3}; 7 bubbleSort(&A[0]); 8//配列を全て出力{1,2,3,4,5} 9 10return 0; 11}

と書いたのと全く同じとみなされます。

一見して配列をやりとりしているかのように見えますが、実際にはポインタのやりとりに過ぎず、配列の内容は共有しています。

投稿2021/02/23 05:39

SaitoAtsushi

総合スコア5684

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

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

kinnobitou

2021/02/23 07:34

"配列は先頭要素を指すポインタに暗黙に型変換されます。" 普通の変数と配列の変数では扱われ方が少し異なるのですね。納得できました。
guest

0

ベストアンサー

void bubbleSort(int A[]) で受け取る変数Aは配列の先頭要素へのポインタになります。
そのため、関数内の配列に対する変更は、呼び出し元にも反映されます。

配列とポインタの奇妙な関係 - 苦しんで覚えるC言語

C++ なら生の配列を使う機会はあまりなく、基本的に std::vector を使っておけばよいので、関数内で変更を反映させたい場合は参照渡しにするとよいでしょう。

投稿2021/02/22 16:05

編集2021/02/22 16:09
tiitoi

総合スコア21956

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

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

kinnobitou

2021/02/23 07:26

リンク先の記事と併せて読み、納得できました。関数にint A[]を投げたときは値がコピーされているのではなく直接その配列の先頭の要素のアドレスが投げられているのですね。だから関数内で投げられた配列と同じメモリ領域に操作が行われると。 vectorと[]には単なる表記の違い以上に大きな違いがあるとわかりました。深夜にも関わらず回答していただきありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問