C++、C#、PHP等には"call by reference"という機能があります。ですが、この"call by reference"ではない動作を「参照渡し」と言っている記事をまとめました。対象には表記揺れにすぎない「参照呼び」や「参照呼び出し」も含めています。
他にもある、とか、実は否定しているとかあればコメントや修正依頼をください。ただし、追記や脚注など目立たない形で「実はそうは言わない」などと補足があったり、コメント等でそのような指摘があっても、全ての読者がそこまで細かく見るとは限らないため、除外しません。つまり、厳密には違うとか、機能ではなく動作のことを言っているとか色々言い訳を付けていても、表面だけ読んでいると「『参照渡し』と言っても良い」と読み手が感じられそうであれば、対象としています。
"call by reference"な動作とは?
定義や詳しい動作の解説はここではしませんが、"call by reference"になっている場合、仮引数そのものへの代入には下記のような副作用が伴います。このような動作になるかどうかで"call by reference"であるかどうかを判断しています。
#include <iostream>
void f(int& x)
{
x = 1;
}
int main()
{
int a = 0;
f(a);
std::cout << a << std::endl; // 1
return 0;
}
記事一覧
以下の記事は"call by reference"ではない動作、ほとんどの場合は"call by value"の一種である"call by address"または"call by sharing"と言われている動作を「参照渡し」と言っています。なお、本来、このような評価戦略の話は関数へ実引数へ渡す時の動作のことを言います。しかし、関数へ実引数を渡すことは、言い換えると、仮引数に実引数を代入(assignment)する事でもあります。よって、通常の代入に対する解説でも、関数への仮引数への代入時と同等の動作の解説として考え、どの評価戦略になるのかを判断しています。
検索の関係上、記事は言語別で、C、JavaScript、Java、Python、Rubyに絞りました。これらの言語には"call by reference"の機能は存在しません。また、スタック・オーバーフローやteratail等のQAサイトは除外しています。
なお、ようなとか、正確ではないとか、言いながらも、結局頑なに「参照渡し」という言葉を使い続ける記事も含まれます。
C
- 「値渡し」と「参照渡し」の話 ポインタ渡しとは? - Qiita1
- 標準のマルチバイト関数を使って UTF-8 の文字列から1文字ずつ取り出す - Qiita
- C言語のポインタ基本 - Qiita
- 値渡しと参照渡しについて思いを馳せる - Qiita
- C言語における値渡しと参照渡し – Chomado – Madoka Chiyoda
- もう一度基礎からC言語 第27回 データ構造(6)~ポインタを使った引数の受け渡し 引数にポインタを使う意味
- C言語入門:関数へのポインタ渡しと値渡し:Geekなぺーじ
- [C言語]構造体を関数に参照渡しする · DQNEO起業日記
- 納得C言語 [第13回]ポインタ - ほぷしぃ
- 納得C言語 [第14回]構造体 - ほぷしぃ
- 独習C 第4版 (書籍のため目次のみで確認。独習C 新版とは異なる書籍であることに注意)
JavaScript
TypeScript等のAltJSを含みます。
- 40 代おっさん GASの関数(function文による関数の宣言)を学ぶ - Qiita
- Reactのstate hookに値を変更した配列を渡してもre-renderされなかった - Qiita
- 〈社内勉強会〉値渡しと参照渡しについて調べてみた - Qiita
- ちょっと高度なJavaScriptの話 - Qiita
- 【Javascript】値渡しと参照渡しについてあらためてまとめてみる - Qiita
- 【JS】いかがでしたか!?値渡しと参照渡しの使い分け!? - Qiita
- JavaScriptで配列を値渡しをする - Qiita
- Javascriptのオブジェクト入門 - Qiita
- C言語的にJavaScriptを使う - Qiita
- 「参照の値渡し」とかゆーのやめよーぜ - Qiita
- JavaScriptのコーディングポイント【ES5まで】 - Qiita
- javascriptで変数をコピーする方法 - Qiita
- Immutable.jsの高階関数の引数は参照を持っている - Qiita
- JavaScriptでobj["chino[0].cocoa.rize[2]"]みたいにしたメモ - Qiita
- JavaScript中級TIPS - Qiita
- オブジェクト、配列のコピー - Qiita
- JavaScriptで知っておいて損はないこと - Qiita
- Javascriptのオブジェクト入門 - Qiita
- JavaScriptで関数型プログラミングの入門 - Qiita
- javascript goodparts 第3章まとめ - Qiita
- javascript超基礎 - Qiita
- ディープコピーとシャローコピーについての備忘録 - Qiita
- javascript メソッド関連 - Qiita
- 【JavaScript入門】参照渡しの使い方(値渡し/オブジェクト) | 侍エンジニア塾ブログ(Samurai Blog) - プログラミング入門者向けサイト
- JavaScriptの参照渡しについて | JavaScript中級編 - ウェブプログラミングポータル
- JavaScript の配列やオブジェクトは参照渡しになる…バグを生む落とし穴 - Neo's World
- 知ってるようで意外と知らない、JavaScriptの参照のしくみ - WPJ
- No.3 値渡しと参照渡し « 株式会社ゼノフィ
- JavaScriptでプリミティブ型変数の参照渡し - s_hiiragiの活動メモ
- JavaScriptの関数に整数値を参照渡ししたい(無理やり配列にして解決……?) – Ewig Leere(Lab2)
- [JavaScript] 引数の値渡し、参照渡し - kwiki - アットウィキ
- プロパティ — Vue.js2
- JavaScriptで配列の値をコピーする | cly7796.net
- JavaScriptプログラミング講座【オブジェクトについて(Object)】
- JavaScriptのオブジェクトを扱うとき、=は値渡しではない - woshidan's loose leaf (修正版3)
- JavaScript Web開発パーフェクトマスター - 金城俊哉 - Google ブックス (書籍のためGoogle ブックス上で確認)
Java
8.4.1. Formal Parameters - Chapter 8. Classes - The Java® Language Specification Java SE 12 Edition より
When the method or constructor is invoked (§15.12), the values of the actual argument expressions initialize newly created parameter variables, each of the declared type, before execution of the body of the method or constructor.
- リスト編① 〜 参照渡し・addAllの理解 〜 - Qiita
- Java入門 値渡しと参照渡し - Qiita
- Java学習ノート_140711(クラスの基礎、オーバーロード、標準ライブラリの利用) - Qiita
- JAVA参照渡し(引数としてアドレスを渡す)-配列 - Qiita
- Javaにおける値渡しと参照渡し
- 値渡しと参照渡し | じっくり学ぶ Java講座 [初心者向け・入門]
- 参照渡し
- メソッド呼び出し元に値を引き渡す方法(値返却か、参照渡しか)(Java):技術空間
- 値渡しと参照渡しと矢切の渡し
- 【Java】値渡しの参照渡しの違い - ProMemoGram
- 値渡しと参照渡し | JavaのTipsとサンプル | C入門 Java入門 基本情報C対策講座のcClip
- いつまで経っても理解出来ない参照渡し・値渡しに終止符を【図解・Java】 | Web屋のいまさら人には聞けない話
- Java: 参照渡しの引数を使うメソッド - JAVA プログラミング 入門
Python
4.6. Defining Functions - 4. More Control Flow Tools — Python 3.7.3 documentation より
The actual parameters (arguments) to a function call are introduced in the local symbol table of the called function when it is called; thus, arguments are passed using call by value (where the value is always an object reference, not the value of the object).
- Python初心者の備忘録 #02 - Qiita
- selfでクラス変数にアクセスしようとするとどうなるのか? - Qiita
- Pythonで「Pythonの引数における参照渡しと値渡しについて」の動作を確認してみた - Qiita
- Pythonの引数はすべて参照渡し - Qiita
- pythonの参照について - Qiita
- Pythonの値渡しと参照渡し - Qiita
- 参照渡しと値渡し - Qiita
- ~Pythonistaより愛をこめて贈るPython入門者のためのTips②~ - Qiita
- Pythonのリストで参照渡しでないコピーを作成する話 - Qiita
- Pythonビギナーズガイド(関数編) - Qiita
- C言語の次のPython - Qiita
- 一発で分かるPythonのcopy - Qiita
- pythonの関数が、呼び出し元の引数に影響を与える時はいつか? - Qiita
- Pythonにおける値渡しと参照渡し - sushi.py
- Pythonの値渡しと参照渡し - amacbee's blog
- Pythonでは関数の引数は全て参照渡しされる | Pract
- NJF Wiki - xpwiki : Pythonでの値渡しと参照渡し [Python/値渡しと参照渡し]
- Pythonでの引数の取り扱いの罠等
- Python♪NumPyの「参照渡し」と「コピー」を覚えよう。リストとは全然違う。
- Python3 – 関数の引数は値渡しか – TauStation
- Pythonでcopyを使う方法【初心者向け】 | TechAcademyマガジン
- 参照渡し地獄変 -- Pythonにおける参照 - 蟲!虫!蟲! - #!/usr/bin/bugrammer
- Pythonの参照渡しでハマったのでその対処法 - かべぎわブログ
- Python プログラミング
- Python♪「参照渡し」「浅いコピー」「深いコピー」まずは理屈抜きで覚えよう。 | Snow Tree in June
- Pythonの引数における参照渡しと値渡しについて | Python入門
Ruby
Stack Overflowの回答によると、O'Reilly Media, Inc. The Ruby Programming Language (David Flanagan, Yukihiro Matsumoto著) 3.8.1: Object References より
When you pass an object to a method in Ruby, it is an object reference that is passed to the method. It is not the object itself, and it is not a reference to the reference to the object. Another way to say this is that method arguments are passed by value rather than by reference, but that the values passed are object references.
- 【Ruby】コピー時に元データがなぜか上書きされる【浅いコピー】 - Qiita
- Ruby 参照、浅いコピー、深いコピー - Qiita
- Ruby: dRuby(drb) - Qiita
- 『Effective Ruby』読書録 - Qiita
- dRubyで分散負荷試験 - Qiita
- Ruby技術者認定試験Silver 2.1 学習用の個人的なメモ その3 - Qiita
- コレクションの取り扱いあれこれ - webエンジニアの日常
- Effective Ruby - Peter J.Jones - Google ブックス (書籍のためGoogle ブックス上で確認)4
Crystal
-
C++の"call by reference"は「参照渡し」では無いという主張をしている。 ↩
-
原文でも"objects and arrays in JavaScript are passed by reference"と書かれているため、誤訳ではありません。 ↩
-
修正版では「参照渡し」の表現はありません。 ↩
-
原文は確認できませんでしたが、"Peter J. Jones, author of Effective Ruby: 48 Specific Ways to Write Better Ruby, examines all sides of the great 'call-by-value or call-by-reference' argument-passing debate."とあるため、原文でも"call by reference"と言っている可能性が高いです。 ↩