プログラミング演習II 2004年11月 2日(第3回) 理学部数学科・木村巌.

Slides:



Advertisements
Similar presentations
プログラミング演習 II 2005 年 1 月 19 日(第 9 回) 理学部数学科・木村巌. 前回までの復習 共用体( union type ) 共用体( union type ) 列挙 (enumerated type ) 列挙 (enumerated type ) 構造体、構造体のポインタ、
Advertisements

メモリとポインタ. プログラムの前提 コンピュータは、0と1で計算をし、 0と1でデータを保存している。 メモリを学ぶのに必要な知識である。
プログラミング 関数編 情報科学科. プログラミングにあたって C 言語では、 main 内に処理を記述 1000 行になるような大きなプログラムでは、 プログラム全体が何をしているのかを把握 することが困難になる 他人が見ると非常に理解しにくい 作成者であっても時が経てば内容を忘れて、他 人が見た時と同じ状況になる.
C 言語講座 第 7 回 ポインター. メモリとアドレス(ポインターの前 に) コンピュータのメモリには 1 バイトずつ 0 番地、 1 番地、 2 番地・・・というように 住所が割り当てられている この住所をアドレスという。 メモリはデータをしまうもので それを引き出すためには メモリに番号(アドレス)を振っておけばよいな.
情報・知能工学系 山本一公 プログラミング演習Ⅱ 第3回 配列(1) 情報・知能工学系 山本一公
情報・知能工学系 山本一公 プログラミング演習Ⅱ 第5回 関数(1) 情報・知能工学系 山本一公
プログラミング演習II 2004年11月 30日(第6回) 理学部数学科・木村巌.
情報基礎演習B 後半第5回 担当 岩村 TA 谷本君.
ファーストイヤー・セミナーⅡ 第8回 データの入力.
配列(2) 第10回[平成15年6月26日(木)]:PN03-10.ppt 今日の内容 1 素数を求める(教科書の例):復習
プログラミング入門2 第10回 構造体 情報工学科 篠埜 功.
プログラミング入門2 第10回 構造体 情報工学科 篠埜 功.
プログラミング演習Ⅱ 第12回 文字列とポインタ(1)
プログラミング基礎I(再) 山元進.
プログラミング演習(2組) 第12回
プログラミング演習II 2004年10月19日(第1回) 理学部数学科・木村巌.
情報処理Ⅱ 2005年12月9日(金).
C言語講座 第4回 ポインタ.
第8回 プログラミングⅡ 第8回
プログラミング言語論 第4回 手続きの引数機構 変数の有効範囲
プログラミング演習II 2004年12月 21日(第8回) 理学部数学科・木村巌.
第4回放送授業.
精密工学科プログラミング基礎Ⅱ 第3回資料 今回の授業で習得してほしいこと: 2次元配列の使い方 (前回の1次元配列の復習もします.)
情報工学科 3年生対象 専門科目 システムプログラミング 第5回、第6回 ヒアドキュメント レポート課題 情報工学科 篠埜 功.
プログラミング論 関数ポインタ と 応用(qsort)
関数とポインタ 値呼び出しと参照呼び出し swapのいろいろ 関数引数 数値積分
プログラミング言語論 第9回 Hoare論理の練習問題 手続きの引数機構 変数の有効範囲
プログラミング演習I 2003年6月25日(第10回) 木村巌.
プログラミング演習I 2003年5月7日(第4回) 木村巌.
第10章 これはかなり大変な事項!! ~ポインタ~
プログラミング入門2 第8回 ポインタ 情報工学科 篠埜 功.
第7回 プログラミングⅡ 第7回
復習 前回の関数のまとめ(1) 関数はmain()関数または他の関数から呼び出されて実行される.
アルゴリズムとデータ構造 補足資料5-1 「メモリとポインタ」
地域情報学 C言語プログラミング 第5回 ポインタ、関数、ファイル入出力 2017年11月17日
第11回 プログラミングⅡ 第11回
P n ポインタの基礎 5 q m 5 7 int* p; int 型の変数を指すポインタ int* q; int 型の変数を指すポインタ int n=5, m=7; int 型の変数 int array[3]; int* pArray[3]; p = &n; ポインタにアドレスを代入しているのでOK.
09: ポインタ・文字列 C プログラミング入門 総機1 (月1) Linux にログインし、以下の講義ページ を開いておくこと
第14章 ファイル操作 14.1 ファイルへの書き込み 14.2 ファイルからの読み込み 14.3 ファイルへの追加書き込み
第2回課題 配布した通り.氏名・学生番号を忘れないこと.
プログラミング言語論 第5回 手続きの引数機構 変数の有効範囲
プログラミング演習I 2004年5月19日(第5回) 理学部数学科・木村巌.
オブジェクト指向言語論 第六回 知能情報学部 新田直也.
プログラミング言語論 第六回 理工学部 情報システム工学科 新田直也.
C言語 はじめに 2016年 吉田研究室.
構造体と共用体.
情報とコンピュータ 静岡大学工学部 安藤和敏
プログラミング入門2 第9回 ポインタ 情報工学科 篠埜 功.
アルゴリズムとプログラミング (Algorithms and Programming)
プログラミング演習I 2003年4月30日(第3回) 木村巌.
プログラミング 3 2 次元配列.
文字列へのポインタの配列 static char *lines[MAXLINES]; lines[0] NULL
プログラミング演習I 2003年7月2日(第11回) 木村巌.
ポインタとポインタを用いた関数定義.
プログラミング論 ポインタ
09: ポインタ・文字列 C プログラミング入門 基幹7 (水5) Linux にログインし、以下の講義ページを開いておく こと
11.1 標準ライブラリ関数 11.2 関数呼び出しのオーバーヘッド 11.3 大域変数 11.4 プロトタイプ宣言 11.5 関数引数
第5回 プログラミングⅡ 第5回
コンパイラ 第12回 実行時環境 ― 変数と関数 ― 38号館4階N-411 内線5459
プログラミング演習I 2003年6月11日(第9回) 木村巌.
プログラミング演習II 2004年11月 16日(第5回) 理学部数学科・木村巌.
プログラミング演習II 2003年11月19日(第6回) 木村巌.
プログラミング演習II 2003年12月10日(第7回) 木村巌.
プログラミング入門2 第5回 配列 変数宣言、初期化について
値渡しと参照渡しについて.
モバイルプログラミング第3回 Cプログラミングの基礎( 2 )
プログラミング演習II 2003年10月29日(第2,3回) 木村巌.
岩村雅一 知能情報工学演習I 第7回(後半第1回) 岩村雅一
オブジェクト指向言語論 第六回 知能情報学部 新田直也.
プログラミング 3 ポインタ(1).
Presentation transcript:

