SlideShare a Scribd company logo
ポインタの話をしよう
ロボ研 非定期勉強会
本題に入る前に
• 多くの人がポインタで挫折しています
• 「ポインタを理解してしまった人」は

「ポインタを勘違いしている」状態を思い出
すことができません
• どのような勘違いをしていたのか

教えてください(ブログのネタになります)
今日話すこと
1. ポインタって本当に使えないとダメ?

2. 【部内の】ポインタについて思うこと【反応】
3. これだけは使えるようになってください
1. ポインタって本当に

使えないとダメ?
まず結論から
• マスターしなくてもだいたい大丈夫です
• ただし「その手の業界」に行く人は

マスターしてください
ポインタは何のためにあるか
→ メモリを直接扱うためです
なぜメモリを直接扱う必要が?
• 組み込み界隈の人…

デバイスの状態の読み書きをメモリアドレスを指定
して行います (Memory Mapped IO)
• OS界隈の人…

ソフトウェアが使用するメモリの

割り当てを管理する必要があります
• メモリの番地を指定してゴリゴリやる機能が必要
なんでそんなヤバい機能が?

ほとんどの人にはいらなくね?
→ ググってみましょう
「もともとシステムの記述用に開発された」

(引用元:e-Words)
要するに…
• ポインタは「プログラミングを楽にする」

といった理想的な目的で導入されているわけ
ではありません(お察しください)
• 多くの人にとって、ポインタの機能はオーバー
スペックです
• C言語は決して万人向きではない
何のためにC言語を使うのですか
• 極端な話、「ポインタを使うためにC言語を使
う」であるべき
• 「C言語はプログラミングの基本だから最初に
マスターするべき」的な思想はヤバいと

思っています
2. 【部内の】ポインタについて

思うこと【反応】
これは何?
ポインタに関する勘違いのあるあるネタを

みんなで共有するコーナーです
!
自由に発言してください
よく参考書で見るコード(1)
int x, *p;
x = 1;
p = &x;
*p = 2;
printf("x = %dn", x);
ありがちな反応(1)
「何がうれしいのか分かりません」
よく参考書で見るコード(2)
void swap(int *x, int *y) {
int tmp = *x;
*x = *y;
*y = tmp;
}
ありがちな反応(2)
そもそも

void swap(int x, int y) {

int tmp = x;

x = y;

y = tmp;

}



で動くと思っていたので……
(1)に関して
• 例が悪いです
• メリットを感じられなくても、

何も問題ありません
(2)に関して
• 関数呼び出しとスタックに関する話をする必
要があります
• スライド作るのが面倒でした
• ホワイトボードで話をします
考えられる反応
「ぜんぶ参照渡しにしたら良いんじゃないん
ですか?」
!
→ そういう言語もあります。
最近の主流は「だいたい参照渡し」
3. これだけは使えるように

なってください
結局ポインタはどう使えば…
• 代表的な利用パターンを4つに分類しました
• この4つが使いこなせれば、基本的に困るこ
とは無いはず
• 使っているうちに、他の場面でも対応できる
ようになるはず
4つの利用パターン
1. 配列or構造体を入力として関数に渡す
2. 配列or構造体を出力として関数に渡す
3. 配列or構造体を入出力として関数に渡す
4. 複数の値を関数から取得
1. 配列or構造体を

入力として関数に渡す
// C言語標準ライブラリ	
int puts(const char *s);	
size_t strlen(const char *s);	
int strcmp(const char *s1, const char *s2);	
!
// Win32API	
ATOM RegisterClassEX(const WNDCLASSEX *lpwcx);
2. 配列or構造体を

出力として関数に渡す
// C言語標準ライブラリ	
char *gets(char *s);	
void memset(void *s, int c, size_t n);	
void strcpy(char *s1, const char *s2);	
!
// Win32API	
BOOL GetWindowRect(HWND hWnd, 	RECT *lpRect);	
BOOL GetCursorPos(POINT *lpPOINT);
3. 配列or構造体を

入出力として関数に渡す
// C言語標準ライブラリ	
void qsort(void *data, size_t num_memb, size_t elem_size,	
int (*cmp)(const void *, const void *));
4. 複数の値を関数から取得
// C言語標準ライブラリ	
int scanf(...);
演習のお時間です
• 問題をいくつか作りました
• 関数を使う問題
• 関数を作る問題
• どのパターンに当てはまるのかも

