MIT Open CoursewareのPerformance Engineering of Software Systemsをやっていきます。
引数の通過
Cにおいては、関数への引数は値で渡されます。これは、もしfoo(int f)
において、整数を伝達しようとしたら、新しい変数fがfoo関数内で初期化されるということです。
例えば、二つの整数を交換する以下のコードを例に取ってみましょう。期待した動きをするでしょうか?
#include <stdio.h>
void swap(int i,int j){
int temp = i;
i = j;
j = temp;
}
int main() {
int k = 1;
int m = 2;
swap(k,m);
printf("k = %d,m = %d \n",k,m); //k = 1,m = 2
return 0;
}
交換されていませんね。直すのに二つの方法があります。一つは、swap()をマクロに変えて、マクロが呼び出されるスコープにて操作が評価されるようにする。もう一つの方法は、swapをポインタを使って表現すること。
以下がマクロを使った構文。
#include <stdio.h>
/*
void swap(int i,int j){
int temp = i;
i = j;
j = temp;
}*/
#define SWAP(type,a,b) { type temp = a; a = b; b = temp; }
int main() {
int k = 1;
int m = 2;
SWAP(int,k,m);
printf("k = %d,m = %d \n",k,m); //k = 2,m = 1
return 0;
}
ポインタを使った公文は以下の通り
#include <stdio.h>
void swap(int *i,int *j){ //ポインタを引数として取る
int temp = *i; //ポインタから値を取り出す
*i = *j; //ポインタから値を取り出してポインタの指す値へ代入
*j = temp; //値からポインタが挿す値へ代入する。
}
int main() {
int k = 1;
int m = 2;
swap(&k,&m); //&k、&mはk、mのアドレスを返す。
printf("k = %d,m = %d \n",k,m); //k = 2,m = 1
return 0;
}
ということでまた次回