ポエム
ゴミ記事
いかがでしたか
3
どのような問題がありますか?

この記事は最終更新日から3年以上が経過しています。

投稿日

更新日

一言で説明する参照渡し

参照渡しは参照で渡すこと!
(pass by reference)
参照を渡すことじゃない!
(pass reference)

手渡しは手で渡すこと!
手を渡すな怖い!

詳しくはこの下の方に並んでいるであろう関連記事で。

いかがでしたか?

ユーザー登録して、Qiitaをもっと便利に使ってみませんか。
  1. あなたにマッチした記事をお届けします
    ユーザーやタグをフォローすることで、あなたが興味を持つ技術分野の情報をまとめてキャッチアップできます
  2. 便利な情報をあとで効率的に読み返せます
    気に入った記事を「ストック」することで、あとからすぐに検索できます
ユーザー登録ログイン
Zuishin
叩かれて鍛えられた鉄は鋼になる。 叩かれて崩れた豆腐はゴミになる。 豆腐はどんなに憧れても鋼にはなれない。
この記事は以下の記事からリンクされています

コメント

サービス利用規約に基づき、このコメントは削除されました。
(編集済み)

1
サービス利用規約に基づき、このコメントは削除されました。

普通にいじめていいかどうか聞いているところです。

0

@sgimo

0
サービス利用規約に基づき、このコメントは削除されました。
サービス利用規約に基づき、このコメントは削除されました。
サービス利用規約に基づき、このコメントは削除されました。
(編集済み)

手 = 変数 であるならば、
手に持っているもの(変数の値)を渡すこと = 値渡し
手そのもの(変数への参照)を渡すこと = 参照渡し
です。
呼び出し先に手(変数)を渡して、呼び出し先で手の上にもの(値)を乗せて(代入して)返すことができます。

C++の場合
#include <iostream>

void sub(int c, int &d)
{
        std::cout << "before c=" << c << std::endl;
        std::cout << "before d=" << d << std::endl;
        c = 3;  // cは値渡し
        d = 4;  // dは参照渡し
        std::cout << "after c=" << c << std::endl;
        std::cout << "after d=" << d << std::endl;
}

int main()
{
        int a = 1;
        int b = 2;
        std::cout << "before a=" << a << std::endl;
        std::cout << "before b=" << b << std::endl;
        sub(a, b);  // aは値渡し、bは参照渡し
        std::cout << "after a=" << a << std::endl;
        std::cout << "after b=" << b << std::endl;  // 参照渡ししたbの値に注目
}
実行結果
before a=1
before b=2
before c=1
before d=2
after c=3
after d=4
after a=1
after b=4

PHPの場合の図解はこちら

情報処理試験問題参考例

参照渡しできる言語: C++, C#, PHP, VisualBasic, FORTRAN, etc.
参照渡しできない言語: C, Java, JavaScript, Python, Ruby, etc.

0
(編集済み)

@shiracamus

この記事は、参照型を使用することを参照渡しと呼ぶ人たちへのアンチテーゼです。

参照渡しは参照を介して変数そのものを渡すものであり、言語上、値を参照する値を参照と称して渡すものではありません。
つまり、値を渡す話はここではしていません。

0
(編集済み)

この記事は、参照型を使用することを参照渡しと呼ぶ人たちへのアンチテーゼです。

記事のどこにも書いてないので私にはわかりませんでした。

参照渡しは参照を介して変数そのものを渡すものであり、

変数を手に例えたとしたら、変数そのものを渡す=手そのものを渡す ということになり、

手を渡すな怖い!

手を渡しているのに 怖い! というのは変ではないか? と思った次第です。

0
(編集済み)

記事のどこにも書いてないので私にはわかりませんでした。

そうですね。
参照渡しという言葉をどうしても参照型を使うことの意味で使いたい人がいて、その人に「自分で記事を書け」と言われたから書いただけのいい加減なもので、事情を知らない人には通じないのでゴミ記事タグをつけています。

同時に、Qiita ではゴミ記事というタグをつけたら何を書いてもいいということを主張する人が当時何人もいました。

変数を手に例えたとしたら

変数でも値でもなく「参照」を手に例えています。
参照値を使用するのではなく、参照を使って呼び出すので pass by reference だという主張です。
参照を渡すのであれば pass reference となるでしょう。

0

変数でも値でもなく「参照」を手に例えています。
参照値を使用するのではなく、参照を使って呼び出すので pass by reference だという主張です。

「参照」とは、参照値のことではなく、「変数への参照」ですよね?
変数への参照を使って呼び出し先でも同じ変数にアクセスできます。変数共有します。
つまり、変数そのものを渡したのと同じことになると思うのですが、そこの認識が違いますか?
変数への参照=変数そのもの であり、参照=手 ということであれば 手そのものを渡すのと同じだと思うのですが、違いますか?

0

変数への参照=変数そのもの であり、参照=手 ということであれば 手そのものを渡すのと同じだと思うのですが、違いますか?

参照は参照で、変数は変数ですね。
コードの中で参照値を扱うことはできません。
なので、手を受けとることもできません。

0
(編集済み)

変数に値を代入する = 手にものを乗せる
という例えは通じますか?

C++
#include <iostream>

void sub(int &b)
{
        b = 2;
}

int main()
{
        int a = 1;
        sub(a);  // 変数aを参照渡し、手(変数)を渡してもの(値)を乗せて返してもらう
        std::cout << "a=" << a << std::endl;
}
実行結果
a=2

で、渡した手(変数a)にもの(2という値)を乗せて返ってくる、という例えは通じないですかね?

0
(編集済み)

私は「手」をその意味では使っていないので、伝わるかどうかはここではさほど関係ないのではないかと。

例えは必ずしもどの角度から見ても例えられるものと一致するものではないので、多くの場合、例えをその文脈外の視点から深掘りする価値はありません。

ここで言っているのはただ一つ。参照渡しは「参照」なる値を渡しているわけではないので、参照型と混同しないようにということで、その傍証として by について言及しています。

「手渡し」の例を出したのは、「手渡し」という言葉もあるように、「○○渡し」が必ずしも○○を渡すこととは限らない、なのになぜ参照渡しは参照を渡すことと思い込んでしまうのか、くらいの意図です。

0

そうですか。
何が by で手渡しの例がどれと繋がるのか良く分からないままで残念ですが、これで終わりにします。

0
(編集済み)

by というのは、「~を」ではなく「~で」という意味だから、参照「を」渡すのではなく、参照「で」渡すのだという意味です。

pass salt by hand であれば、塩「を」手「で」渡すという意味になります。
この場合、手を渡してはいけません。

0
(編集済み)

「何への」参照なのかが明記されないので混乱する人が多いように思います。

  • pass by value は「変数の値 渡す」
  • pass by reference は「変数への参照 渡す」
  • pass reference は「変数の値であるオブジェクトへの参照 渡す」

ということでよろしいですか?
奇妙な日本語に思えますけど。

0

翻訳が奇妙な日本語になることなどいくらでもあると思いますが、pass by reference の元ネタは C++ の標準規格の目次です。引き渡されるのは引数で、これを値で渡すか参照で渡すかという話になります。

0
(編集済み)

引き渡されるのは引数で、これを値で渡すか参照で渡すかという話になります。

実引数への参照を渡すのですよね?
参照渡しのとき、実引数には変数を指定する必要がありますよね? 直値を指定したらエラーになりますよね?
仮引数は実引数を参照して、実引数の値を参照したり実引数に代入したりしますよね?

0
(編集済み)

言語上の用語なので、実装は無関係です。

値のコピーを渡す参照渡しもありますし、参照を渡す値渡しもあります。
たとえば Python は必ず参照を渡しますが、ドキュメントで値渡しであると明言されています。

参照を渡すのが参照渡しであれば、Python は参照渡しになりますし、実際そのように教えるスクールもありますが、事実は違います。

0
(編集済み)

参照を渡すのが参照渡しであれば、Python は参照渡しになりますし、実際そのように教えるスクールもありますが、事実は違います。

そのスクールの教え方は間違っていますね。情報処理試験では不正解を選ぶことになると思います。

変数を引数に渡す方法には以下の4種類があると思っています。

  1. 値型変数の値渡し
  2. 値型変数の参照渡し
  3. 参照型変数の値渡し
  4. 参照型変数の参照渡し

