SlideShare une entreprise Scribd logo
1  sur  4
Télécharger pour lire hors ligne
え!それって参照渡し?
関数の引数 
Bitz 村上 幸雄
開発環境:MacBook Pro (Retina, 13-inch, Late 2013) macOS 10.14 Xcode 10.0
発表日:2018/10/17







■はじめに
とても違和感を感じる用語がある。それは、『参照渡しだ』。
え!違うだろ?と感じていたが、いい機会なので、調べてみた。
■引数
引数と呼ばれるものにどんな種類があるのか、まずは列挙してみる。
実引数
関数に渡す値。
仮引数
関数が受け取った変数。
値渡し(call by value)
値が渡される。
ポインタ渡し
渡す値がアドレスの値渡し。
sum(1, 2);
int sum(int a, int b)

{

return a + b;

}
実引数
仮引数
参照渡し
• 変数渡し(call by variable)

変数そのものを渡す。
• 参照渡し(call by reference)

参照渡しで、内部でアドレス情報を渡す方法。
■Pascal
Pascalでは,値渡し(call by value)と変数渡し(call by variable)が存在し、変数渡しは参照渡しに相
当する。
そもそもは、変数渡しの実装方法に参照渡しがある。参照渡しは、変数に対する参照(アドレス情報)
を渡す方法だ。
Inside Macintoshは、コードはPascalで記載されているが、それをC言語で利用する場合、varがつ
いた変数渡しの引数は、C言語ではポインターと読み替えていた。
具体的には、Inside Macintoshで以下のようにPascalで説明されていたとする。
これをC言語では、以下のように読み替える。
■C言語
C言語の関数の引数は全て値渡し。K&Rでしっかりと説明されている。
ポインタでアドレスの値を渡すのを参照渡しと呼ぶのは間違いだ。
■Java
Javaも全て値渡し。
ポインタ演算ができない、アドレス(参照)の値渡しが利用できるが、これを参照渡しと呼ぶのは、
如何なものか。
■C++
値渡しに加え、本物の参照渡しが存在する。
PROCEDURE GetPort(VAR port: GrafPtr);
Pascal
void GetPort (GrafPtr * port);
C言語
また、C++11では右辺値参照・ムーブセマンティクスという所有者の移動が用意されている。
■C#
二つの参照渡しの方法が用意されている。
refは変数が渡されるので、初期化によって値が設定されていない変数はNGだ。
outは値を返すという意味から、初期化は必須でないか、関数内で値を必ず設定しないといけない。
■Swift
値渡しだが、inoutキーワードをつけると値呼びの結果返し(call-by-value-result)となる。
C言語のポインターの場合と同様に、変数が参照型の場合、参照の値渡しにより値を変更できる。
int initializeInMethod;
OutArgExample(out initializeInMethod);
Console.WriteLine(initializeInMethod);
void OutArgExample(out int number)
{
number = 44; // 代入が必須
}
out
void time_two(int& a)
{
a *= 2;
}
int initializeInMethod = 0; // 初期化が必須
OutArgExample(initializeInMethod);
Console.WriteLine(initializeInMethod);
void OutArgExample(ref int number)
{
number = 44;
}
ref
参照渡し
値呼びの結果返しの例。
少し複雑に感じるが、基本、C言語と同様と考えると成る程だ。
class Demo {
public var num = 0;
}
func set999(a: Demo) {
a.num = 999;
}
let demo = Demo()
set999(demo)
参照の値渡し
func set999(a: inout Int) {
a =999
}
var num = 0
set999(&num)
値呼びの結果返し

Contenu connexe

Plus de 幸雄 村上

AppleScriptとは何ぞや
AppleScriptとは何ぞやAppleScriptとは何ぞや
AppleScriptとは何ぞや幸雄 村上
 
Web API 通信の符号化について
Web API 通信の符号化についてWeb API 通信の符号化について
Web API 通信の符号化について幸雄 村上
 
Master-Detail App を実装する
Master-Detail App を実装するMaster-Detail App を実装する
Master-Detail App を実装する幸雄 村上
 
SwiftのOptionalを理解する
SwiftのOptionalを理解するSwiftのOptionalを理解する
SwiftのOptionalを理解する幸雄 村上
 
