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

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

メモリとポインタ. プログラムの前提 コンピュータは、0と1で計算をし、 0と1でデータを保存している。 メモリを学ぶのに必要な知識である。
C 言語講座 第 7 回 ポインター. メモリとアドレス(ポインターの前 に) コンピュータのメモリには 1 バイトずつ 0 番地、 1 番地、 2 番地・・・というように 住所が割り当てられている この住所をアドレスという。 メモリはデータをしまうもので それを引き出すためには メモリに番号(アドレス)を振っておけばよいな.
プログラミング演習II 2004年11月 30日(第6回) 理学部数学科・木村巌.
ISD実習E 2009年6月29日 LISPシステム入門 (第5回) 関数ポインタ eval システム関数.
情報基礎演習B 後半第5回 担当 岩村 TA 谷本君.
データ構造とアルゴリズム 第10回 mallocとfree
プログラミング演習Ⅱ 第12回 文字列とポインタ(1)
情報処理Ⅱ 2005年12月9日(金).
第8回 プログラミングⅡ 第8回
アルゴリズムとデータ構造 2011年6月13日
構造体.
第4回放送授業.
データ構造と アルゴリズム 第四回 知能情報学部 新田直也.
精密工学科プログラミング基礎Ⅱ 第3回資料 今回の授業で習得してほしいこと: 2次元配列の使い方 (前回の1次元配列の復習もします.)
プログラミング論 関数ポインタ と 応用(qsort)
プログラミング論 ファイル入出力
関数とポインタ 値呼び出しと参照呼び出し swapのいろいろ 関数引数 数値積分
プログラミング 4 記憶の割り付け.
2005年度 データ構造とアルゴリズム 第3回 「C言語の復習:再帰的データ構造」
第10章 これはかなり大変な事項!! ~ポインタ~
第13章 文字の取り扱い方 13.1 文字と文字型関数 13.2 文字列 13.3 文字型配列への文字列の代入
第7回 プログラミングⅡ 第7回
復習 前回の関数のまとめ(1) 関数はmain()関数または他の関数から呼び出されて実行される.
プログラミング言語論 第五回 理工学部 情報システム工学科 新田直也.
アルゴリズムとデータ構造 補足資料4-1 「メモリと配列」
アルゴリズムとデータ構造 補足資料5-1 「メモリとポインタ」
プログラミング論 ファイル入出力
第11回 プログラミングⅡ 第11回
オブジェクト指向言語論 第十一回 知能情報学部 新田直也.
09: ポインタ・文字列 C プログラミング入門 総機1 (月1) Linux にログインし、以下の講義ページ を開いておくこと
データ構造と アルゴリズム 第五回 知能情報学部 新田直也.
プログラミング基礎B 文字列の扱い.
オブジェクト指向 プログラミング 第六回 知能情報学部 新田直也.
オブジェクト指向プログラミングと開発環境
オブジェクト指向言語論 第十一回 知能情報学部 新田直也.
メモリとメモリアドレス, ポインタ変数,関数へのポインタ渡し
プログラミング言語論 第六回 理工学部 情報システム工学科 新田直也.
アルゴリズムとプログラミング (Algorithms and Programming)
プログラミング 3 2 次元配列.
オブジェクト指向 プログラミング 第六回 知能情報学部 新田直也.
プログラミング言語論 第十一回 理工学部 情報システム工学科 新田直也.
第13章 文字の取り扱い方 13.1 文字と文字型変数 13.2 文字列 13.3 文字型配列への文字列の代入
アルゴリズムとデータ構造 2012年6月11日
プログラミング論 ポインタ
09: ポインタ・文字列 C プログラミング入門 基幹7 (水5) Linux にログインし、以下の講義ページを開いておく こと
アルゴリズムとデータ構造1 2009年6月15日
第5回 プログラミングⅡ 第5回
オブジェクト指向言語論 第五回 知能情報学部 新田直也.
オブジェクト指向言語論 第十一回 知能情報学部 新田直也.
オブジェクト指向言語論 第九回 知能情報学部 新田直也.
オブジェクト指向言語論 第二回 知能情報学部 新田直也.
プログラミング 4 文字列.
アルゴリズムとデータ構造 2010年6月17日
ソフトウェア工学 知能情報学部 新田直也.
オブジェクト指向言語論 第七回 知能情報学部 新田直也.
2005年度 データ構造とアルゴリズム 第2回 「C言語の復習:配列」
オブジェクト指向言語論 第六回 知能情報学部 新田直也.
データ構造と アルゴリズム 第四回 知能情報学部 新田直也.
プログラミング言語論 第九回 理工学部 情報システム工学科 新田直也.
オブジェクト指向言語論 第三回 知能情報学部 新田直也.
プログラミング演習II 2004年11月 2日(第3回) 理学部数学科・木村巌.
プログラミング入門2 第5回 配列 変数宣言、初期化について
オブジェクト指向 プログラミング 第六回 知能情報学部 新田直也.
値渡しと参照渡しについて.
オブジェクト指向言語論 第九回 知能情報学部 新田直也.
オブジェクト指向言語論 第十回 知能情報学部 新田直也.
モバイルプログラミング第3回 Cプログラミングの基礎( 2 )
オブジェクト指向言語論 第六回 知能情報学部 新田直也.
プログラミング 3 ポインタ(1).
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番地

スタック領域の詳細 関数呼出しに応じて スタック領域が確保される. main () { main用 int x = 1; 0xffff番地 main () { int x = 1; x = input(x); } int input(int y) { char s[10]; scanf(“%s”, s); printf("%s\n", s); return y + 1; main用 x y 戻り番地 s[0] s[1] : 自動変数用 28バイト 引数用 20バイト input用 0x0000番地

バッファオーバーフロー攻撃 scanfなどで戻り番地を上書きする. 戻り番地は29~32文字目 不正な コード main () { 0xffff番地 main () { int x = 1; x = input(x); } int input(int y) { char s[10]; scanf(“%s”, s); printf("%s\n", s); return y + 1; main用 x : 引数用 20バイト y input用 戻り番地 : 不正な コード 自動変数用 28バイト s[1] s[0] 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; 内容

ポインタを用いた値の共有 以下のプログラムを実行してみる. 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 *x) {

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