プログラミング演習II 2004年11月 2日(第3回) 理学部数学科・木村巌

前回までの復習 関数の宣言 複数のファイルからなるプログラム 複数のファイルからなるプログラムでのスコープ 標準ライブラリ関数とは何か 標準ライブラリ関数の使い方

今日学ぶこと メモリとアドレス ポインタ変数 アドレス演算子 &, 間接参照演算子 * ポインタを引数とすることで、呼び出し元の実引数を変更できる constを仮引数に付けることで、実引数の変更を抑制できる 教科書9.1から(p. 272~)

アドレスって? 変数の値は、コンピュータの「メモリ」に記憶される メモリには、16進表記で通し番号が振られている この通し番号を、アドレス(address)という

変数のアドレスを見る 変数が格納されているメモリのアドレスをしるには、アドレス演算子&を使う アドレス演算子の使い方 &変数名 例えば、aがint型の変数なら、そのアドレスは&a で知ることが出来る アドレスを端末に表示するには、%p 書式指定子を使う(Sample1.cを打ち込んで、コンパイル・実行してみよう)

アドレスは、メモリ上の位置 アドレス演算子を使うと、変数aの値が、メモリ上のどの位置に記憶されているか、が分かる Sample1.cで、さらにint型の変数b, cを追加し、それらのアドレスも表示させてみよ。 気がつくことがあるか?

ポインタ アドレスを格納する変数を、ポインタ型の変数という ポインタ型の変数の事を、単にポインタということも多い ポインタ型の変数の使い方は、これまで学んできた、他の型の変数と同じ

