• 検索結果がありません。

PowerPoint プレゼンテーション

N/A
N/A
Protected

Academic year: 2022

シェア "PowerPoint プレゼンテーション"

Copied!
55
0
0

読み込み中.... (全文を見る)

全文

(1)

講座準備

講座資料は次の

URL

から

DL

可能。

https://goo.gl/JNRFth

1

(2)

ポインタ講座

2017/01/06,09 fumi

2

(3)

はじめに

ポインタは

C

言語において理解が難しい とされる。

そのポインタを理解することを目的と する。

講座は

1

日で行うので、詳しいことは調 べること。

3

(4)

はじめに

みなさん復習はしましたか?

4

(5)

&演算子

&演算子を使うと、変数のアドレスが 得られる。

例:int fumi = 23;

printf(“%d ¥n”, &fumi);

// 変数fumiのアドレスが表示される。

5

(6)

演習 1- アドレスを表示しよう

自分で変数を作り、その中に値を代入。

printf

でアドレスとその内容を表示。

イメージをつかもう。

6

(7)

演習 1- アドレスを表示しよう

7 実行結果

ソースコード

(8)

そもそもポインタとは?

8

(9)

ポインタとは

アドレスを格納できる特殊な変数のこ と。

9

(10)

メリット

上手く使うと実行速度が向上する。

メモリ効率が向上する。

コードの柔軟性が向上する。

詳しいことは調べてみよう。

10

(11)

デメリット

可読性が低くなる。

誤った使い方をすると危険である。

慣れてないと混乱しやすい。

11つ整理すること。

11

(12)

理解は難しい?

苦手意識を持ったら終わり。

他のことと混ざらないように。

何が異なるのか?よく考える事。

実際は難しくない。

12

(13)

u

ポインタのイメージ

変数などのアドレスを保存できる型の こと。

イメージ

int f = 23;

Int* u;

u = &f;

番地 内容 (変数名) 5022

5023 23 f,*u 5024

5025 5023 u

5026 アドレス 5023 5025

ufを指している!

ポインタみたい!

※イメージ

5023

13

f

23

(14)

使い方(1)

*

変数名

または

*

変数名

でポ インタ変数として宣言できる。

変数名

の状態でアドレスモード

“*

変数名

の状態で参照モード

int* fumi; // ポインタ変数の宣言

後ほど説明 するよ!

14

(15)

使い方(2)

必ず

NULL

で初期化をすること。

: int *fumi =NULL;

C++11

以降は

nullptr

が追加されている。

: int *fumi = nullptr;

Visual Studioではこちらを推奨します。

詳しいことは調べてみよう。

15

(16)

*について(1)

C言語では“*”マークは様々な場所で使わ れる。

わかりにくくなる原因の1つ。

3つ順番に説明するので混乱しないように。

1つ目は?

かけ算の*。

例:fumi = 2*3;

乗算演算子という。

16

(17)

*について(2)

残りの2つが混乱しやすい。

2つ目は?

ポインタ変数の宣言の時に使われる*。

例: int* fumi;

// “fumi”というポインタ変数を宣言。

17

(18)

*について(3)

3つ目は?

ポインタ変数の参照の時に使われる*。

間接参照演算子という。

例:int fumi = 0;

int *sofume = &fumi;

// sofumefumiを指すポインタ

*sofume = 23;

// sofume(fumi)23を代入

18

(19)

演習 2- ポインタを使う

int

型の変数とポインタ変数を定義し、

ポインタ変数の中に変数のアドレスを入 れてみよう。

ポインタ変数を元にデータを変化させ てよう。

19

(20)

演習 2- ポインタを使う

20 実行結果

ソースコード

(21)

重要なこと(1)

ポインタを使うときは、必ず

NULL

で初期化 すること。

初期化なしポインタはどこかを指している。

自動的に初期化される場合も(環境依存)。

Visual Studioだと?

21

(22)

重要なこと(2)

関係のないアドレスの内容を上書きし ないように気をつけること。

