C言語の昔からポインタやらアドレスやら鬼門だけど、現代の言語でも「参照渡し」は鬼門になってる。
参照渡しに触れる必要がない言語の文脈で参照渡しについてわざわざ言及するとまさかり投げ放題ワンダーランドみたいな事態になるので、気をつけよう。とイスカリオテの湯葉さんの参照渡しと値渡し, copy と deepcopy の違いを読んで思ひました。
僕はゆるふわPHPerなのでPHPで書くけど、こんな関数呼び出しと実行結果が実装できれば「引数の参照渡し」が実現できてることになるんじゃないかな1。
<?php
$x = 'A';
$y = 'B';
swap($x, $y);
var_dump($x); // => 'B'
var_dump($y); // => 'A'
C言語
大学でパソコンの勉強したひとはたいていC言語をやってるので得意なひとが多いんじゃないかと思ふけど、C言語に参照渡しはないから、swap(x, y)
みたいなことはできない。ただし、アドレスを介在させてswap(&x, &y)
みたいに値として渡してやれば実現はできる。
って大学で売り付けられた高くておもしろくないC言語の教科書にも載ってたような気はする。
#include <stdio.h>
void swap(char *a, char *b)
{
char tmp;
tmp = *a;
*a = *b;
*b = tmp;
}
int main(void)
{
char x = 'A', y = 'B';
swap(&x, &y);
printf("%c\n", x);
printf("%c\n", y);
return 0;
}
Cの場合は「アドレスの値渡し」であって「参照渡し」とは似て非なるものだと思ふんですけど、C言語はFラン大学時代に授業でやっただけなので、詳しいひとにマサカリを投げてほしいです!
Java
まじめに書いたことない…
PHP
はいはい、引数リストに&
つけてリファレンス渡しにしてやればいいんでしょ。
ほかの言語
みなさんも自分の得意な言語でswap(x, y)
って書いてみよう!!
詳しく知りたい
Qiitaで参照渡しで検索すると、みんなわかったりわからなかったりするんだな、といふことがよくわかります。
脚注
-
もちろんC言語やLispのマクロを利用しても実現できるけど、ややこしいので置いておこう ↩