C プグ グプログラミングコース ポインタ自由自在(1) · Microsoft PowerPoint...

21
Cラミンコース ポインタ自由自在(1) ポインタ自由自在(1) Yasuhiro Noguchi th R hI tit t f E b dd dS t A hit t (RIESA) the ResearchInstitute f or EmbeddedSystems Architects (RIESA) Faculty of Informatics, Shizuoka University HEPT Consortium HEPT Consortium Copyright (C) 2013 HEPT Consortium 1

Transcript of C プグ グプログラミングコース ポインタ自由自在(1) · Microsoft PowerPoint...

Page 1: C プグ グプログラミングコース ポインタ自由自在(1) · Microsoft PowerPoint - cpro1-sample.pptx Author: noguchi Created Date: 6/6/2013 12:32:57 PM ...

プ グ グC‐プログラミングコースポインタ自由自在(1)ポインタ自由自在(1)

Yasuhiro Noguchith R h I tit t f E b dd d S t A hit t (RIESA)the Research Institute for Embedded Systems Architects (RIESA)

Faculty of Informatics, Shizuoka UniversityHEPT ConsortiumHEPT Consortium

Copyright (C) 2013 HEPT Consortium 1

Page 2: C プグ グプログラミングコース ポインタ自由自在(1) · Microsoft PowerPoint - cpro1-sample.pptx Author: noguchi Created Date: 6/6/2013 12:32:57 PM ...

意図 目標意図・目標

• 意図・目標– ポインタの概念を学習し,基本型のポインタ及び配列を扱ポインタの概念を学習し,基本型のポインタ及び配列を扱う関数を設計・実装できるようになります(ただし,ポインタ自由自在(1)では動的メモリ確保は扱わない).G i ポインタ( id*)を学習して 任意の型に対応する– Genericポインタ(void*)を学習して,任意の型に対応するように一般化した関数を設計・実装します.

• 学習項目• 学習項目– 変数とポインタ,ポインタ演算子– sizeof演算子とポインタ– sizeof演算子とポインタ– 関数とポインタ(関数の引数,返り値として)– ポインタと配列ポインタと配列– Genericポインタ(void*)

Copyright (C) 2013 HEPT Consortium 2

Page 3: C プグ グプログラミングコース ポインタ自由自在(1) · Microsoft PowerPoint - cpro1-sample.pptx Author: noguchi Created Date: 6/6/2013 12:32:57 PM ...

本日の到達目標課題本日の到達目標課題

問題:配列を使ったスタック(push, pop, peek, isEmpty)を設計・実装します.ライブラリとして使いたいので,“複数のスタ クを使いたい” という要望に応えてくださいスタックを使いたい”,という要望に応えてください.

1 i 型を対象としたスタ ク関数及びそのテストを設計して1. int型を対象としたスタック関数及びそのテストを設計してください.設計した関数を実装しテストしてください.

2 文字列(要するにchar型のポインタ)を対象としたスタック2. 文字列(要するにchar型のポインタ)を対象としたスタック関数及びそのテストを設計してください.設計した関数を実装しテストしてください.実装

3. 任意の型に対応したスタック関数及びそのテストを設計してください.設計した関数を実装しテストしてください.

Copyright (C) 2013 HEPT Consortium 3

Page 4: C プグ グプログラミングコース ポインタ自由自在(1) · Microsoft PowerPoint - cpro1-sample.pptx Author: noguchi Created Date: 6/6/2013 12:32:57 PM ...

開発環境開発環境

• Eclipse IDE for C/C++ Developers– http://www.eclipse.org/

• CygwinCygwin– http://www.cygwin.org/

Copyright (C) 2013 HEPT Consortium 4

Page 5: C プグ グプログラミングコース ポインタ自由自在(1) · Microsoft PowerPoint - cpro1-sample.pptx Author: noguchi Created Date: 6/6/2013 12:32:57 PM ...

変数とポイ タ変数とポインタ

Copyright (C) 2013 HEPT Consortium 5

Page 6: C プグ グプログラミングコース ポインタ自由自在(1) · Microsoft PowerPoint - cpro1-sample.pptx Author: noguchi Created Date: 6/6/2013 12:32:57 PM ...

意図 目標意図・目標

• 基本型変数とポインタ変数のモデルをイメージできる.

• 変数(基本型変数とポインタ変数の両方)と演算子を• 変数(基本型変数とポインタ変数の両方)と演算子を使った演算操作をイメージできる.

– 基本型の変数と,ポインタとの関係を把握することで,任意の変数とポインタのモデルをイメ ジできるようになる意の変数とポインタのモデルをイメージできるようになる.

– ポインタ演算子の役割を把握し,ソースコード上の式とモデルとの対応付けができるようになるデルとの対応付けができるようになる.