無意識に誤ったアドレスを入れてしまうこ とがあり得る。

Visual Studioは検知してくれる。

ポインタ変数にも型判別がある。

22

(23)

全てのアドレス

プログラムは全てメモリ上にある。

なら、変数も配列も関数も構造体も全 てメモリ上にある。

ということはポインタが使えるのでは?

23

(24)

配列(1)

実は配列の変数には、宣言時に確保さ

れた領域の先頭のアドレスが入っている。

例:int array[5];

24

番地 内容 (変数名) 5022

5023 array

5024 5025 5026 5027 5028

5個分の領域 が確保される

※イメージ

(25)

配列(2)

領域を

5

つ確保と言うが、実際は型に よって確保される領域の数は変わる。

例:

char 1byte, int 4byte, etc…

サイズは環境依存。講座はこの例に従う。

25

(26)

配列(3)

配列の

N

番目のデータの場所は

変数のアドレス+型の大きさ×

N

: array 4byte × 3

// int型のarray[3]

// 合計で12個の領域が確保される。

26

(27)

[] 演算子

先頭アドレスから距離を指定。

距離は 型の大きさ×[]の中の数字

: int array[3]; // 4byte * 3の領域を確保。

配列参照演算子という。

ポインタ演算の簡易表記。

27

(28)

ポインタは何に使う?

ポインタはどこで使うべき?

何のために必要?

例えば・・・

28

(29)

配列のメモリ確保

配列は、

[]

内の数値の分だけメモリを確 保してくれた。

[]の中身は定数でなければならない(環境 依存)。

変数を使いたい時や実行まで定まらな い時は?

29

(30)

メモリの動的確保

malloc

という関数を用いると必要な分

だけメモリ(配列)を確保できる。

malloc

関数

void *malloc(size_t size);

// sizeバイト分のメモリを確保し先頭のア

ドレスを返す。

stdlib.hをインクルードする必要がある。

確保に失敗するとNULLが返ってくる。

30

(31)

変数の大きさ

普段の配列(静的確保)では、

[]

演算子 がバイト数を計算してくれていた。

int4byte

どうやって大きさを判断する?

31

(32)

型ごとの大きさを調べる

sizeof

演算子

sizeof(,変数等)でサイズを調べられる

: sizeof (int)

// int型のバイト数が得られる。

32

(33)

演習 3- 色んな型のサイズ

Sizeof

演算子を使って様々な型のサイズ

を調べてみよう!

char, int, float, double, etc…

33

(34)

演習 3- 色んな型のサイズ

34 ソースコード

実行結果 ソースコード

(35)

メモリの動的確保をしてみる

size

の求め方はわかった。

void *malloc(size_t size);

voidポインタ型?

合った型にキャストする必要がある。

: int *data

= (int *) malloc (sizeof(int) * n);

35

(36)

メモリの解放

malloc

関数で確保したメモリは、

free

関数で解放する。

解放しないと、ずっとメモリに残ったまま になる。

実行終了時には消えるが、解放することに よって無駄なメモリを使わない。

free(

ポインタ変数

);

: free(ptr);

36

(37)

演習 4- 配列の動的確保

1~10

の好きな数字を入力し、その分だ け配列を作る。

その後順番に数値を入力し、最後に全 ての値を表示する。

37

(38)

時間がある人向け

二次配列を動的確保してみよう。

ポインタのポインタ

構造体を動的確保してみよう。

メンバ変数にアクセスするには、.(ドッ ト)演算子ではなく->(アロー)演算子を 用いる。

38

(39)

演習 4- 配列の動的確保

39 ソースコード

(40)

関数の返り値

今まで使ってきた関数は、返り値を

1

つ のみしか指定できなかった。

ポインタを使うといくつも返せる?

今までの関数

int add(int a, int b){

return a+b;

} 40

(41)

複数の戻り値

ポインタを使うことによって実現でき る。

アドレスを渡せば変数の有効範囲が変わら ない。

void func (int* a, int* b); // ポインタ渡し