C++, C#, PHP は すべてできます。
C, Java は 1 と 3 しかできません。
Python は 3 しかできません。

Pythonの値はすべてオブジェクトで、変数はオブジェクトへの参照を値として保持する参照型変数であり、オブジェクトへの参照を渡すこと(3.) と 参照渡し(2.と4.) はまったく違うことを、スクールでは教えないのでしょうね。

0

同様に、実装内部では値のコピーを渡し、関数終了時に元の変数に値を書き戻すことで参照渡しを実現しているものもあります。

この場合は呼び出した先の関数に参照値は渡っていませんが、参照渡しになります。

この記事で言っているのは、「参照渡しは参照を渡すことではない」ということですが、それがどういうことなのかを伝わるように書いていません。他のところで書いているのと、目的がそれを伝えることではないからです。

0
(編集済み)

Wikipedia(正しいとは限らない)によると、変数渡しの実装手段の一つとして変数への参照を渡す方法と書かれています。
コピーを渡してコピーを書き戻す実装には別の名前があったりしませんかね?

参照渡し(さんしょうわたし、call by reference)はその実装手段の一つ(と見ることもできる[5])。変数に対する参照(アドレス情報)を渡す方法である(これは言語側が勝手に行う。C言語のように明示的にアドレス演算子を使うものは参照渡しとは呼ばない)。

0

いいえ。前にも書きましたが、参照渡しは言語上の用語で、その実装は無関係です。

0
(編集済み)

コピーを渡してコピーを書き戻す実装には別の名前があったりしませんかね?

参照渡しの実装の一つとして、実装に付けられた別の名前「も」あります。

0

@shiracamus
こいつの話は信じないほうがいいぞ
こいつはいろんな記事で的はずれな説教して場をあらそうとするエセエンジニアだからな
実態はただのニートや

0
(編集済み)

いいえ。前にも書きましたが、参照渡しは言語上の用語で、その実装は無関係です。

ここに認識の違いがあるんですかね。
参照渡し(変数渡し)は言語に依存しない情報処理用語で、言語によって参照渡しをサポートするかしないかが異なる、というのが私の認識です。

参照渡しできる言語: C++, C#, PHP, VisualBasic, FORTRAN, etc.
参照渡しできない言語: C, Java, JavaScript, Python, Ruby, etc.

0

全部言語じゃないですか。

0

参照を渡さない参照渡しがあることは示したので、自分で裏をとってみてください。信頼できる情報を簡単にみつけることができると思います。

0
(編集済み)

サポートするかどうかが言語によって違うということを書きました。
情報処理試験では言語を特定せずに出題されています。情報処理用語とその作用を理解しているかが問われています。
出題例: https://kanauka.com/kakomon/ap/h25h/020.html

0
(編集済み)

繰り返しになりますが、参照渡しは言語レベル、つまりコンパイル前のソースコードレベルの話ということを言っています。
実装がどうなっていても、参照渡しは参照渡しです。

変数の実装がメモリだろうがレジスタだろうがディスクだろうが、変数は言語レベルの話なので無関係というのと同じです。

これも繰り返しになりますが、参照を渡さない参照渡しは実在していて、簡単に裏をとることが可能です。

信じる信じないではなく、相手が何を言っているかを理解し、自分で裏を取りましょう。でなきゃそこで遠吠えしてる素人と同レベルですよ。

0
(編集済み)

ソースレベルの話: 言語に依存しないソースレベルでの話ということであれば同意です。情報処理試験でもソースコードが提示されますので。
コンパイル前: PHPのようなコンパイルしない言語でも参照渡しできます。PHP言語仕様では参照渡しではなく変数参照と書いてあるようですけれど。
実装は無関係: 同意。情報処理用語なので。Wikipediaには実装の手段名として書かれていますけど。

0
(編集済み)

コンパイルしなくて良い言語なら、それはコンパイル前です。コンパイル後ではありません。伝わらないので角度を変えてコンパイルという言葉を使いましたが、本質はコンパイルにはありません。

0

コンパイルするかしないかに関係なくソースレベルでの話、でいいのではありませんか?