ポインタの宣言 型名 *ポインタ変数名; ポインタ変数であることが分かるような名前を付けることも多い 例: 変数名はあくまでpAとAptr int *pA; int *Aptr; /* どちらもint型へのポインタ */ 変数名はあくまでpAとAptr Sample2.cを入力し、コンパイル・実行してみよう

ポインタ変数にアドレスを代入 Sample2.cの pA = &a; という行は、ポインタ変数pAに、int型の変数aのアドレスを代入している pAには、例えば0x22ef3c といった値が入る 「pAはaを指すポインタ」などという

ポインタから変数の値を知る ポインタ変数の値(つまり、別の変数のアドレス)から、元の変数の値を知ることが出来る 間接参照演算子*をつかう *ポインタ変数名; 例:pAがint型の変数aのアドレスを格納したポインタ変数なら、aの値は、 *pA /* これはint型 */ Sapmle3.cを入力し、コンパイル・実行してみよう

ポインタについて整理する a 変数a &a 変数aのアドレス pA 変数aのアドレスを格納したポインタ変数 *pA

ポインタに別のアドレスを代入する ポインタ変数とは、アドレスを格納する変数 普通の変数と同じく、プログラムの途中で、ポインタ変数の値を変更することが出来る ただし、int型を指すポインタ変数には、int型の変数のアドレスしか格納できない Sample4.cを入力し、コンパイル・実行してみよう

初期化されていないポインタ変数 ポインタ変数は、宣言しただけでは使えない 特定の変数のアドレスを代入し、初期化しなければならない 初期化していないポインタ変数を使うと、ゴミが表示されたり、実行時エラーになったりする(どのような挙動を示すかは、予言できない

ポインタを使って変数を変更 Sample5.cを入力し、コンパイル・実行してみよう pAがint型を指すポインタ変数の時、*pAはint型.よって、*pA = 50; のように、代入できる この仕組みを使って、関数に引数を渡すと、面白い応用がある

引数とポインタ int型の2つの値を交換する関数void swap (int x, int y)を書きたい →は思った通りには動かない int tmp; tmp = x; x = y; y = tmp; }

なぜ前のswap()は動かないのか? Sample6.cを入力し、コンパイル・実行してみよう→思ったように値が交換されない 関数の引数には、変数の値のコピーが渡される これを、値渡し(pass by value)とか、値呼び(call by value)とかいう コピーを交換しても、元の変数には影響が及ばない

ポインタを使って解決 仮引数をポインタ変数とする void swap (int *pX, int *pY) →参照 { Sample7.cを入力し、コンパイル・実行してみよう void swap (int *pX, int *pY) { int tmp; tmp = *pX; *pX = *pY; *pX = tmp; }

ポインタを使って解決(続) 前のスライドをswap()を使う。 引数として、&num1, &num2のように、変数のアドレスを渡す pX = &num1; pY = &num2; *pX = num1; *pY = num2; これらが入れ替えられると、num1, num2そのものが入れ替えられる 参照渡し(pass by reference)

実引数を変更したくない場合 constという指定で、ポインタがさす実引数を変更できなくなる void func (const int *pX); というプロトタイプ宣言をみると、この関数はpXが指す変数を変更しないことがわかる 同時に、func()を作成する際に、誤ってpXが指す変数を変更してしまっても、コンパイラがその誤りを指摘してくれる

今日学んだこと メモリとアドレス ポインタ変数 アドレス演算子 &, 間接参照演算子 * ポインタを引数とすることで、呼び出し元の実引数を変更できる constを仮引数に付けることで、実引数の変更を抑制できる

レポート課題 void mod (int *pA, int *pM) というプロトタイプを持つ関数mod()は、*pAを (*pA) % (*pM)に置き換える.キーボードからint型の値aとmを入力し、次のように出力するプログラムを作成せよ: ヒントは教科書p. 298の練習問題3.

レポート課題(続) input a and m: 7 (ユーザの入力) 5 (ユーザの入力) 7 (ユーザの入力) 5 (ユーザの入力) 7 modulo 5 = 2 modulo 5.

レポート課題(続) 締め切り:2004年11月8日一杯(日本時間で) 提出:メールで木村(iwao@sci.toyama-u.ac.jp)まで. 感想などあると木村が喜びます