– ポインタを含む変数とメモリ領域の関係を把握することでsizeof演算子を扱えるようになるsizeof 演算子を扱えるようになる

Copyright (C) 2013 HEPT Consortium 6

Page 7: C プグ グプログラミングコース ポインタ自由自在(1) · Microsoft PowerPoint - cpro1-sample.pptx Author: noguchi Created Date: 6/6/2013 12:32:57 PM ...

ポインタの演算ポインタの演算address value

0x1000 0xFF

0x1001 0x00arr[0]• ポインタに整数nの加算を

行うとデータ型のByte数 * n0x1002 0x21

0x1003 0xF3arr[1]

行うとデ タ型のByte数 nだけポインタのアドレスが変化する(=型の違いは自

0x1004 0xE0

0x1005 0xA3arr[2]

変化する( 型の違いは自動的に加味されます)

short arr[] = {1,2,3};short* arr ptr = &arr[0];

0x1006 0x00

0x1007 0x00arr ptrshort  arr_ptr  &arr[0];

printf( “%d¥n”, *arr_ptr );printf( “%d¥n”, *(arr ptr+1));

0x1008 0x10

0x1009 0x00

0 100 0 19

arr_ptr

p ( , ( _p ));printf( “%d¥n”, *(arr_ptr+2));

0x100a 0x19

0x100b 0xA7

0x100c 0xff0x100c 0xff

0x100d 0xcfCopyright (C) 2013 HEPT Consortium 7

Page 8: C プグ グプログラミングコース ポインタ自由自在(1) · Microsoft PowerPoint - cpro1-sample.pptx Author: noguchi Created Date: 6/6/2013 12:32:57 PM ...

サンプルですので詳細は省略します

Copyright (C) 2013 HEPT Consortium 8

Page 9: C プグ グプログラミングコース ポインタ自由自在(1) · Microsoft PowerPoint - cpro1-sample.pptx Author: noguchi Created Date: 6/6/2013 12:32:57 PM ...

関数とポイ タ関数とポインタ

Copyright (C) 2013 HEPT Consortium 9

Page 10: C プグ グプログラミングコース ポインタ自由自在(1) · Microsoft PowerPoint - cpro1-sample.pptx Author: noguchi Created Date: 6/6/2013 12:32:57 PM ...

意図 目標意図・目標

• 引数にポインタを用いることで,呼び出し元に副作用を与えることのできる関数を設計します副作用を与えることのできる関数を設計します.

• 戻り値にポインタを用いた場合に 呼び出し元戻り値にポインタを用いた場合に,呼び出し元に安心して利用できる戻り値と,典型的なバグの原因となる戻り値の違いを把握しますの原因となる戻り値の違いを把握します.

• 典型的な引数・戻り値のパターンの利点と欠• 典型的な引数・戻り値のパタ ンの利点と欠点を整理します.

Copyright (C) 2013 HEPT Consortium 10

Page 11: C プグ グプログラミングコース ポインタ自由自在(1) · Microsoft PowerPoint - cpro1-sample.pptx Author: noguchi Created Date: 6/6/2013 12:32:57 PM ...

サンプルですので詳細は省略します

Copyright (C) 2013 HEPT Consortium 11

Page 12: C プグ グプログラミングコース ポインタ自由自在(1) · Microsoft PowerPoint - cpro1-sample.pptx Author: noguchi Created Date: 6/6/2013 12:32:57 PM ...

配列とポイ タ配列とポインタ

Copyright (C) 2013 HEPT Consortium 12

Page 13: C プグ グプログラミングコース ポインタ自由自在(1) · Microsoft PowerPoint - cpro1-sample.pptx Author: noguchi Created Date: 6/6/2013 12:32:57 PM ...

意図 目標意図・目標

• 配列の添字のインクリメントとポインタのインクリメントが等価であることを学習しますクリメントが等価であることを学習します.

• 多次元配列(特に2次元配列)とポインタの配列について学習し,その違いを把握することで 必要に応じて適したデータ構造を選択しで,必要に応じて適したデ タ構造を選択し,また,適切な方法で操作できるようになる.

関数の引数として配列を指定した場合の典• 関数の引数として配列を指定した場合の典型的なインタフェース,配列操作のパターンを学習し,適切に関数を設計できるようになる.

Copyright (C) 2013 HEPT Consortium 13

Page 14: C プグ グプログラミングコース ポインタ自由自在(1) · Microsoft PowerPoint - cpro1-sample.pptx Author: noguchi Created Date: 6/6/2013 12:32:57 PM ...

サンプルですので詳細は省略します

Copyright (C) 2013 HEPT Consortium 14

Page 15: C プグ グプログラミングコース ポインタ自由自在(1) · Microsoft PowerPoint - cpro1-sample.pptx Author: noguchi Created Date: 6/6/2013 12:32:57 PM ...

多次元配列とポインタの配列多次元配列とポインタの配列

char** pp = pointerArray;i tf("% ¥ " * ) 2次元配列とは異なりprintf("%s¥n", *pp);

printf("%s¥n", *(pp+1));

2次元配列とは異なりポインタの配列だとこの操作ができるp ( , (pp ));

printf(“%s¥n”, *(pp+2));

Y a i z u ¥0

Y u i ¥0

pointerArray

F u j i ¥0

S h i z u o k a ¥0Copyright (C) 2013 HEPT Consortium 15

Page 16: C プグ グプログラミングコース ポインタ自由自在(1) · Microsoft PowerPoint - cpro1-sample.pptx Author: noguchi Created Date: 6/6/2013 12:32:57 PM ...

サンプルですので詳細は省略します

Copyright (C) 2013 HEPT Consortium 16

Page 17: C プグ グプログラミングコース ポインタ自由自在(1) · Microsoft PowerPoint - cpro1-sample.pptx Author: noguchi Created Date: 6/6/2013 12:32:57 PM ...

ポイ タGENERICポインタ(VOID*)

Copyright (C) 2013 HEPT Consortium 17

Page 18: C プグ グプログラミングコース ポインタ自由自在(1) · Microsoft PowerPoint - cpro1-sample.pptx Author: noguchi Created Date: 6/6/2013 12:32:57 PM ...

意図 目標意図・目標

• Generic ポインタ (void*) と基本型のポインタとの違いを理解し G i ポインタを使ったプログの違いを理解し,Genericポインタを使ったプログ

ラミングで気をつけなければならない点を整理します.

• 異なる引数型の関数を(もし それが同等の機• 異なる引数型の関数を(もし,それが同等の機能を実現するもので,異なる関数になっているのが型 差異によるも あるならば) ポが型の差異によるものであるならば)Generic ポインタ (void*)を活用して任意の型に対応するよ( )を活用 すうに一般化した関数へと再設計します.

Copyright (C) 2013 HEPT Consortium 18

Page 19: C プグ グプログラミングコース ポインタ自由自在(1) · Microsoft PowerPoint - cpro1-sample.pptx Author: noguchi Created Date: 6/6/2013 12:32:57 PM ...

サンプルですので詳細は省略します

Copyright (C) 2013 HEPT Consortium 19

Page 20: C プグ グプログラミングコース ポインタ自由自在(1) · Microsoft PowerPoint - cpro1-sample.pptx Author: noguchi Created Date: 6/6/2013 12:32:57 PM ...

まとめまとめ

• ポインタ自由自在(1)の意図・目標

ポインタの概念を学習し 基本型のポインタ及び– ポインタの概念を学習し,基本型のポインタ及び配列を扱う関数を設計・実装できるようになります(ただし ポインタ自由自在(1)では動的メモリ確(ただし,ポインタ自由自在(1)では動的メモリ確保は扱わない).

ポ タ を学 任意– Genericポインタ(void*)を学習して,任意の型に対応するように一般化した関数を設計・実装します.

• 今後の予定(ポインタに関わるところでは)関数ポインタ → 関数自由自在– 関数ポインタ → 関数自由自在

– 動的メモリ確保 → ポインタ自由自在(2)

Copyright (C) 2013 HEPT Consortium 20

Page 21: C プグ グプログラミングコース ポインタ自由自在(1) · Microsoft PowerPoint - cpro1-sample.pptx Author: noguchi Created Date: 6/6/2013 12:32:57 PM ...

参考文献参考文献

• B.W. カーニハン (著), D.M. リッチー (著), 石田晴久 (訳) : “プログラミング言語C”, 共立出版, 1989.

• Steve Oualline (著), 望月康司 (訳), 谷口功 (訳) : “C実践プログラミング”, オライリー・ジャパン, 1998.P d Li d (著) 梅原系 (訳) “エキスパ トCプ• Peter van der Linden (著), 梅原系 (訳) : “エキスパートCプログラミング―知られざるCの深層”, アスキー, 1996.

• 結城浩: “新版C言語プログラミングレッスン入門編” ソフト• 結城浩:  新版C言語プログラミングレッスン入門編 , ソフトバンククリエイティブ, 2006.

• 結城浩: “新版C言語プログラミングレッスン文法編” ソフト結城浩:  新版C言語プログラミングレッスン文法編 , ソフトバンククリエイティブ, 2006.

• ニクラウス・ヴィルト, 片山卓也: “アルゴリズム+データ構造,片 卓 構= プログラム”,日本コンピュータ協会, 2002.

Copyright (C) 2013 HEPT Consortium 21