0
(編集済み)
  • 参照渡し=呼出し元の変数(実引数)と呼出し先の変数(仮引数)を同一の変数として共有する(変数渡し、変数共有、変数エイリアス)
  • 呼出し先で変数(引数)に再代入すれば、(実装はどうであれ)呼出し元の変数に代入される

という私の認識と同じでしょうか?

0
(編集済み)

コンパイルするかしないかに関係なくソースレベルでの話、でいいのではありませんか?

「言語」では伝わらなかったので別の言葉を使いました。
ソースコードはプログラミング言語で記述するので、言語レベルとソースコードレベルは同じ意味になります。
この場合の言語はマシン語でもなく日本語でもなくプログラミング言語を指しています。

という私の認識と同じでしょうか?

私もその認識です。参照渡しの場合、参照値をプログラマーが知る必要はなく、渡されるとも限りません。
従って「参照渡しは参照を渡すことではない」という結論になります。

0
(編集済み)

従って「参照渡しは参照を渡すことではない」という結論になります。

「参照」という言葉が「変数への参照」と「オブジェクトへの参照」の両方で使われるのが混乱の元ですね。

0
  1. 変数渡し=呼出し元の変数(実引数)と呼出し先の変数(仮引数)を同一の変数として共有する(変数共有、変数エイリアス)
  2. 参照渡し=呼出し元の変数(実引数)を呼出し先の変数(仮引数)から参照することで同一の変数として共有する(変数渡しの実装手段、変数共有、変数エイリアス)
  3. 呼出し先で変数(引数)に再代入すれば、(実装はどうであれ)呼出し元の変数に代入される

とすると、2. の部分で反論がある感じですかね?

0

広義と狭義を混ぜる必要はないと思います。

0
  • 広義: 変数渡し = 参照渡し
  • 狭義: 変数渡し ⊃ 参照渡し

ということでしょうか?

0
(編集済み)

Wikipediaの「引数」では以下のような説明構成になっているので、変数渡し ⊃ 参照渡し というのが一般認識に思えます。

引数
├ 値渡し
│ ├ 値渡し
│ └ ポインタ渡し
└ 変数渡し
  ├ 変数渡し
  ├ 参照渡し
  └ その他
    ├ コピー渡し・コピー戻し
    └ インデックス渡し
0

言語によっては、参照渡し以外に変数渡しがないので参照渡しと変数渡しは同じものとなります。
そしてその Wikipedia の分類は標準化されているわけでもなく、ただの一説にすぎません。
なので、どのような分類を採択するかによって用語は変わってきます。
コピーによる参照渡しをを参照渡しと呼んでいる事実を覆すものではありません。

事実 Wikipedia でも、

と見ることもできる

のように異論を認めています。
更によく読めばわかりますが、その分類は排他的なものではありません。
渡し方の種類を並べているだけです。

0
  1. 「変数渡し」のひとつに「参照渡し」がある: 変数渡し ⊃ 参照渡し
  2. 「変数渡し」を「参照渡し」でしかできない言語もある: 変数渡し = 参照渡し
  3. 「変数渡し」を「コピーを渡してコピーを書き戻す」実装もある: 変数渡し ≠ 参照渡し
  4. 「変数渡し(参照渡し等)」ができない言語もある

という認識でいいですか?
広義 と 狭義 の違いは何でしょうか?

0
(編集済み)

その前に、何が目的なのか聞かせてもらえますか?
読まない人に向けて同じことを何度も繰り返し書かなきゃいけないのにいい加減飽きてきたんだけど。

0
(編集済み)

自分の認識と何が違うのかを確認したいです。
広義 と 狭義 の違いを意識したことがないので知りたいです。

いまのところ、「参照渡し」という言葉を使った時点で「変数渡し=参照渡し」を暗黙知として会話が進んでいるんだろうということは分かってきました。
@Zushin さんの中では「参照渡し=変数渡し」で「コピーを渡してコピーを戻すのも参照渡し」と書かれていたのが私の認識と違っていたのが気になっていて、「コピーを渡してコピーを戻すのも変数渡し」と読み替えればいいのか、それとも違うのか確認したいです。

0

何のために確認するんでしょうか?

0
(編集済み)

中途半端な状態で気持ち悪いですから。
例えば、

広義と狭義を混ぜる必要はないと思います。

広義 と 狭義 が分からず、何と何が混ざっているのかわかりません。
@Zuishin さんの暗黙知を教えて欲しいです。

0

中途半端とは思えません。既に書いていることなので、読んで理解すれば良いと思います。

理解が足りないとおっしゃるようなので、言葉を変えてみましょうか。

C++ では参照渡しが言語の仕様で定義されています。
それはコンパイラがどのようなバイナリを吐き出そうとも、参照渡しです。

ここまでわかりますか?

0

分かります。

0

ならば、参照が渡らなくても、Wikipedia に何が書いてあろうと、それは依然として参照渡しであるということも当然わかりますよね?

0
(編集済み)

もし実装を変えたとしたなら、仕様書の表記も変わるのではないですか?
例えば pass a variable by copy and copy back とか。

0

いいえ、実装はたくさんあるので、いちいちそれに合わせて言語の方を変えたりしません。

たとえばコンパイルオプション一つで変数の実装が変わります。

0
(編集済み)

なるほど、そこに認識の相違があって話がかみ合わないのですね。
私としては、C++に限定した時点で違う世界になってしまいます。

0
(編集済み)

繰り返しになりますが、言語レベルの話を実装込みで理解しているから間違うんだと思いますよ。

C# でも、言語レベルで互換性があるなら、たとえどのように実装されていても参照渡しは参照渡しです。
他の言語もそうだと思います。

たとえ Wikipedia にどう書いてあろうとも。

0

さっきからタイムラインがこのことで埋まってますよ

0

https://qiita.com/terms
ほどほどにしたほうがいいと思いますよ。

0

だそうですよ。

0

報告...

0

https://qiita.com/terms
ほどほどにした方がいいと思いますよ。

0

もうやめましょう

0

どうぞ。

0
(編集済み)

パクりにパクりと言うのは社会的に不適切だという意味不明な理屈でブロックされた上に通報されました。

「盗人猛々しい」の実例をお探しの方があればどうぞ見てみてください。

0
(編集済み)

荒らしコメントがようやく消えましたが、「草」は問題ないんですね。
基準の一つがわかったことは収穫です。
「草」程度の人を小馬鹿にした表現は安心して使うことができます。

0

0
(編集済み)

早速生け贄が来たので、報告して経過を観察したいと思います。
なおこの被験者は不適切なコメントを削除された本人なので、その意味でも条件のいい被験者と言えるでしょう。

0

草すぎるw

0

削除された人二号も協力ご苦労。

0

削除してないんだよなあw
相変わらず妄想だけはすごいねw

0
(編集済み)

削除されてますが。
嫌な記憶は忘れたのかな?

ああそうか、自分で削除したから削除されてはないと。なるほどなるほど。

0

必死で草

0

そのワンと吠えてサッと隠れる戦法、なかなか便利そうですね。あなたの個性としてこれからも一生続けてください。

0

お前はずっと逃げ続けてるけどな
早くこっちにコメントしろよ敗北者さん笑
https://qiita.com/Zuishin/items/f271b52c41533e695606

0

削除されたっけ?覚えてねーや

0

そりゃあなたのコメントが削除されるのは日常だから。

0

ソースないの?

0

おーい、逃げてないで早くコメントしろよ負け組さん笑

0

そりゃ通知が飛んできた時点で「ああ俺何か書いたんだな、今は無いけど」ってわかるでしょ。賢い人なら。

0

通知来てないからねえ

0

結局ソースないんかい笑
都合悪くなるとすぐ逃げるな〜

0
(編集済み)

なるほどなるほど、通知は飛んできてないけど私のファンだから 2019 年の記事にコメントしたと。

0
(編集済み)

もしかして自主的に削除してるのと勘違いしてる?

サービス利用規約に基づき、このコメントは削除されました。

って出るから誰でもわかると思ってたが

0
(編集済み)

ワンと吠えてサッ作戦。
どうぞ続けてください。
二人? の個性として。
画像はいつかね。

0

会話が成り立ってないな

なおこの被験者は不適切なコメントを削除された本人なので、その意味でも条件のいい被験者と言えるでしょう。

これについて書いてんだけど

0

ずっと逃げ続けてるくせに何言ってんだか笑

