オブジェクト指向言語論 第六回 知能情報学部 新田直也.

Slides:



Advertisements
Similar presentations
オブジェクト指向 言語 論 第八回 知能情報学部 新田直也. 多相性(最も単純な例) class A { void m() { System.out.println( “ this is class A ” ); } } class A1 extends A { void m() { System.out.println(
Advertisements

情報・知能工学系 山本一公 プログラミング演習Ⅱ 第3回 配列(1) 情報・知能工学系 山本一公
プログラミング演習II 2004年11月 30日(第6回) 理学部数学科・木村巌.
ISD実習E 2009年6月29日 LISPシステム入門 (第5回) 関数ポインタ eval システム関数.
情報基礎演習B 後半第5回 担当 岩村 TA 谷本君.
データ構造とアルゴリズム 第10回 mallocとfree
プログラミング入門2 第10回 構造体 情報工学科 篠埜 功.
プログラミング入門2 第10回 構造体 情報工学科 篠埜 功.
プログラミング演習Ⅱ 第12回 文字列とポインタ(1)
プログラミング言語論 第6回 型 情報工学科 篠埜 功.
情報処理Ⅱ 2005年12月9日(金).
アルゴリズムとデータ構造 2011年6月13日
構造体.
第4回放送授業.
データ構造と アルゴリズム 第四回 知能情報学部 新田直也.
精密工学科プログラミング基礎Ⅱ 第3回資料 今回の授業で習得してほしいこと: 2次元配列の使い方 (前回の1次元配列の復習もします.)
関数とポインタ 値呼び出しと参照呼び出し swapのいろいろ 関数引数 数値積分
Cプログラミング演習 第7回 メモリ内でのデータの配置.
アルゴリズムとデータ構造 補足資料5-2 「サンプルプログラムsetop.c」
第7回 プログラミングⅡ 第7回
復習 前回の関数のまとめ(1) 関数はmain()関数または他の関数から呼び出されて実行される.
プログラミング言語論 第五回 理工学部 情報システム工学科 新田直也.
アルゴリズムとデータ構造 補足資料5-1 「メモリとポインタ」
第11回 プログラミングⅡ 第11回
オブジェクト指向言語論 第十一回 知能情報学部 新田直也.
データ構造と アルゴリズム 第五回 知能情報学部 新田直也.
オブジェクト指向 プログラミング 第六回 知能情報学部 新田直也.
オブジェクト指向プログラミングと開発環境
オブジェクト指向言語論 第十一回 知能情報学部 新田直也.
メモリとメモリアドレス, ポインタ変数,関数へのポインタ渡し
オブジェクト指向言語論 第六回 知能情報学部 新田直也.
プログラミング言語論 第六回 理工学部 情報システム工学科 新田直也.
構造体と共用体.
アルゴリズムとプログラミング (Algorithms and Programming)
プログラミング 3 2 次元配列.
プログラミング言語論 第十三回 理工学部 情報システム工学科 新田直也.
オブジェクト指向 プログラミング 第六回 知能情報学部 新田直也.
プログラミング言語論 第十一回 理工学部 情報システム工学科 新田直也.
オブジェクト指向言語論 第三回 知能情報学部 新田直也.
ポインタとポインタを用いた関数定義.
アルゴリズムとデータ構造 2012年6月11日
プログラミング論 ポインタ
第5回 プログラミングⅡ 第5回
オブジェクト指向言語論 第五回 知能情報学部 新田直也.
プログラミング入門2 第5回 配列 for文 変数宣言 初期化
オブジェクト指向言語論 第十一回 知能情報学部 新田直也.
オブジェクト指向 プログラミング 第四回 知能情報学部 新田直也.
オブジェクト指向言語論 第九回 知能情報学部 新田直也.
オブジェクト指向言語論 第二回 知能情報学部 新田直也.
コンパイラ 第12回 実行時環境 ― 変数と関数 ― 38号館4階N-411 内線5459
ソフトウェア工学 知能情報学部 新田直也.
プログラミング言語論 第九回 理工学部 情報システム工学科 新田直也.
2005年度 データ構造とアルゴリズム 第2回 「C言語の復習:配列」
オブジェクト指向言語論 第六回 知能情報学部 新田直也.
データ構造と アルゴリズム 第四回 知能情報学部 新田直也.
オブジェクト指向言語論 第七回 知能情報学部 新田直也.
プログラミング言語論 第九回 理工学部 情報システム工学科 新田直也.
オブジェクト指向言語論 第七回 知能情報学部 新田直也.
情報処理Ⅱ 2005年11月25日(金).
オブジェクト指向言語論 第三回 知能情報学部 新田直也.
プログラミング演習II 2004年11月 2日(第3回) 理学部数学科・木村巌.
プログラミング入門2 第5回 配列 変数宣言、初期化について
オブジェクト指向 プログラミング 第六回 知能情報学部 新田直也.
プログラミング言語論 プログラミング言語論 演習5 解答と解説 演習5 解答と解説 1 1.
値渡しと参照渡しについて.
オブジェクト指向言語論 第九回 知能情報学部 新田直也.
モバイルプログラミング第3回 Cプログラミングの基礎( 2 )
プログラミング演習II 2003年10月29日(第2,3回) 木村巌.
プログラミング 3 ポインタ(1).
計算機プログラミングI 第2回 2002年10月17日(木) 履習登録 複習 ライブラリの利用 (2.6-7) 式・値・代入 (2.6-8)
Presentation transcript:

オブジェクト指向言語論 第六回 知能情報学部 新田直也

配列の宣言 配列:任意にアクセスできる変数の列. 配列名と添字 配列宣言 … int a[1000]; 12 34 56 78 90 添字 (C, C++, Javaの場合,先頭は0番) 使用する要素数

配列宣言(Java, VB) Javaの配列宣言 VBの配列宣言 int[] a = new int[1000]; Dim a(1000) as Integer

多次元配列 たとえば表のデータを扱う場合(2次元配列). 多次元配列の宣言 int a[3][4]; 12個のint型の要素が用意される.

配列とメモリ 配列の要素はメモリ上に連続して配置される. 配列名で先頭アドレスを参照することもできる (参照のみで代入はできない). 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番地

1次元配列の引数渡し 配列名は配列の先頭アドレス. main() { int a[100]; : func(a); } void func(int x[]) { 受け側は要素数を指定しない. int *x で受けても良い. いずれにせよサイズがわからな いので注意.

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番地 受け側は最高次元の要素数を 指定しない.

ポインタ ポインタをURL,ポインタが指す先をWebページと考えてみる. int *p; *p p アドレスが指す先の内容 アドレス p は指す先が int 型であるポインタ *p <html> <body> <H1>5</H1> </body> </html> p http://www.hogehoge.com

ポインタの更新と参照先の更新 p の値の変更と *p の値の変更の違い. *p = 7; p = q; → Webページの更新 *p p http://www.hogehoge.com <html> <body> <H1>5</H1> </body> </html> 7 p *p http://www.hogehoge2.com p = q; → リンク先の変更 7

アドレスの取得 配列の先頭アドレス: 変数のアドレス: int a[1000]; と宣言したときの a (配列名) int x; 内容

アドレス演算子とポインタ演算子の関係 アドレス演算子とポインタ演算子は逆向きの演算を行う. たとえば, x が int型の場合, *(&x) も int型に. ポインタ演算子 アドレス演算子 宣言 int *p; int x; 内容(int) *p x アドレス p &x *をつける &をつける

ポインタを用いた値の共有 以下のプログラムを実行してみる. int x; int *p; p = &x; *p = 3; 内容 アドレス このとき x の値も同時に 3 になる

値呼出しと参照呼出し 値呼出し: 関数に実引数の値を渡すが,呼出しによって実引数の値が変更されることはない. 参照呼出し: 関数に実引数の参照(ポインタ)を渡す.関数内部で実引数の値が変更することが可能である. 12 : func(a); 12 12 x a void func(int x) { : a 12 : func(&a); void func(int *p) {

参照渡し(2) 厳密には参照渡しも値渡しの一種である. 12 14 a 1536 : 1536 p func(&a); void func(int *p) { : *p = 14;

型について 型は,自然科学における「単位」と似たような役割を持つ. 代入文の左辺と右辺は基本的に同じ型にならなければならない. 関数を呼び出す側の引数と呼び出される側の引数の型は一致しないといけない. int a[100]; int *p; p = a; ⇒ OK a = p; ⇒ NG

型検査と型推論 型を検査する厳密で機械的な手続きが定義されている. 型推論の流れ. ⇒コンパイラへの応用 *a: int *a の型は int である.(Cの構文では,int *a;) 上から順に導いていく

型推論の基礎(1/2) 任意の式の型を機械的に求める方法. 変数宣言文などから変数の型を求める. main() { int a; } 定数および演算子にはあらかじめ型が割り当てられている. *: アドレス → int &: int → アドレス +: int × int → int a: int

型推論の基礎(2/2) 以下の推論規則を用いて式の型を求めていく. (合成) a: X, ○: X → Y ○a: Y (分解) ○a: Y, ○: X → Y a: X 上の事実から下の事実を導く 上の事実から下の事実を導く

型推論の例 関数へのポインタ渡し main() { int a = 10; f(&a); } void f(int *x) { :     : a: int, &: int→アドレス &a: アドレス (合成) *x: int, *: アドレス→int x: アドレス (分解)