読者です 読者をやめる 読者になる 読者になる

C++と色々

主にC++やプログラムに関する記事を投稿します。

ポインタ分からん…

ポインタは難しくない、Cのポインタに関する文法がクソなだけや!!!!!!
というわけで、ポインタに関してまとめてみようと思う。

基本

int a;	//int型
int* b;	//int型へのポインタ = int*型

配列へのポインタ

int* p[10];       //int*型の配列
int (*q)[10];	//int[10]型へのポインタ = int (*)[10]型

関数へのポインタ

//簡易化のため、関数の型=戻り値の型とさせていただきます。(「戻り値hoge型の関数」と表現)
//本当は「戻り値hoge型引数foo型, foo型, bar型の関数」というべきですね

int* f();	         //戻り値int*型の関数
int (*g)();	//戻り値int型の関数へのポインタ = int (*)()型

使用

基本

配列へのポインタ

int a[10];

int* p = a;	//先頭要素へのポインタ
int (*q)[10] = &a;	//配列へのポインタ

関数へのポインタ

void func(){}

void (*p)() = func;	//どちらも同じ
void (*p)() = &func;

p();	//どちらも同じ
(*p)();
*p()	//エラー!戻り値型へのポインタになる

多次元配列へのアクセス

int a[3];
*(a + 1);	//a[1]と同じ

int b[3][3];
*((*(b + 1)) + 2);//b[1][2]と同じ

2012/7/28追記

char str1[] = {'H', 'e', 'l', 'l', 'o', '\0'};//本当はこう初期化しなければならない
char str2[] = "Hello";		//↑の糖衣構文(省略形)
char* str3 = "Hello";		//書き込み不可領域に確保されたリソースを指すポインタ

参考文献

"POINTER":http://kmaebashi.com/programmer/pointer.html(2012/7/19アクセス)
"ポインタ虎の巻"http://www.nurs.or.jp/~sug/soft/tora/index.htm(2012/7/19アクセス)