14
11

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

キミの言語は参照渡しできる?

Last updated at Posted at 2016-08-10

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で参照渡しで検索すると、みんなわかったりわからなかったりするんだな、といふことがよくわかります。

脚注

  1. もちろんC言語やLispのマクロを利用しても実現できるけど、ややこしいので置いておこう

14
11
12

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
14
11

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?