C言語のポインタ [プログラミング]
次の2つの宣言の違いがわかるでしょうか。
int *foo[10]; // ①
int (*bar)[10]; // ②
①は、int型へのポインタの配列(要素10個)、②はint型の配列(要素10個)へのポインタです。私はC言語のポインタに関する書籍を2冊持っているのですが、それぞれの本のCの宣言の解読の仕方に関する説明の違いが面白かったです。
書籍1「C言語 ポインタ完全制覇」
この本では次のように書かれています。
(a) まず、識別子(変数名または関数名)に着目する(②の例ではbar)
(b) 識別子に近い方から、優先順位に従って派生型(ポインタ、配列、関数)を解釈する。優先順位は以下のようになっている。
ⅰ)宣言をまとめるための括弧
ⅱ)配列を意味する[]、関数を意味する()
ⅲ)ポインタを意味する*
(c) 派生型を解釈したら、それを「of」または「to」または「returning」で連結する。
(d) 最後に、型指定子(左端にある、intとかdoubleとか)を追加する。
さらにこの後に解読の具体例の解説があり、最後に7種類の宣言の例が書かれています。
書籍2「C言語 ポインタが理解できない理由[改訂新版]」
この本では、次のようなサンプルプログラムを載せています。
#include <stdio.h>
int main(void)
{
int array[10];
int *p_int;
Int (*p_array)[10];
p_int = array;
p_array = &array;
printf("p_int=%p\n,p_int);
printf("p_array=%p\n,p_array);
p_int++;
p_array++;
printf("p_int=%p\n,p_int);
printf("p_array=%p\n,p_array);
return 0;
}
「配列へのポインタ」の意味を理解するには良いサンプルかもしれませんが、いろいろなCの宣言への理解を深めることは難しいですね。書籍2はわかりやすいですが、初級者向き、書籍1はちょっと難しいけれど中級者へのステップアップと思います。
int *foo[10]; // ①
int (*bar)[10]; // ②
①は、int型へのポインタの配列(要素10個)、②はint型の配列(要素10個)へのポインタです。私はC言語のポインタに関する書籍を2冊持っているのですが、それぞれの本のCの宣言の解読の仕方に関する説明の違いが面白かったです。
書籍1「C言語 ポインタ完全制覇」
この本では次のように書かれています。
(a) まず、識別子(変数名または関数名)に着目する(②の例ではbar)
(b) 識別子に近い方から、優先順位に従って派生型(ポインタ、配列、関数)を解釈する。優先順位は以下のようになっている。
ⅰ)宣言をまとめるための括弧
ⅱ)配列を意味する[]、関数を意味する()
ⅲ)ポインタを意味する*
(c) 派生型を解釈したら、それを「of」または「to」または「returning」で連結する。
(d) 最後に、型指定子(左端にある、intとかdoubleとか)を追加する。
さらにこの後に解読の具体例の解説があり、最後に7種類の宣言の例が書かれています。
書籍2「C言語 ポインタが理解できない理由[改訂新版]」
この本では、次のようなサンプルプログラムを載せています。
#include <stdio.h>
int main(void)
{
int array[10];
int *p_int;
Int (*p_array)[10];
p_int = array;
p_array = &array;
printf("p_int=%p\n,p_int);
printf("p_array=%p\n,p_array);
p_int++;
p_array++;
printf("p_int=%p\n,p_int);
printf("p_array=%p\n,p_array);
return 0;
}
「配列へのポインタ」の意味を理解するには良いサンプルかもしれませんが、いろいろなCの宣言への理解を深めることは難しいですね。書籍2はわかりやすいですが、初級者向き、書籍1はちょっと難しいけれど中級者へのステップアップと思います。
C言語 ポインタが理解できない理由 [改訂新版] (プログラミングの教科書)
- 作者: 朝井 淳
- 出版社/メーカー: 技術評論社
- 発売日: 2011/04/08
- メディア: 単行本(ソフトカバー)
2014-12-20 15:43
nice!(0)
コメント(0)
トラックバック(0)
コメント 0