Download presentation
Presentation is loading. Please wait.
1
オブジェクト指向言語論 第六回 知能情報学部 新田直也
2
配列の宣言 配列:任意にアクセスできる変数の列. 配列名と添字 配列宣言 … int a[1000]; 12 34 56 78 90
添字 (C, C++, Javaの場合,先頭は0番) 使用する要素数
3
配列宣言(Java, VB) Javaの配列宣言 VBの配列宣言 int[] a = new int[1000];
Dim a(1000) as Integer
4
多次元配列 たとえば表のデータを扱う場合(2次元配列). 多次元配列の宣言 int a[3][4]; 12個のint型の要素が用意される.
5
配列とメモリ 配列の要素はメモリ上に連続して配置される. 配列名で先頭アドレスを参照することもできる (参照のみで代入はできない).
0xffff番地 0xffff番地 : : a[3] b[1][0] a b, b[0] b[1] a[2] b[0][2] a[1] b[0][1] a[0] b[0][0] 0x0000番地 0x0000番地
6
1次元配列の引数渡し 配列名は配列の先頭アドレス. main() { int a[100]; : func(a); }
void func(int x[]) { 受け側は要素数を指定しない. int *x で受けても良い. いずれにせよサイズがわからな いので注意.
7
2次元配列の引数渡し 配列名は配列の先頭アドレス. main() { int a[100][10]; : func(a); }
void func(int x[][10]) { 0xffff番地 : a[1][0] a[0][9] : int が 10 個分 a[0][1] a[0][0] 0x0000番地 受け側は最高次元の要素数を 指定しない.
8
ポインタ ポインタをURL,ポインタが指す先をWebページと考えてみる. int *p; *p p アドレスが指す先の内容 アドレス
p は指す先が int 型であるポインタ *p <html> <body> <H1>5</H1> </body> </html> p
9
ポインタの更新と参照先の更新 p の値の変更と *p の値の変更の違い. *p = 7; p = q; → Webページの更新 *p p
<html> <body> <H1>5</H1> </body> </html> 7 p *p p = q; → リンク先の変更 7
10
アドレスの取得 配列の先頭アドレス: 変数のアドレス: int a[1000]; と宣言したときの a (配列名) int x;
内容
11
アドレス演算子とポインタ演算子の関係 アドレス演算子とポインタ演算子は逆向きの演算を行う.
たとえば, x が int型の場合, *(&x) も int型に. ポインタ演算子 アドレス演算子 宣言 int *p; int x; 内容(int) *p x アドレス p &x *をつける &をつける
12
ポインタを用いた値の共有 以下のプログラムを実行してみる. int x; int *p; p = &x; *p = 3;
内容 アドレス このとき x の値も同時に 3 になる
13
値呼出しと参照呼出し 値呼出し: 関数に実引数の値を渡すが,呼出しによって実引数の値が変更されることはない.
参照呼出し: 関数に実引数の参照(ポインタ)を渡す.関数内部で実引数の値が変更することが可能である. 12 : func(a); 12 12 x a void func(int x) { : a 12 : func(&a); void func(int *p) {
14
参照渡し(2) 厳密には参照渡しも値渡しの一種である. 12 14 a 1536 : 1536 p func(&a);
void func(int *p) { : *p = 14;
15
型について 型は,自然科学における「単位」と似たような役割を持つ. 代入文の左辺と右辺は基本的に同じ型にならなければならない.
関数を呼び出す側の引数と呼び出される側の引数の型は一致しないといけない. int a[100]; int *p; p = a; ⇒ OK a = p; ⇒ NG
16
型検査と型推論 型を検査する厳密で機械的な手続きが定義されている. 型推論の流れ. ⇒コンパイラへの応用 *a: int
*a の型は int である.(Cの構文では,int *a;) 上から順に導いていく
17
型推論の基礎(1/2) 任意の式の型を機械的に求める方法. 変数宣言文などから変数の型を求める.
main() { int a; } 定数および演算子にはあらかじめ型が割り当てられている. *: アドレス → int &: int → アドレス +: int × int → int a: int
18
型推論の基礎(2/2) 以下の推論規則を用いて式の型を求めていく. (合成) a: X, ○: X → Y ○a: Y (分解)
○a: Y, ○: X → Y a: X 上の事実から下の事実を導く 上の事実から下の事実を導く
19
型推論の例 関数へのポインタ渡し main() { int a = 10; f(&a); } void f(int *x) { :
: a: int, &: int→アドレス &a: アドレス (合成) *x: int, *: アドレス→int x: アドレス (分解)
Similar presentations
© 2024 slidesplayer.net Inc.
All rights reserved.