この宣言、あなたは読めますか?

Presented by

~ちょっとだけ為になるかもしれないC言語の宣言の読み方講座~

ふじひろ

Twitter-ID
@fujihiro_sn
※注意
今回は宣言と定義の読み方講座なんで、
この二つの違いは置いときますね^^
このくらいはみんな知ってるでしょうし
ではまず、宣言(定義)とは?
• まぁ細かいことは省いて、みんな知ってるこいつらのこと
• int apple;
• char orange;

//appleはint型
//orangeはchar型

• int peach(int berr...
それくらい簡単さ!
って人もいらっしゃると思いますが…
こんな宣言がコードにあったら読めます?

• char *(*func_ptr[4])(char *string, int value);
• int (*func)(char *string);
• char *(**array[8])[2]...
実際読むのは難しいでしょ?
てことで、今回のLTは
今のような宣言を読めることを目標とします!
三つの規則通りに読めば何も怖くない!
• 宣言を読むのにあたって頭に入れておくことはたったの三つ!
• 規則1:宣言を読むときは英語で
• 規則2:トークンを読む順番
• 規則3:記号の読み方
• これだけ覚えておけば、難しい宣言がスラスラ読め...
規則1 : 宣言を読むときは英語で
• 英語のほうが簡単に宣言を読めます
• てことで簡単な例
• int apple;

//apple is int

• char orange;

//orange is char
規則1 : 宣言を読むときは英語で
• 英語のほうが簡単に宣言を読めます
• てことで簡単な例
• int apple;

//apple is int

• char orange;

//orange is char

• それだけです、は...
規則2 : 読むときの順番
• 宣言中は、下の優先順位で読んでいきましょう
1. 識別子をスタートとする
int *apple[];
2. 識別子の‘後’を見る
int *apple[];
3. 識別子の‘前’を見る
int *apple[];...
規則2 : 読むときの順番
• 宣言中は、下の優先順位で読んでいきましょう
1. 識別子をスタートとする
int *apple[];
2. 識別子の‘後’を見る
int *apple[];
3. 識別子の‘前’を見る
int *apple[];...
規則2 : 読むときの順番
• 宣言中は、下の優先順位で読んでいきましょう
1. 識別子をスタートとする
int *apple[];
2. 識別子の‘後’を見る
int *apple[];
3. 識別子の‘前’を見る
int *apple[];...
規則2 : 読むときの順番
• 宣言中は、下の優先順位で読んでいきましょう
1. 識別子をスタートとする
int *apple[];
2. 識別子の‘後’を見る
int *apple[];
3. 識別子の‘前’を見る
int *apple[];...
規則2 : 読むときの順番
• 宣言中は、下の優先順位で読んでいきましょう
1. 識別子をスタートとする
int *apple[];
2. 識別子の‘後’を見る
int *apple[];
3. 識別子の‘前’を見る
int *apple[];...
規則2 : 読むときの順番
• 宣言中は、下の優先順位で読んでいきましょう
1. 識別子をスタートとする
int *apple[];
2. 識別子の‘後’を見る
int *apple[];
3. 識別子の‘前’を見る
int *apple[];...
規則3 : 記号の読み方
• また、宣言中の記号は次のように読みましょう!
規則3 : 記号の読み方
• また、宣言中の記号は次のように読みましょう!
• 配列: []→ … an array of …

//配列の要素数は基本無視
規則3 : 記号の読み方
• また、宣言中の記号は次のように読みましょう!
• 配列: []→ … an array of …
• 例、int apple[4];

//配列の要素数は基本無視
規則3 : 記号の読み方
• また、宣言中の記号は次のように読みましょう!
• 配列: []→ … an array of …
• 例、int apple[4]; → apple is

//配列の要素数は基本無視
//まず識別子を見る
規則3 : 記号の読み方
• また、宣言中の記号は次のように読みましょう!
• 配列: []→ … an array of …
• 例、int apple[4]; → apple is an array of

//配列の要素数は基本無視
//...
規則3 : 記号の読み方
• また、宣言中の記号は次のように読みましょう!
• 配列: []→ … an array of …

//配列の要素数は基本無視

• 例、int apple[4]; → apple is an array of i...
規則3 : 記号の読み方
• また、宣言中の記号は次のように読みましょう!
• 配列: []→ … an array of …

//配列の要素数は基本無視

• 例、int apple[4]; → apple is an array of i...
規則3 : 記号の読み方
• また、宣言中の記号は次のように読みましょう!
• 配列: []→ … an array of …

//配列の要素数は基本無視

• 例、int apple[4]; → apple is an array of i...
規則3 : 記号の読み方
• また、宣言中の記号は次のように読みましょう!
• 配列: []→ … an array of …

//配列の要素数は基本無視

• 例、int apple[4]; → apple is an array of i...
規則3 : 記号の読み方
• また、宣言中の記号は次のように読みましょう!
• 配列: []→ … an array of …

//配列の要素数は基本無視

• 例、int apple[4]; → apple is an array of i...
規則3 : 記号の読み方
• また、宣言中の記号は次のように読みましょう!
• 配列: []→ … an array of …

//配列の要素数は基本無視

• 例、int apple[4]; → apple is an array of i...
規則3 : 記号の読み方
• また、宣言中の記号は次のように読みましょう!
• 配列: []→ … an array of …

//配列の要素数は基本無視

• 例、int apple[4]; → apple is an array of i...
規則3 : 記号の読み方
• また、宣言中の記号は次のように読みましょう!
• 配列: []→ … an array of …

//配列の要素数は基本無視

• 例、int apple[4]; → apple is an array of i...
規則3 : 記号の読み方
• また、宣言中の記号は次のように読みましょう!
• 配列: []→ … an array of …

//配列の要素数は基本無視

• 例、int apple[4]; → apple is an array of i...
規則3 : 記号の読み方
• また、宣言中の記号は次のように読みましょう!
• 配列: []→ … an array of …

//配列の要素数は基本無視

• 例、int apple[4]; → apple is an array of i...
規則3 : 記号の読み方
• また、宣言中の記号は次のように読みましょう!
• 配列: []→ … an array of …

//配列の要素数は基本無視

• 例、int apple[4]; → apple is an array of i...
規則3 : 記号の読み方
• また、宣言中の記号は次のように読みましょう!
• 配列: []→ … an array of …

//配列の要素数は基本無視

• 例、int apple[4]; → apple is an array of i...
とっても簡単でしょ?
てことで実際に読んでいこう!
実際に読んでみよう!
• まずはこれを読んでみよう
• char *str_ptr[4];
実際に読んでみよう!

• char *str_ptr[4];
• str_ptr is
• //まずは識別子を見る
実際に読んでみよう!

• char *str_ptr[4];
• str_ptr is an array of
• //識別子の‘後’を見る
実際に読んでみよう!

• char *str_ptr[4];
• str_ptr is an array of a pointer to
• //識別子の‘前’を見る
実際に読んでみよう!

• char *str_ptr[4];
• str_ptr is an array of a pointer to char
• //最後に型名をつけて終わり
実際に読んでみよう!

• char *str_ptr[4];
• str_ptr is an array of a pointer to char
• //後は、これを日本語へ訳せばいい ※英語のままで分かる人は訳さなくておk
• //英語か...
実際に読んでみよう!

• char *str_ptr[4];
• str_ptr is an array of a pointer to char
• //“str_ptr”は
実際に読んでみよう!

• char *str_ptr[4];
• str_ptr is an array of a pointer to char
• //“str_ptr”は、charを指すポインタ
実際に読んでみよう!

• char *str_ptr[4];
• str_ptr is an array of a pointer to char
• //“str_ptr”は、charを指すポインタの配列
実際に読んでみよう!

• char *str_ptr[4];
• str_ptr is an array of a pointer to char
• //“str_ptr”は、charを指すポインタの配列
• やってみると思ってたより簡単で...
実際に読んでみよう!
• 次にこれを読んでみよう
• char (*str_ptr)[4];
実際に読んでみよう!
• 次にこれを読んでみよう
• char (*str_ptr)[4];

• //さっきと似てるけど、かっこが付いていることに注目!
実際に読んでみよう!

• char (*str_ptr)[4];
• str_ptr is
• //まずは識別子に注目して、
実際に読んでみよう!

• char (*str_ptr)[4];
• str_ptr is a pointer to
• //かっこで囲まれているので、先に‘前’を見る
実際に読んでみよう!

• char (*str_ptr)[4];
• str_ptr is a pointer to an array of
• //かっこを一つの塊としてみて、‘後’を見る
実際に読んでみよう!

• char (*str_ptr)[4];
• str_ptr is a pointer to an array of char
• //最後に型名を追加して終わり
実際に読んでみよう!

• char (*str_ptr)[4];
• str_ptr is a pointer to an array of char
• //これを日本語に訳すと、
実際に読んでみよう!

• char (*str_ptr)[4];
• str_ptr is a pointer to an array of char
• //これを日本語に訳すと、
• //“str_ptr”は、
実際に読んでみよう!

• char (*str_ptr)[4];
• str_ptr is a pointer to an array of char
• //これを日本語に訳すと、
• //“str_ptr”は、charの配列
実際に読んでみよう!

• char (*str_ptr)[4];
• str_ptr is a pointer to an array of char
• //これを日本語に訳すと、
• //“str_ptr”は、charの配列を指すポインタ
実際に読んでみよう!

• char (*str_ptr)[4];
• str_ptr is a pointer to an array of char
• //これを日本語に訳すと、
• //“str_ptr”は、charの配列を指すポインタ...
実際に読んでみよう!

• つまり、
• char *str_ptr[4] は、「 charを指すポインタの配列」で、
• char (*str_ptr)[4] は、「 charの配列を指すポインタ」となります
• よって、二つの宣言は見た目は...
実際に読んでみよう!
• 最後は、最初に見せた例を読んで終わりにしましょう
• char *(*func_ptr[4])(char *string, int value);
実際に読んでみよう!
• 最後は、最初に見せた例を読んで終わりにしましょう
• char *(*func_ptr[4])(char *string, int value);
• 一気に難易度が上がったように感じるかもしれませんが、
さっきまでの...
実際に読んでみよう!

• char *(*func_ptr[4])(char *string, int value);
• func_ptr is
• //まずはいつも通り識別子を見る
実際に読んでみよう!

• char *(*func_ptr[4])(char *string, int value);
• func_ptr is an array of
• //‘後’を見る
実際に読んでみよう!

• char *(*func_ptr[4])(char *string, int value);
• func_ptr is an array of a pointer to
• //‘前’を見る
実際に読んでみよう!

• char *(*func_ptr[4])(char *string, int value);
• func_ptr is an array of a pointer to a function returning
•...
実際に読んでみよう!

• char *(*func_ptr[4])(char *string, int value);
• func_ptr is an array of a pointer to a function returning a...
実際に読んでみよう!

• char *(*func_ptr[4])(char *string, int value);
• func_ptr is an array of a pointer to a function returning a...
実際に読んでみよう!

• char *(*func_ptr[4])(char *string, int value);
• func_ptr is an array of a pointer to a function returning a...
実際に読んでみよう!

• char *(*func_ptr[4])(char *string, int value);
• func_ptr is an array of a pointer to a function returning a...
実際に読んでみよう!

• char *(*func_ptr[4])(char *string, int value);
• func_ptr is an array of a pointer to a function returning a...
実際に読んでみよう!

• char *(*func_ptr[4])(char *string, int value);
• func_ptr is an array of a pointer to a function returning a...
実際に読んでみよう!

• char *(*func_ptr[4])(char *string, int value);
• func_ptr is an array of a pointer to a function returning a...
実際に読んでみよう!

• char *(*func_ptr[4])(char *string, int value);
• func_ptr is an array of a pointer to a function returning a...
実際に読んでみよう!

• char *(*func_ptr[4])(char *string, int value);
• func_ptr is an array of a pointer to a function returning a...
実際に読んでみよう!

• char *(*func_ptr[4])(char *string, int value);
• func_ptr is an array of a pointer to a function returning a...
※注意
宣言が読める≠理解できている
ですので、読めても意味が分からない人もいると思います
そういう人は、C言語のポインタが理解できていない人なので、
しっかり勉強すれば理解できるハズです
がんばりましょう!^^
ご静聴ありがとうございました

• 参考文献
• Peter van der Linden – 「エキスパート C プログラミング –知られざるCの深層」 1996
• 前橋 和弥 - 「C言語ポインタ完全制覇」 2001
• Steve Fr...
Upcoming SlideShare
Loading in …5
×

C言語の宣言読み方講座

833 views

Published on

Published in: Technology
0 Comments
1 Like
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
833
On SlideShare
0
From Embeds
0
Number of Embeds
1
Actions
Shares
0
Downloads
7
Comments
0
Likes
1
Embeds 0
No embeds

No notes for slide

C言語の宣言読み方講座

  1. 1. この宣言、あなたは読めますか? Presented by ~ちょっとだけ為になるかもしれないC言語の宣言の読み方講座~ ふじひろ Twitter-ID @fujihiro_sn
  2. 2. ※注意 今回は宣言と定義の読み方講座なんで、 この二つの違いは置いときますね^^ このくらいはみんな知ってるでしょうし
  3. 3. ではまず、宣言(定義)とは? • まぁ細かいことは省いて、みんな知ってるこいつらのこと • int apple; • char orange; //appleはint型 //orangeはchar型 • int peach(int berry); • int grapes[10]; //peachはint型を返す関数 //grapesはintの配列
  4. 4. それくらい簡単さ! って人もいらっしゃると思いますが…
  5. 5. こんな宣言がコードにあったら読めます? • char *(*func_ptr[4])(char *string, int value); • int (*func)(char *string); • char *(**array[8])[2];
  6. 6. 実際読むのは難しいでしょ?
  7. 7. てことで、今回のLTは 今のような宣言を読めることを目標とします!
  8. 8. 三つの規則通りに読めば何も怖くない! • 宣言を読むのにあたって頭に入れておくことはたったの三つ! • 規則1:宣言を読むときは英語で • 規則2:トークンを読む順番 • 規則3:記号の読み方 • これだけ覚えておけば、難しい宣言がスラスラ読めるようになります!
  9. 9. 規則1 : 宣言を読むときは英語で • 英語のほうが簡単に宣言を読めます • てことで簡単な例 • int apple; //apple is int • char orange; //orange is char
  10. 10. 規則1 : 宣言を読むときは英語で • 英語のほうが簡単に宣言を読めます • てことで簡単な例 • int apple; //apple is int • char orange; //orange is char • それだけです、はい
  11. 11. 規則2 : 読むときの順番 • 宣言中は、下の優先順位で読んでいきましょう 1. 識別子をスタートとする int *apple[]; 2. 識別子の‘後’を見る int *apple[]; 3. 識別子の‘前’を見る int *apple[]; 4. かっこがある場合は中を先に見る int (*apple)[]; 5. 最後に型名を見る int *apple[] • 2-4を繰り返せばおk
  12. 12. 規則2 : 読むときの順番 • 宣言中は、下の優先順位で読んでいきましょう 1. 識別子をスタートとする int *apple[]; 2. 識別子の‘後’を見る int *apple[]; 3. 識別子の‘前’を見る int *apple[]; 4. かっこがある場合は中を先に見る int (*apple)[]; 5. 最後に型名を見る int *apple[] • 2-4を繰り返せばおk
  13. 13. 規則2 : 読むときの順番 • 宣言中は、下の優先順位で読んでいきましょう 1. 識別子をスタートとする int *apple[]; 2. 識別子の‘後’を見る int *apple[]; 3. 識別子の‘前’を見る int *apple[]; 4. かっこがある場合は中を先に見る int (*apple)[]; 5. 最後に型名を見る int *apple[] • 2-4を繰り返せばおk
  14. 14. 規則2 : 読むときの順番 • 宣言中は、下の優先順位で読んでいきましょう 1. 識別子をスタートとする int *apple[]; 2. 識別子の‘後’を見る int *apple[]; 3. 識別子の‘前’を見る int *apple[]; 4. かっこがある場合は中を先に見る int (*apple)[]; 5. 最後に型名を見る int *apple[] • 2-4を繰り返せばおk
  15. 15. 規則2 : 読むときの順番 • 宣言中は、下の優先順位で読んでいきましょう 1. 識別子をスタートとする int *apple[]; 2. 識別子の‘後’を見る int *apple[]; 3. 識別子の‘前’を見る int *apple[]; 4. かっこがある場合は中を先に見る int (*apple)[]; 5. 最後に型名を見る int *apple[] • 2-4を繰り返せばおk
  16. 16. 規則2 : 読むときの順番 • 宣言中は、下の優先順位で読んでいきましょう 1. 識別子をスタートとする int *apple[]; 2. 識別子の‘後’を見る int *apple[]; 3. 識別子の‘前’を見る int *apple[]; 4. かっこがある場合は中を先に見る int (*apple)[]; 5. 最後に型名を見る int *apple[] • 2-4を繰り返せばおk
  17. 17. 規則3 : 記号の読み方 • また、宣言中の記号は次のように読みましょう!
  18. 18. 規則3 : 記号の読み方 • また、宣言中の記号は次のように読みましょう! • 配列: []→ … an array of … //配列の要素数は基本無視
  19. 19. 規則3 : 記号の読み方 • また、宣言中の記号は次のように読みましょう! • 配列: []→ … an array of … • 例、int apple[4]; //配列の要素数は基本無視
  20. 20. 規則3 : 記号の読み方 • また、宣言中の記号は次のように読みましょう! • 配列: []→ … an array of … • 例、int apple[4]; → apple is //配列の要素数は基本無視 //まず識別子を見る
  21. 21. 規則3 : 記号の読み方 • また、宣言中の記号は次のように読みましょう! • 配列: []→ … an array of … • 例、int apple[4]; → apple is an array of //配列の要素数は基本無視 //次に、優先順位が高い‘後’を見る
  22. 22. 規則3 : 記号の読み方 • また、宣言中の記号は次のように読みましょう! • 配列: []→ … an array of … //配列の要素数は基本無視 • 例、int apple[4]; → apple is an array of int //‘前’は何もないので型を見て終わり
  23. 23. 規則3 : 記号の読み方 • また、宣言中の記号は次のように読みましょう! • 配列: []→ … an array of … //配列の要素数は基本無視 • 例、int apple[4]; → apple is an array of int • 関数: () → … a function returning … //関数の引数も基本無視
  24. 24. 規則3 : 記号の読み方 • また、宣言中の記号は次のように読みましょう! • 配列: []→ … an array of … //配列の要素数は基本無視 • 例、int apple[4]; → apple is an array of int • 関数: () → … a function returning … //関数の引数も基本無視 • 例、int peach(int data);
  25. 25. 規則3 : 記号の読み方 • また、宣言中の記号は次のように読みましょう! • 配列: []→ … an array of … //配列の要素数は基本無視 • 例、int apple[4]; → apple is an array of int • 関数: () → … a function returning … //関数の引数も基本無視 • 例、int peach(int data); → peach is
  26. 26. 規則3 : 記号の読み方 • また、宣言中の記号は次のように読みましょう! • 配列: []→ … an array of … //配列の要素数は基本無視 • 例、int apple[4]; → apple is an array of int • 関数: () → … a function returning … //関数の引数も基本無視 • 例、int peach(int data); → peach is a function returning
  27. 27. 規則3 : 記号の読み方 • また、宣言中の記号は次のように読みましょう! • 配列: []→ … an array of … //配列の要素数は基本無視 • 例、int apple[4]; → apple is an array of int • 関数: () → … a function returning … //関数の引数も基本無視 • 例、int peach(int data); → peach is a function returning int
  28. 28. 規則3 : 記号の読み方 • また、宣言中の記号は次のように読みましょう! • 配列: []→ … an array of … //配列の要素数は基本無視 • 例、int apple[4]; → apple is an array of int • 関数: () → … a function returning … //関数の引数も基本無視 • 例、int peach(int data); → peach is a function returning int • ポインタ: * → … a pointer to …
  29. 29. 規則3 : 記号の読み方 • また、宣言中の記号は次のように読みましょう! • 配列: []→ … an array of … //配列の要素数は基本無視 • 例、int apple[4]; → apple is an array of int • 関数: () → … a function returning … //関数の引数も基本無視 • 例、int peach(int data); → peach is a function returning int • ポインタ: * → … a pointer to … • 例、int *orange;
  30. 30. 規則3 : 記号の読み方 • また、宣言中の記号は次のように読みましょう! • 配列: []→ … an array of … //配列の要素数は基本無視 • 例、int apple[4]; → apple is an array of int • 関数: () → … a function returning … //関数の引数も基本無視 • 例、int peach(int data); → peach is a function returning int • ポインタ: * → … a pointer to … • 例、int *orange; →orange is
  31. 31. 規則3 : 記号の読み方 • また、宣言中の記号は次のように読みましょう! • 配列: []→ … an array of … //配列の要素数は基本無視 • 例、int apple[4]; → apple is an array of int • 関数: () → … a function returning … //関数の引数も基本無視 • 例、int peach(int data); → peach is a function returning int • ポインタ: * → … a pointer to … • 例、int *orange; →orange is a pointer to //後ろに何もないので前を見る
  32. 32. 規則3 : 記号の読み方 • また、宣言中の記号は次のように読みましょう! • 配列: []→ … an array of … //配列の要素数は基本無視 • 例、int apple[4]; → apple is an array of int • 関数: () → … a function returning … //関数の引数も基本無視 • 例、int peach(int data); → peach is a function returning int • ポインタ: * → … a pointer to … • 例、int *orange; →orange is a pointer to int
  33. 33. 規則3 : 記号の読み方 • また、宣言中の記号は次のように読みましょう! • 配列: []→ … an array of … //配列の要素数は基本無視 • 例、int apple[4]; → apple is an array of int • 関数: () → … a function returning … //関数の引数も基本無視 • 例、int peach(int data); → peach is a function returning int • ポインタ: * → … a pointer to … • 例、int *orange; →orange is a pointer to int
  34. 34. とっても簡単でしょ? てことで実際に読んでいこう!
  35. 35. 実際に読んでみよう! • まずはこれを読んでみよう • char *str_ptr[4];
  36. 36. 実際に読んでみよう! • char *str_ptr[4]; • str_ptr is • //まずは識別子を見る
  37. 37. 実際に読んでみよう! • char *str_ptr[4]; • str_ptr is an array of • //識別子の‘後’を見る
  38. 38. 実際に読んでみよう! • char *str_ptr[4]; • str_ptr is an array of a pointer to • //識別子の‘前’を見る
  39. 39. 実際に読んでみよう! • char *str_ptr[4]; • str_ptr is an array of a pointer to char • //最後に型名をつけて終わり
  40. 40. 実際に読んでみよう! • char *str_ptr[4]; • str_ptr is an array of a pointer to char • //後は、これを日本語へ訳せばいい ※英語のままで分かる人は訳さなくておk • //英語から訳すときは、後ろから順々に言葉を修飾していけばいいので
  41. 41. 実際に読んでみよう! • char *str_ptr[4]; • str_ptr is an array of a pointer to char • //“str_ptr”は
  42. 42. 実際に読んでみよう! • char *str_ptr[4]; • str_ptr is an array of a pointer to char • //“str_ptr”は、charを指すポインタ
  43. 43. 実際に読んでみよう! • char *str_ptr[4]; • str_ptr is an array of a pointer to char • //“str_ptr”は、charを指すポインタの配列
  44. 44. 実際に読んでみよう! • char *str_ptr[4]; • str_ptr is an array of a pointer to char • //“str_ptr”は、charを指すポインタの配列 • やってみると思ってたより簡単でしょ?
  45. 45. 実際に読んでみよう! • 次にこれを読んでみよう • char (*str_ptr)[4];
  46. 46. 実際に読んでみよう! • 次にこれを読んでみよう • char (*str_ptr)[4]; • //さっきと似てるけど、かっこが付いていることに注目!
  47. 47. 実際に読んでみよう! • char (*str_ptr)[4]; • str_ptr is • //まずは識別子に注目して、
  48. 48. 実際に読んでみよう! • char (*str_ptr)[4]; • str_ptr is a pointer to • //かっこで囲まれているので、先に‘前’を見る
  49. 49. 実際に読んでみよう! • char (*str_ptr)[4]; • str_ptr is a pointer to an array of • //かっこを一つの塊としてみて、‘後’を見る
  50. 50. 実際に読んでみよう! • char (*str_ptr)[4]; • str_ptr is a pointer to an array of char • //最後に型名を追加して終わり
  51. 51. 実際に読んでみよう! • char (*str_ptr)[4]; • str_ptr is a pointer to an array of char • //これを日本語に訳すと、
  52. 52. 実際に読んでみよう! • char (*str_ptr)[4]; • str_ptr is a pointer to an array of char • //これを日本語に訳すと、 • //“str_ptr”は、
  53. 53. 実際に読んでみよう! • char (*str_ptr)[4]; • str_ptr is a pointer to an array of char • //これを日本語に訳すと、 • //“str_ptr”は、charの配列
  54. 54. 実際に読んでみよう! • char (*str_ptr)[4]; • str_ptr is a pointer to an array of char • //これを日本語に訳すと、 • //“str_ptr”は、charの配列を指すポインタ
  55. 55. 実際に読んでみよう! • char (*str_ptr)[4]; • str_ptr is a pointer to an array of char • //これを日本語に訳すと、 • //“str_ptr”は、charの配列を指すポインタ となります
  56. 56. 実際に読んでみよう! • つまり、 • char *str_ptr[4] は、「 charを指すポインタの配列」で、 • char (*str_ptr)[4] は、「 charの配列を指すポインタ」となります • よって、二つの宣言は見た目は似ていても全くの別物ってことです • 混同しないようにしましょうね!
  57. 57. 実際に読んでみよう! • 最後は、最初に見せた例を読んで終わりにしましょう • char *(*func_ptr[4])(char *string, int value);
  58. 58. 実際に読んでみよう! • 最後は、最初に見せた例を読んで終わりにしましょう • char *(*func_ptr[4])(char *string, int value); • 一気に難易度が上がったように感じるかもしれませんが、 さっきまでの規則通りに読めば何も怖くありません!
  59. 59. 実際に読んでみよう! • char *(*func_ptr[4])(char *string, int value); • func_ptr is • //まずはいつも通り識別子を見る
  60. 60. 実際に読んでみよう! • char *(*func_ptr[4])(char *string, int value); • func_ptr is an array of • //‘後’を見る
  61. 61. 実際に読んでみよう! • char *(*func_ptr[4])(char *string, int value); • func_ptr is an array of a pointer to • //‘前’を見る
  62. 62. 実際に読んでみよう! • char *(*func_ptr[4])(char *string, int value); • func_ptr is an array of a pointer to a function returning • //既に見たかっこを一つの塊として、 ‘後’を見る
  63. 63. 実際に読んでみよう! • char *(*func_ptr[4])(char *string, int value); • func_ptr is an array of a pointer to a function returning a pointer to • //‘前’を見る
  64. 64. 実際に読んでみよう! • char *(*func_ptr[4])(char *string, int value); • func_ptr is an array of a pointer to a function returning a pointer to char • //最後に型名を見て
  65. 65. 実際に読んでみよう! • char *(*func_ptr[4])(char *string, int value); • func_ptr is an array of a pointer to a function returning a pointer to char • //完成!
  66. 66. 実際に読んでみよう! • char *(*func_ptr[4])(char *string, int value); • func_ptr is an array of a pointer to a function returning a pointer to char • //これを日本語に訳すと、
  67. 67. 実際に読んでみよう! • char *(*func_ptr[4])(char *string, int value); • func_ptr is an array of a pointer to a function returning a pointer to char • //これを日本語に訳すと、 • //“func_ptr”は、
  68. 68. 実際に読んでみよう! • char *(*func_ptr[4])(char *string, int value); • func_ptr is an array of a pointer to a function returning a pointer to char • //これを日本語に訳すと、 • //“func_ptr”は、charを指すポインタ
  69. 69. 実際に読んでみよう! • char *(*func_ptr[4])(char *string, int value); • func_ptr is an array of a pointer to a function returning a pointer to char • //これを日本語に訳すと、 • //“func_ptr”は、charを指すポインタを返す関数
  70. 70. 実際に読んでみよう! • char *(*func_ptr[4])(char *string, int value); • func_ptr is an array of a pointer to a function returning a pointer to char • //これを日本語に訳すと、 • //“func_ptr”は、charを指すポインタを返す関数を指すポインタ
  71. 71. 実際に読んでみよう! • char *(*func_ptr[4])(char *string, int value); • func_ptr is an array of a pointer to a function returning a pointer to char • //これを日本語に訳すと、 • //“func_ptr”は、charを指すポインタを返す関数を指すポインタの配列
  72. 72. 実際に読んでみよう! • char *(*func_ptr[4])(char *string, int value); • func_ptr is an array of a pointer to a function returning a pointer to char • //これを日本語に訳すと、 • //“func_ptr”は、charを指すポインタを返す関数を指すポインタの配列 となります
  73. 73. ※注意 宣言が読める≠理解できている ですので、読めても意味が分からない人もいると思います そういう人は、C言語のポインタが理解できていない人なので、 しっかり勉強すれば理解できるハズです がんばりましょう!^^
  74. 74. ご静聴ありがとうございました • 参考文献 • Peter van der Linden – 「エキスパート C プログラミング –知られざるCの深層」 1996 • 前橋 和弥 - 「C言語ポインタ完全制覇」 2001 • Steve Friedl - 「Reading C type declarations」 • URL : http://www.unixwiz.net/techtips/reading-cdecl.html

×