[ create a new paste ] login | about

Link: http://codepad.org/FgEFNnnm    [ raw code | output | fork ]

C, pasted on Jun 4:
// C(/C++)言語の引数の話・初心者向け ---------------------------------------------------------------

// 
// 「引数って何?」の前に「当たり前の前提として」 変数って何? がある。
// Q)変数って何?
// A)メモリ上のどこかに用意されたメモリ空間に名前をつけたもの
//
// これは、int a = 10; とかでも、 int *p = &a; とかでもそう。 C++での int &r = a; とかでもそう。
// 例外なくシンプルに、ただ1つだけのルールとして
// 「変数はメモリ空間のどこかに割り当てらた名前」とだけ思っておく。
// 
// これを踏まえて 「引数って、何?」
//

void function(int a)	// この変数 a と
{
	a = a + 10;	// a += 10; と書いてもおk
	printf("function にて → %d \n", a);
}

void proc_A()
{
	int a = 123;
	function(a);		// ここで渡した変数 a を覚えておく

	printf("親の関数 にて → %d \n", a);
}

//
// proc_A の中で宣言され初期化された変数 a には 123 という値が入っているが、
// それを引数として、関数・function に渡している。
//
// 関数・function の中では、受け取った変数 a に 10 を足して、それを表示している。
// ※関数・function は「引数で来た値に10を足して表示を行うサブルーチン」という位置づけ
//
// この処理、よく見ると function の中で変数を書き換えているが、その後親の関数側で中身を表示してみると
// 中身は変わっていない。 これはどういう事かと言うと、

/*
 1.proc_A の中で int 型の変数 a が用意され、値を代入する事で初期化を行った。
 2.その変数 a を関数 function に渡した  ※1
 3.function は int 型変数 a を受け取った ※2
 4.function はなんか処理した
 5.proc_A に戻って処理続行
*/

// → ここでの ※1 と ※2 は実は「値は同じだが、変数としては別物」= function(a); とかした時点で「中身がコピーされている」
// 
// イメージとしては「関数に渡した」とか、曖昧に捕らえがちだけど、これは「コピーして渡している」。
//
// この「呼び元で用意した引数」と「関数が受け取った引数」は、それぞれ
// 「実引数」「仮引数」と呼んで普通区別する。 これらの話は、例えそれがポインタ変数であろうがなんだろうが、同じ事。


int main()
{
	proc_A();
		
	return 0;
}



// ※余談:実引数/仮引数の話、
//  JavaやC#では、int や floatプリミティブ型以外はほぼ「参照」という形で同じ空間を指すので、この区別はしないかもしれない。
//  しかしC/C++のような機械寄りの、もっと根っこの言語は明示的にこれを区別する。何故って機械語での記述上そうなるから。
//  細かい事言うと、JavaやC#でもVMの解釈上はこれを区別するだろうが、プログラマ向けには隠蔽されている。


Output:
1
2
function にて → 133 
親の関数 にて → 123 


Create a new paste based on this one


Comments: