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

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

新規登録して質問してみよう
ただいま回答率
85.50%
参照

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

ポインタ

ポインタはアドレスを用いてメモリに格納された値を"参照する"変数です。

Q&A

解決済

2回答

652閲覧

関数の参照渡しがわかりません

hidetoshimori

総合スコア12

参照

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

ポインタ

ポインタはアドレスを用いてメモリに格納された値を"参照する"変数です。

0グッド

0クリップ

投稿2019/09/11 15:35

前提・実現したいこと

下のソースコードの関数の参照渡しはどうなってるんですか?
調べると因数のint a[]はint *aと等しいとなっていたんですがどうゆうことかわかりません
int *aの場合わかっています

該当のソースコード

c++

1void h(int a[]){ 2cout<<a[0]<<endl; 3} 4int main(){ 5int a[]={1,2,3}; 6h(a); 7}

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

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

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

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

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

guest

回答2

0

ベストアンサー

関数の引数において、int a[]int *aが等しいとはそのままの意味です。単純にint *aに置き換えられて解釈されます。

関数宣言 - cppreference.com

引数リストのそれぞれの関数の引数の型は、以下のルールに従って決定されます。

  1. まず、型を決定するために、宣言の場合と同様に、 decl-specifier-seq と宣言子が組み合わされます。

2) 型が「T の配列」または「境界が未知な T の配列」の場合、それは「T へのポインタ」型に置き換えられます。
3) 型が関数型 F の場合、それは「F へのポインタ」型に置き換えられます。
4) トップレベルの cv 修飾子が引数の型から取り除かれます (この調節は関数の型にのみ影響しますが、引数の性質は変更しません。 int f(const int p, decltype(p)*);int f(int, const int*); は同じ関数を宣言します) 。

なお、これらは関数の引数の場合のみであることに注意して下さい。通常の宣言としてのint a[]境界が未知の配列という不完全型の一種になります。これはint *aのようなポインタと同じように配列を代入して各要素を参照することは可能ですが、細かい点で異なります(リンク先参照、CとC++でも細部で異なるようです)。

もう一つ。「参照渡し」はまったく別の機能を指します。質問のコードを参照渡しを使った物で書くと次のようになります。

C++

1#include <iostream> 2using namespace std; 3void h(int (&a)[3]) 4{ 5 cout << a[0] << endl; 6} 7int main() 8{ 9 int a[] = {1, 2, 3}; 10 h(a); 11}

上記とは違い、質問のコードは単なるポインタの「値渡し」です。これらを混同してはいけません。もし、ポインタの値渡しを参照渡しと言っている記事がありましたら、著者のレベルが低いですので、参考にしないことをお勧めします。

投稿2019/09/11 22:18

編集2019/09/11 22:20
raccy

総合スコア21733

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

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

0

試してみればわかりますが同じです。

C++

1#include <iostream> 2 3void f1(int a[]) 4{ 5 std::cout << __func__ << ":" << &a[0] << std::endl; 6} 7 8void f2(int *a) 9{ 10 std::cout << __func__ << ":" << &a[0] << std::endl; 11} 12 13int main() 14{ 15 int a[]={1,2,3}; 16 std::cout << __func__ << ":" << &a[0] << std::endl; 17 f1(a); 18 f2(a); 19}

result

1main:0x61ff04 2f1:0x61ff04 3f2:0x61ff04

結局はポインタが渡されるイメージです。関数の中でa[]を変更すればmain関数のa[]が変更されます。

投稿2019/09/11 15:55

nomuken

総合スコア1627

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問