Hatena::Groupskcomputerclub

5月26日部活資料

5月26日部活資料

プレゼンテーション

C言語の「ポインタ」の話

  • Shuto Morii
    • pastak[at]hacobu.org
  • 新版 明解C言語入門編 第10章ポインタ
    • Written by BohYoh Shibata

C言語の鬼門 ポインタ

これが分かればC言語というかコンピュータ自体ももっと理解出来るはずです。

参考資料

まずその前に「変数」しっかりと

  • 変数=値を記憶するための箱
    • どこにあるの?






  • A:メモリ上にある

ハードディスクとメモリとCPU

  • ハードディスク
    • 容量いっぱい。160GB。電源切っても消えない
  • メモリ
    • 容量そんなに多くない。1GBとか。電源切ったら消える。HDDより早い
  • CPU
    • もっともっと早い。実際に数値の計算とかはCPUのお仕事。

変数の種類

使用例

int grobal;
//グローバル変数
static file_static;
//ソースファイル内で有効なスタティック変数
int func(){
  int func_local;
//関数func内で有効なローカル変数
  int static func_static;
//関数func内で有効なスタティック変数
}
int main(){
  int main_local;
//関数main内で有効なローカル変数
  return 0;
}
別のソースファイル
extern int grobal;
//グローバル変数を使用可能にする

変数の仕組み(1)

int a;
intサイズ分だけメモリ空間を確保する。

変数の仕組み(2)

int a=10,b=5;
int c=a+b;
a,bをそれぞれメモリから取り出してCPU上のレジスタにコピーして計算する。 計算結果は変数cのメモリ空間に格納

変数のアドレス

  • 変数がメモリ上のどこのメモリ空間に格納されているのかを表す
    • 16進数。「住所」みたいなもの。
変数名」はその住所にわかりやすい名前を付けるためのもの。

変数のアドレスを取得する

&変数
int a=5;
printf("変数aのアドレスは%pです\n",&a);

アドレスを格納する

*変数

実装例

int a;
int *b=&a;

変数によってもちろん変わる

int i,j;
printf("iのアドレスは%p \n jのアドレスは%pです\n",&i,&j);

「int型オブジェクト」「intを指すポインタ型」

int a;
int *a;

List10-1

=アドレスが違う
  • 変数初期化時にsum diffにはwaやsaの値は入るけども、sumやdiffの値が変わってもwa saの値は変わらない

演習(1)

  • List10-1のそれぞれの変数のアドレスを表示させてみよう

関数の引数としてのポインタ

実装例

void func(*temp){
  *temp=200;
}

int main(){
  int a=100;
  printf('%d',a);
  func(&a); 
//aのアドレスを受け取って関数内で*tempに代入。その後アドレスの中身を200に書き換え。
  printf('%d',a);
  return 0;
}
  • テキストだとList10-4

演習(2)

  • List10-1を書き直してみよう

今後の予定

  • 来週は久々にJavascriptをしようと思ってます。
  • テスト後
    • 文化祭どうするよ話をしましょう