答えてください
演習問題
配列の最大値を返す関数	
int max_element(const int *data, int n);	
があるとします。	
!
int xs[] = { 1, 1, 4, 5, 1, 4 };	
の最大値を求める処理を書いてください。
演習問題
配列の中に特定の値xがいくつ含まれているか数える関数countを実装してください。	
!
int x = 4;	
int xs[] = { 1, 1, 4, 5, 1, 4 };	
int k;	
!
k = count(xs, /* 配列の要素数 = */ 6, x);	
!
みたいに呼び出したいです。
演習問題
配列に連番を代入する関数	
void iota(int *data, int n);	
があるとします。	
!
int xs[5]; の中身を { 0, 1, 2, 3, 4 }; にしてください。
演習問題
配列を特定の値xで埋める関数fillを定義してください。	
!
int x = 72;	
int xs[10];	
!
fill(xs, /* 配列の要素数 = */ 10, x);	
!
みたいに呼び出したいです。
演習問題
渡された文字列に含まれるアルファベットをすべて大文字に変更する関数
to_upper_stringを定義してください。	
!
char s[] = "u-hyogo";	
to_upper_string(s);	
puts(s); // U-HYOGO	
!
1文字がアルファベットかどうかの判定はint isalpha(int c)	
アルファベット1文字を大文字に変換するにはint toupper(int c)	
を使うと便利です。	
!
※isalphaやtoupperはctype.hに含まれています。
演習問題
配列の連続する重複要素を消してくれる関数	
int unique(int *data, int n);	
があり { 1, 1, 2, 1, 3, 3, 3 } は { 1, 2, 1, 3 } になるとします。	
戻り値は消した後の要素数です。	
!
int xs[10] = { 1, 1, 1, 2, 3, 3, 3, 3, 4, 4 };	
の連続する重複要素を消してから	
消した後の配列を表示する処理を書いてください。
演習問題
直交座標で表される点(x,y)を極座標(r,theta)に	
変換する関数to_polarを実装してください。	
!
引数のデザインはお任せします。	
偏角はatan(y/x)ではなくatan2(y,x)を使って計算しましょう。
演習問題
配列の最大値とそのインデックスを計算する関数	
int max_argument(const int *data, int n, int *max_value);	
があるとします。	
!
max_valueにintのポインタを渡すと最大値が代入されます。	
ただし最大値が不要な場合はNULLを渡せばOKです。	
!
int xs[6] = { 1, 1, 4, 5, 1, 4 };	
の最大値のインデックスを求める処理を書いてください。
演習問題
OpenCVでは画像の色表現を変換する関数cvCvtColorを使って	
カラー画像をグレースケール画像に変換します。	
!
void cvCvtColor(const IplImage *src, IplImage *dst, int code);	
!
IplImage *color = cvLoadImage("azunyan.jpg", CV_LOAD_IMAGE_COLOR);	
IplImage *gray = cvCreateImage(cvGetSize(color), 	
IPL_DEPTH_8U, 1);	
// グレースケールに変換する処理を書いてください	
// codeはCV_BGR2GRAYを使います	
!
※実際はメモリを解放する処理が必要です

More Related Content

PDF
Unity + C#講座①
PDF
Pythonの処理系はどのように実装され,どのように動いているのか? 我々はその実態を調査すべくアマゾンへと飛んだ.
PDF
Pythonのデータ型をもっと理解する
PDF
03 var array_flow_func
PDF
闇魔術を触ってみた
PDF
STLの型の使い分け(ダイジェスト版) @ Sapporo.cpp 第7回勉強会 (2014.10.18)
PDF
リテラル文字列型までの道
PDF
静的型付け言語Python
Unity + C#講座①
Pythonの処理系はどのように実装され,どのように動いているのか? 我々はその実態を調査すべくアマゾンへと飛んだ.
Pythonのデータ型をもっと理解する
03 var array_flow_func
闇魔術を触ってみた
STLの型の使い分け(ダイジェスト版) @ Sapporo.cpp 第7回勉強会 (2014.10.18)
リテラル文字列型までの道
静的型付け言語Python

What's hot (20)

