C‐プログラミングコース
プ ググ
ポインタ自由自在（１）Yasuhiro Noguchi
th R
theResearchh Institute
I tit t forf Embedded
E b dd d SSystems
tArchitects
A hit t (RIESA)
Faculty of Informatics, Shizuoka University
HEPT Consortium

Copyright (C) 2013 HEPT Consortium

1

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

• 学習項目– 変数とポインタ，ポインタ演算子– sizeof演算子とポインタ– 関数とポインタ（関数の引数，返り値として）– ポインタと配列– Genericポインタ(void*)
Copyright (C) 2013 HEPT Consortium2本日の到達目標課題
問題： 配列を使ったスタック（push, pop, peek, isEmpty）を設計・実装します． ライブラリとして使いたいので，“複数のスタ クを使いたい” という要望に応えてください
スタックを使いたい”，という要望に応えてください．
1 iint型を対象としたスタック関数及びそのテストを設計して1.
型を対象としたスタ ク関数及びそのテストを設計してください．設計した関数を実装しテストしてください．
2 文字列（要するにchar型のポインタ）を対象としたスタック
2.
関数及びそのテストを設計してください．設計した関数を実装実装しテストしてください．
3. 任意の型に対応したスタック関数及びそのテストを設計してください．設計した関数を実装しテストしてください．

Copyright (C) 2013 HEPT Consortium

3

開発環境
• Eclipse IDE for C/C++ Developers– http://www.eclipse.org/• Cygwin– http://www.cygwin.org/

Copyright (C) 2013 HEPT Consortium4変数とポイ タ
変数とポインタ

Copyright (C) 2013 HEPT Consortium5意図 目標意図・目標• 基本型変数とポインタ変数のモデルをイメージできる．
• 変数（基本型変数とポインタ変数の両方）と演算子を使った演算操作をイメージできる．
– 基本型の変数と，ポインタとの関係を把握することで，任意の変数とポインタのモデルをイメ ジできるようになる
意の変数とポインタのモデルをイメージできるようになる．
– ポインタ演算子の役割を把握し，ソースコード上の式とモデルとの対応付けができるようになる．
デルとの対応付けができるようになる– ポインタを含む変数とメモリ領域の関係を把握することでsizeof 演算子を扱えるようになる

Copyright (C) 2013 HEPT Consortium6ポインタの演算• ポインタに整数nの加算を
arr[0]
行うとデタ型のByte数 * n
行うとデータ型のByte数
だけポインタのアドレスがarr[1]変化する（＝型の違いは自変化する（型の違いは自動的に加味されます）
arr[2]
short arr[] = {1,2,3};
short* arr_ptr
shortarr ptr = &arr[0];printf( “%d¥n”, *arr_ptr );p( _p));
printf(( “%d¥n”,, *(arrptr+1));
printf( “%d¥n”, *(arr_ptr+2));

arr ptr
arr_ptr

Copyright (C) 2013 HEPT Consortium

address

value

0x10000xFF

0x1001

0x00

0x10020x21

0x10030xF30x1004

0xE00x10050xA30x10060x00

0x10070x000x1008

0x10

0x10090x00

0x100a
0 100

0x19
0 19

0x100b0xA70x100c0xff

0x100d0xcf 7

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

Copyright (C) 2013 HEPT Consortium8関数とポイ タ
関数とポインタ

Copyright (C) 2013 HEPT Consortium9意図 目標意図・目標• 引数にポインタを用いることで，呼び出し元に副作用を与えることのできる関数を設計します．
副作用を与えることのできる関数を設計します• 戻り値にポインタを用いた場合に，呼び出し元戻り値にポインタを用いた場合に 呼び出し元に安心して利用できる戻り値と，典型的なバグの原因となる戻り値の違いを把握します．の原因となる戻り値の違いを把握します• 典型的な引数・戻り値のパタ
典型的な引数・戻り値のパターンの利点と欠ンの利点と欠点を整理します．

Copyright (C) 2013 HEPT Consortium

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

Copyright (C) 2013 HEPT Consortium11配列とポイ タ配列とポインタ

Copyright (C) 2013 HEPT Consortium12意図 目標意図・目標• 配列の添字のインクリメントとポインタのインクリメントが等価であることを学習します．
クリメントが等価であることを学習します• 多次元配列（特に２次元配列）とポインタの配列について学習し，その違いを把握すること
で 必要に応じて適したデータ構造を選択しで，必要に応じて適したデタ構造を選択し，また，適切な方法で操作できるようになる．
• 関数の引数として配列を指定した場合の典型的なインタフェース，配列操作のパターンを学習し，適切に関数を設計できるようになる．
Copyright (C) 2013 HEPT Consortium

13

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

Copyright (C) 2013 HEPT Consortium14多次元配列とポインタの配列
char** pp = pointerArray;
printf("%s¥n",i tf("% ¥ " **pp);)printf("%s¥n",p(, *(pp+1));(pp ));
printf(“%s¥n”, *(pp+2));２次元配列とは異なりポインタの配列だとこの操作ができるY

pointerArrayaYFShiuzjuioiuziu

¥0

¥0

¥0ka

Copyright (C) 2013 HEPT Consortium¥015

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

Copyright (C) 2013 HEPT Consortium

16

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

Copyright (C) 2013 HEPT Consortium17意図 目標意図・目標• Generic ポインタ (void*) と 基本型のポインタとの違いを理解し Gの違いを理解し，Genericポインタを使ったプログ
i ポインタを使ったプログ
ラミングで気をつけなければならない点を整理します．
• 異なる引数型の関数を（もし，それが同等の機異なる引数型の関数を（もし それが同等の機能を実現するもので，異なる関数になっているのが型 差異によるもが型の差異によるものであるならば）Genericあるならば）ポインタ (void*)を活用して任意の型に対応するよ()を活用
すうに一般化した関数へと再設計します．
Copyright (C) 2013 HEPT Consortium18

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

Copyright (C) 2013 HEPT Consortium

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

• 今後の予定（ポインタに関わるところでは）– 関数ポインタ → 関数自由自在– 動的メモリ確保 → ポインタ自由自在（２）Copyright (C) 2013 HEPT Consortium

20参考文献• B.W. カーニハン (著), D.M. リッチー (著), 石田晴久 (訳) :“プログラミング言語C”, 共立出版, 1989.
• Steve Oualline (著), 望月康司 (訳), 谷口功 (訳) : “C実践プログラミング”, オライリー・ジャパン, 1998.
• PeterPvan derd Linden
Li d (著),(著) 梅原系 (訳) : “エキスパ“エキスパートCプトCプ
ログラミング―知られざるCの深層”, アスキー, 1996.
• 結城浩: “新版C言語プログラミングレッスン入門編”
新版C言語プログラミングレッスン入門編 , ソフト
バンククリエイティブ, 2006.
• 結城浩: “新版C言語プログラミングレッスン文法編”
新版C言語プログラミングレッスン文法編 , ソフト
バンククリエイティブ, 2006.
• ニクラウス・ヴィルト,, 片片山卓也:
卓 “アルゴリズム+データ構造
構= プログラム”,日本コンピュータ協会, 2002.
Copyright (C) 2013 HEPT Consortium

21