LoginSignup
0
0

More than 3 years have passed since last update.

MIT Open CoursewareのPerformance Engineering of Software Systemsをやっていく(4)

Last updated at Posted at 2019-12-24

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;
}

ということでまた次回

0
0
0

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
0
0