PPTX
Python 学習教材
PDF
C++ Template Meta Programming の紹介@社内勉強会
PPTX
Python 学習教材 (300~309ページ)
PDF
これからの「言語」の話をしよう ―― 未来を生きるためのツール
PDF
Constexprとtemplateでコンパイル時にfizz buzz
PDF
Boost Fusion Library
PPTX
Python 学習教材 (~299ページ)
PDF
C言語の宣言読み方講座
PDF
C++のSTLのコンテナ型を概観する @ Ohotech 特盛 #10(2014.8.30)
PDF
Tokyo Sky Tree
PDF
F#入門 ~関数プログラミングとは何か~
PDF
プログラムの処方箋~健康なコードと病んだコード
PDF
Python 機械学習プログラミング データ分析ライブラリー解説編
PPTX
PHP, JavaScriptプログラマのためのC#入門
PDF
Scalaのオブジェクトの話
PDF
Template Meta Programming入門から応用まで
PDF
20170131 python3 6 PEP526
PDF
FP習熟度レベルとFSharpxのIteratee
PDF
Tensor flowを使った キュウリの仕分け あれこれ
PPTX
Effective python#28
Python 学習教材
C++ Template Meta Programming の紹介@社内勉強会
Python 学習教材 (300~309ページ)
これからの「言語」の話をしよう ―― 未来を生きるためのツール
Constexprとtemplateでコンパイル時にfizz buzz
Boost Fusion Library
Python 学習教材 (~299ページ)
C言語の宣言読み方講座
C++のSTLのコンテナ型を概観する @ Ohotech 特盛 #10(2014.8.30)
Tokyo Sky Tree
F#入門 ~関数プログラミングとは何か~
プログラムの処方箋~健康なコードと病んだコード
Python 機械学習プログラミング データ分析ライブラリー解説編
PHP, JavaScriptプログラマのためのC#入門
Scalaのオブジェクトの話
Template Meta Programming入門から応用まで
20170131 python3 6 PEP526
FP習熟度レベルとFSharpxのIteratee
Tensor flowを使った キュウリの仕分け あれこれ
Effective python#28
Ad

Similar to About Pointer (20)

PDF
解説#1 C言語ポインタとアドレス
PPTX
C言語ポインタ講座 (Lecture of Pointer in C)
PDF
C言語講習会4
PPTX
2016年第二回プレ卒研in山口研
PDF
Tora pointer3
PDF
実行時のデータ型の表現手法
PDF
研究生のためのC++ no.2
PPTX
AtCoder Beginner Contest 004 解説
PDF
C++ ポインタ ブートキャンプ
PDF
Processing
PDF
programming camp 2008, introduction of programming, algorithm
PPT
プログラミングで言いたい聞きたいこと集
PPT
プログラミングで言いたいこと聞きたいこと集
PDF
【C++BUILDER STARTER チュートリアルシリーズ】シーズン2 C++Builderの部 第5回 ‟配列と構造体„
PDF
プログラムを高速化する話
PPTX
apg4b 4.05 ポインタ
PDF
templateとautoの型推論
PPTX
Arduino 入門
PDF
PFI Seminar 2010/02/18
PDF
SSE4.2の文字列処理命令の紹介
解説#1 C言語ポインタとアドレス
C言語ポインタ講座 (Lecture of Pointer in C)
C言語講習会4
2016年第二回プレ卒研in山口研
Tora pointer3
実行時のデータ型の表現手法
研究生のためのC++ no.2
AtCoder Beginner Contest 004 解説
C++ ポインタ ブートキャンプ
Processing
programming camp 2008, introduction of programming, algorithm
プログラミングで言いたい聞きたいこと集
プログラミングで言いたいこと聞きたいこと集
【C++BUILDER STARTER チュートリアルシリーズ】シーズン2 C++Builderの部 第5回 ‟配列と構造体„
プログラムを高速化する話
apg4b 4.05 ポインタ
templateとautoの型推論
Arduino 入門
PFI Seminar 2010/02/18
SSE4.2の文字列処理命令の紹介
Ad

More from Sho IIZUKA (6)

PDF
HDDの返品保証を使ってみた
PDF
FM-indexによる全文検索
PDF
円と円の外接線の求め方
PDF
円と円の交点の求め方
PDF
勝手に解説 TopCoder Marathon Match 82 ColorLinker
PDF
grepについて
HDDの返品保証を使ってみた
FM-indexによる全文検索
円と円の外接線の求め方
円と円の交点の求め方
勝手に解説 TopCoder Marathon Match 82 ColorLinker
grepについて

About Pointer