0

キャンの方が良かった?

0

都合の悪いコメントは無視してて草

0

そもそも日常的に削除されるほどコメントしてないからねえ
君のコメント履歴は31ページあるけど、俺は2ページしかないし

0

ワンと吠えてサッ作戦、別にうまくもないし語呂も悪いのに、本人はうまいこと言えたと思ってるのか繰り返し使ってるのかわいい

0

悔しすぎて今頃部屋の隅っこで泣いてそう

0

荒らし専門アカウントのコメントが削除されまくってるのになぜアカウントは無事なのか前から不思議でしたが、今回キャンと鳴いてサッ作戦を知って謎が解けました。完全に無駄な知識ですけどね。

まあ作戦名も私の中では頭に「ま」のつくもっと露骨な名前で呼んでるんですが。

0

顔真っ赤でイライラで草

0
(編集済み)

削除されまくってるのソース待ってまーす
どの記事かとかすらも書けないの?

0

削除されまくってると思ってたら、本当はキャンと鳴いてサッ作戦だったと知ったと言ってるのに何を言ってるんだろうこの人は。時節柄、熱中症にはお気を付けください。

0
(編集済み)

キャンと鳴いてサッ作戦ってお前しか正確な内容理解してないから
サリーとアンの課題間違えてそう

0

ヒント
キャンと鳴いてサッと物陰に隠れる犬のことを俗に何と言う?
(「ま」から始まります)

0
(編集済み)

サービス利用規約に基づき、このコメントは削除されました。

って出るから誰でもわかると思ってたが

ああ本当にこれわかってなかったのね

0

いや、さすがに荒らしのプロと違って慣れてないので。

0
(編集済み)

おっ無知の開き直り、さすがっす

0
(編集済み)

荒らし方についてはあなたの方が詳しいようです。
さすが荒らし専門アカウントを作って、鳴いては隠れ鳴いては隠れするだけはある。

0
(編集済み)

サービス利用規約に基づき とあるんだから容易に推論可能ですけどね
この記事見るだけで十分

0

さすがにそんな情けない作戦を取る人がいるとは想像がつかなかったので、思い込みというやつですね。
しかも二人もいて、なぜかこの記事にはりついている。
偶然とは恐ろしいものです。

0

それが作戦という思い込みも捨てられるとよかったですね

0

息をするように普通にキャンキャン鳴いて隠れているのを作戦と呼ぶのは大げさでしたね。

0

思い出したけど、自分がここのコメント消したとき、あなたも合わせてコメント消してますよね。
でその時に気づけたはずです。

0

私のコメントは残ってますが?

0
(編集済み)

その後に何往復かしましたよね
覚えてないなら別にいいです

0
(編集済み)

あなたとのやり取りに頭使ってないので覚えてないけど、そこまで言うなら消したんでしょう。

自分で消すと跡形もなく消えるけど、削除されたら残るということを教えてくれてるわけですか?
なるほど、そのようですね。
さすが鳴いては消す人は詳しい。

それで、あなたが書いた荒らしコメントが残ってないのは、削除されたわけではないと。
よくわかりました。
自分で消したんですね。

あなたのアカウントが残っているのも、コメント数が少ないのも、納得です。

0

必死で草

0
(編集済み)

頭使ってないとか煽りつつ言い訳するのほんと見苦しからやめた方がいいよ。これは真面目なアドバイス。

1
(編集済み)

キャンサッが見苦しくないと思ってるようでびっくりです。

0
(編集済み)

あとその相手の別の問題点を指摘したら反論できると思ってるところも

1

キャンサッが見苦しくないと思ってる

ストローマン乙

0

発言するたびに恥晒してるの惨めで草

0
どのような問題がありますか?
あなたもコメントしてみませんか :)
ユーザー登録
すでにアカウントを持っている方はログイン
3
どのような問題がありますか?
ユーザー登録して、Qiitaをもっと便利に使ってみませんか

この機能を利用するにはログインする必要があります。ログインするとさらに下記の機能が使えます。

  1. ユーザーやタグのフォロー機能であなたにマッチした記事をお届け
  2. ストック機能で便利な情報を後から効率的に読み返せる
ユーザー登録ログイン
ストックするカテゴリー