// intポインタ型が仮引数

// 実引数はアドレス

41

(42)

演習 5- 複数の戻り値を扱う

int

型の変数を

2

つ渡すと、その内容を入 れ替えてくれる関数を作ろう。

a = 3, b = 5 → a = 5, b = 3

さっきの関数を参考にしてみよう。

42

(43)

演習 5- 複数の戻り値を扱う

43 ソースコード

実行結果

(44)

配列を引数にする

配列を引数に持った関数を作るには?

変数には配列の先頭のアドレスが入っ ている。

44

(45)

演習 6- 引数が配列の関数

演習

4

を元に、配列の中身の平均値を求 め出力する関数を作ろう。

書式

void printAve(____, int size);

____ の部分は自分で考えよう。

45

(46)

時間がある人向け

二次配列を引数に持つ関数を作ってみ よう。

構造体を引数に持つ関数を作ってみよ う。

46

(47)

演習 6- 引数が配列の関数

47 ソースコード

実行結果

(48)

まとめ

C

言語の特徴であるポインタの概念を理

解すると様々なことができるようになる。

マスターすると、速度向上やメモリ節 約などにつながる。

48

(49)

C++ の世界へ

この講座では

C

を主に扱った。

より拡張した言語に

C++

というものが ある。

C++は非常に便利。

今回の内容を簡単に、なおかつスマー トに書けるようになる。

49

(50)

他の言語の世界へ

C

言語にはポインタという概念があり、

柔軟に扱うことができる。

これらをあまり扱わずに済む言語もあ る。

→C#,etc..

それぞれの言語の特徴や利点を調べて みよう。

君に合った言語を見つけよう。

50

(51)

さいごに

これだけが全てではない。他にもたく さん

。(時間の都合等)

const修飾子を用いると良い。

C++だと参照渡しという方法がある。Etc..

C#

C++

もオブジェクト指向である。

(参考サイトをぜひ!)

51

(52)

やってほしいこと

今まで自分が出た講座をよく復習する こと。

講座で扱ってないことに挑戦すること。

時間ある人向けの問題とか。

他にどんなことができるか調べること。

ヘッダーファイルを使うとどれだけ便利に なる?

52

(53)

参考サイト(ポインタ関係)

http://white-bear.info/archives/583

https://www.sgnet.co.jp/c/6-3.html

http://9cguide.appspot.com/15- 05.html

http://qiita.com/go_astrayer/items/6 afb1592a8a5763fede1

53

(54)

参考サイト( C++ 関係)

http://www.asahi-net.or.jp/~yf8k- kbys/newcpp0.html

http://www7b.biglobe.ne.jp/~robe/

cpphtml/

54

(55)

参考サイト(その他)

https://qiita.com/

http://qiita.com/hirokidaichi/items/5 91ad96ab12938878fe1

http://tdak.hateblo.jp/entry/2014040 6/1396773476

55

参照

関連したドキュメント

●Gartner Magic QuadrantにてクラウドHCM Suiteにおけるリーダーの評価.. Copyright © 2022 Nomura System Corporation Co, Ltd. All Rights Reserved.. Copyright © 2022 Nomura

支援要請入力詳細 13ページ 患者受入入力詳細 14ページ 支援可能スタッフ3.

and Kristjan Vassil (2010) Internet voting in Estonia : a comparative analysis of four elections since 2005 : report for the Council of Europe”Report for the Council of Europe.

2021年1月15日にHa Tay Pharmaceutical Joint Stock Company(

がん化学療法に十分な知識・経験を持つ医師のもとで、本剤の投与が適切と判断さ

日医かかりつけ医機能研修制度 令和 年度応用研修会 「メタボリックシンドロームからフレイルまで」 飯島勝矢 Tamakoshi A ら. Obesity

(Immuno Checkpoint Inhibitor Proper use Support team

剣道部 柔道部 硬式野球部 卓球部 水泳部 ラグビー部 ソフトテニス部 テニス部 ハンドボール部 サッカー部 バドミントン部