Getting a packet trace
Getting a packet traceGetting a packet trace
Getting a packet trace幸雄 村上
 
The Bash in Tokyo : AppKitとUIKit
The Bash in Tokyo : AppKitとUIKitThe Bash in Tokyo : AppKitとUIKit
The Bash in Tokyo : AppKitとUIKit幸雄 村上
 
Swiftでブロックチェーンを実装する
Swiftでブロックチェーンを実装するSwiftでブロックチェーンを実装する
Swiftでブロックチェーンを実装する幸雄 村上
 
ゲームの企画書づくりに挑戦
ゲームの企画書づくりに挑戦ゲームの企画書づくりに挑戦
ゲームの企画書づくりに挑戦幸雄 村上
 
IBM Watson Services for Core ML
IBM Watson Services for Core MLIBM Watson Services for Core ML
IBM Watson Services for Core ML幸雄 村上
 
独自Documentクラス
独自Documentクラス独自Documentクラス
独自Documentクラス幸雄 村上
 
独自Documentクラス
独自Documentクラス独自Documentクラス
独自Documentクラス幸雄 村上
 
Document based application
Document based applicationDocument based application
Document based application幸雄 村上
 
デザインパターン
デザインパターンデザインパターン
デザインパターン幸雄 村上
 
七曜表と備忘録
七曜表と備忘録七曜表と備忘録
七曜表と備忘録幸雄 村上
 
サーバーレスアーキテクチャで悩んでます
サーバーレスアーキテクチャで悩んでますサーバーレスアーキテクチャで悩んでます
サーバーレスアーキテクチャで悩んでます幸雄 村上
 
OpenGLプログラミング
OpenGLプログラミングOpenGLプログラミング
OpenGLプログラミング幸雄 村上
 

Plus de 幸雄 村上 (20)

AppleScriptなど
AppleScriptなどAppleScriptなど
AppleScriptなど
 
MojaveのDark Mode
MojaveのDark ModeMojaveのDark Mode
MojaveのDark Mode
 
AppleScriptとは何ぞや
AppleScriptとは何ぞやAppleScriptとは何ぞや
AppleScriptとは何ぞや
 
Web API 通信の符号化について
Web API 通信の符号化についてWeb API 通信の符号化について
Web API 通信の符号化について
 
Master-Detail App を実装する
Master-Detail App を実装するMaster-Detail App を実装する
Master-Detail App を実装する
 
SwiftのOptionalを理解する
SwiftのOptionalを理解するSwiftのOptionalを理解する
SwiftのOptionalを理解する
 
Getting a packet trace
Getting a packet traceGetting a packet trace
Getting a packet trace
 
The Bash in Tokyo : AppKitとUIKit
The Bash in Tokyo : AppKitとUIKitThe Bash in Tokyo : AppKitとUIKit
The Bash in Tokyo : AppKitとUIKit
 
RUDP
RUDPRUDP
RUDP
 
Swiftでブロックチェーンを実装する
Swiftでブロックチェーンを実装するSwiftでブロックチェーンを実装する
Swiftでブロックチェーンを実装する
 
ゲームの企画書づくりに挑戦
ゲームの企画書づくりに挑戦ゲームの企画書づくりに挑戦
ゲームの企画書づくりに挑戦
 
IBM Watson Services for Core ML
IBM Watson Services for Core MLIBM Watson Services for Core ML
IBM Watson Services for Core ML
 
独自Documentクラス
独自Documentクラス独自Documentクラス
独自Documentクラス
 
独自Documentクラス
独自Documentクラス独自Documentクラス
独自Documentクラス
 
Bukuro.makers
Bukuro.makersBukuro.makers
Bukuro.makers
 
Document based application
Document based applicationDocument based application
Document based application
 
デザインパターン
デザインパターンデザインパターン
デザインパターン
 
七曜表と備忘録
七曜表と備忘録七曜表と備忘録
七曜表と備忘録
 
サーバーレスアーキテクチャで悩んでます
サーバーレスアーキテクチャで悩んでますサーバーレスアーキテクチャで悩んでます
サーバーレスアーキテクチャで悩んでます
 
OpenGLプログラミング
OpenGLプログラミングOpenGLプログラミング
OpenGLプログラミング
 

え!それって参照渡し?