C言語のポインタ

今月の5日に新しい派遣先で仕事をすることになった.しかもC言語のポインタを多用する現場のようで,課題を与えられて1週間の試用期間に解かなければならない.
今までの派遣先はC言語を扱っていたが,今回の現場のように筆記試験や実技試験を与えられることはなかった.
本当にポインタに特化した課題のため,知識が無ければ解けない問題ばかり.しかし,学生時代の課題のようなものなのでたいしたことは無い.
たいしたことは無いが,やはりポインタに特化しているため記憶している知識ではこなせないことがわかった.そのため,先日の3連休でポインタに関する書籍を読み返した.
ネットを駆使してポインタに関する説明をしているサイトも見つけた.
結論は,今月でクビになったこと...
それでも理解したこをちょろっと掲載する.
掲載理由は,ネット検索でポインタを完全に理解していないサイトを見つけたため,私がいかに知識を得ているかを自慢したかったから.（痛い人間なので,気にしないこと^^）

#全体のソースコード

```c
#include <stdio.h>

int main(int argc, char *args[]){
	int ione = 123;
	int itmp[3] = {1, 2, 3};
	char *str = "hello_world!!";
	char tmp[] = "hello world!!";
	char *x[256];
	char *y;
	int *i3tmp;
	int (*p3tmp)[3];

	x[0] = (char *)&ione;
	x[1] = str;
	x[2] = tmp;
	y = tmp;
	i3tmp = itmp;
	p3tmp = &itmp;
	printf("ione:[%d]\n", *x[0] );
	printf("str[%s]\n", x[1] );
	printf("tmp[%s]\n", x[2] );
	printf("tmp[%s]\n", y );
	printf("i3tmp[%d][%d][%d]\n", i3tmp[0], i3tmp[1], i3tmp[2] );
	printf("p3tmp[%d][%d][%d]\n", *p3tmp[0], *p3tmp[1], *p3tmp[2] );
	return 0;
}
```

![スクリーンショット 2016-01-17 12.29.05.jpg](https://qiita-image-store.s3.amazonaws.com/0/82414/71f10ded-bf1a-b5a2-3686-bc431148296f.jpeg "スクリーンショット 2016-01-17 12.29.05.jpg")

#charへのポインタ型変数に代入

```c
#include <stdio.h>

int main(int argc, char *args[]){
	char tmp[] = "hello world!!";
	char *y;

	y = tmp;
	printf("tmp[%s]\n", y );
	y = &tmp[0];
	printf("tmp[%s]\n", y );
	return 0;
}
```

![スクリーンショット 2016-01-17 12.57.51.jpg](https://qiita-image-store.s3.amazonaws.com/0/82414/c4865512-6e38-70e2-51d4-41f38d9638a7.jpeg "スクリーンショット 2016-01-17 12.57.51.jpg")

文字列を配列に代入後,それをcharへのポインタ型変数に代入している.
表現方法は`tmp`・`&tmp[0]`のどちらでもかまわない.
しかし`&tmp`の場合は意味が変わるため気をつけること（配列へのポインタ）.


#charへのポインタの配列に代入

```c
#include <stdio.h>

int main(int argc, char *args[]){
	int ione = 123;
	char *str = "hello_world!!";
	char tmp[] = "hello world!!";

	char *x[256];

	x[0] = (char * )&ione;
	x[1] = str;
	x[2] = tmp;
	printf("ione:[%d]\n", *x[0] );
	printf("str[%s]\n", x[1] );
	printf("tmp[%s]\n", x[2] );

	return 0;
}
```
![スクリーンショット 2016-01-17 12.30.31.jpg](https://qiita-image-store.s3.amazonaws.com/0/82414/b2e6577d-b69a-68a7-e2dd-8a6a8f11b3d0.jpeg "スクリーンショット 2016-01-17 12.30.31.jpg")

一つ目：int型の変数（ione）に数字を代入している.
二つ目：charへのポインタ型の変数（str）に文字列を代入している.
三つ目：char型の配列（tmp）に文字列を代入している.
それらをcharへのポインタの配列に代入している.そして`printf`関数で表示させている.

#intの配列へのポインタに代入

```c
#include <stdio.h>

int main(int argc, char *args[]){
	int itmp[3] = {1, 2, 3};
	int *i3tmp;
	int (*p3tmp)[3];

	i3tmp = itmp;
	p3tmp = &itmp;
	printf("i3tmp[%d][%d][%d]\n", i3tmp[0], i3tmp[1], i3tmp[2] );
	printf("p3tmp[%d][%d][%d]\n", *p3tmp[0], *p3tmp[1], *p3tmp[2] );
	return 0;
}
```

![スクリーンショット 2016-01-17 13.06.02.jpg](https://qiita-image-store.s3.amazonaws.com/0/82414/7af0520a-468c-2b75-d466-f50cebff104d.jpeg "スクリーンショット 2016-01-17 13.06.02.jpg")

一つ目：数字をint型の配列（itmp）に代入している.
二つ目：intへのポインタ型の変数（i3tmp）を宣言している.
三つ目：intの配列へのポインタの変数（p3tmp）を宣言している.
宣言したそれぞれの変数に`itmp`を代入して表示している.
しかし,表示の内容がおかしい（`*p3tmp[1]`, `*p3tmp[2]`）.

改めて原因を探りますか（こんなことだから今月末までの契約なのだろうorz）.


#参考サイト

* [混乱を招くポインタ宣言の構文についてメモ](http://qiita.com/hatchinee/items/fc838f0809702d6b6a26 "混乱を招くポインタ宣言の構文についてメモ")
* [配列とポインタ](http://qiita.com/tamurashingo@github/items/54842bed92c27b37f2d4 "配列とポインタ")
* [C言語のポインタきらい](http://qiita.com/bugdasi/items/7856931f4cacf2c5b743 "C言語のポインタきらい")
* [初心者のためのポインタ講座　～ポインタって結局なんの役に立つの？～](http://qiita.com/nnahito/items/17ba02c6ee191f61d5bb "初心者のためのポインタ講座　～ポインタって結局なんの役に立つの？～")
* [C言語ポインタの基礎](http://qiita.com/rf141/items/a3e96b315dd4f08508a9 "C言語ポインタの基礎")
* [warning: incompatible integer to pointer conversion assigning to](http://d.hatena.ne.jp/shammer/20090827/1390381303 "warning: incompatible integer to pointer conversion assigning to")