C++ ポインタと関数について No1

#概要
課題でC++についてゴリゴリプログラミングをしたので、自分のためとMarkdownに慣れようということで纏めたいことをつらつら書いておこうかと思って初投稿。
他に良い記事あったり、がっつり参考にしてるからほぼ意味ないよねこれ。自己満足ってやつ。

#目次
1.ポインタ
1-1.ポインタの基本
1-2.ポインタと配列
1-3.ポインタと２次元配列
2.ポインタと関数
2-1.関数に引数を渡す
2-2.関数内でのアクセス方法
3.有能な記事

#1.ポインタ
##1-1.ポインタの基本
int a に対して int \*aとすることによって__int型の値を確保する変数のアドレス を確保するアドレス変数__になり、*aは__「ポインタaの指すアドレスの中身」__になる。

```c++:sample1.cpp
#include <bits/stdc++.h>
using namespace std;

int main(int argc, char const *argv[])
{
	cin.tie(0);
	ios::sync_with_stdio(false);

	
	int a,b;
	int *p;

	a = 100;
	p = &a;
	b = *p + 1;

	cout << a <<endl;
	cout << b <<endl;
	cout << p <<endl;
	cout << *p << endl;
	
	return 0;
}
```
```c++:出力
100
101
0xffffcbf0
100
```

##1-2.ポインタと配列
ポインタに配列を代入することは__ポインタに配列の先頭アドレスを設定することになる__。
そしてポインタを加算することは「ポインタに格納されているアドレス+__型のサイズ__」をしていることになる。

通常の変数と異なるのは、「配列名だけだと、その配列の先頭要素のアドレスを示す」という点です。つまり、配列dataについて、dataと&data[0]は同じになります。

```c++:sample2
#include <bits/stdc++.h>
using namespace std;

int main(int argc, char const *argv[])
{
	cin.tie(0);
	ios::sync_with_stdio(false);

	
	int a[5];
	int *p;

	for (int i = 0; i < 5; ++i)
	{
		a[i] = i;
	}
	
	p = a;	//配列の時のポインタ渡し、&aは×。&a[0]は〇

	for (int i = 0; i < 5; ++i)
	{
		cout << "添え字 " << i << endl;
		cout << a[i] << endl;
		cout << *(p + i) << endl;
		cout << (p + i) <<endl;
		cout << endl;
	}

	return 0;
}
```
```c++:出力
添え字 0
0
0
0xffffcbd0

添え字 1
1
1
0xffffcbd4

添え字 2
2
2
0xffffcbd8

添え字 3
3
3
0xffffcbdc

添え字 4
4
4
0xffffcbe0
```

#1-3.ポインタと２次元配列
記事があんまり長くなってもあれなのでこっちに纏め直し
[C++ ２次元配列について ポインタと関数 No2](https://qiita.com/sesame0224/items/b0a3e286f20817b3a319)

#2.ポインタと関数
##2-1.関数に引数を渡す
ざっくり関数への引数の渡し方を纏めると

|値渡し|ポインタ渡し|参照渡し|
|:---:|:---:|:---:|
|数値をコピーして別の変数を用意|変数のメモリ上のアドレスを渡す|元の変数に別名をつける|
|書き換え×|書き換え〇|書き換え〇|

詳しくはこちら[C++ 値渡し、ポインタ渡し、参照渡しを使い分けよう](https://qiita.com/agate-pris/items/05948b7d33f3e88b8967)

##2-2.関数内でのアクセス方法
mainで用意した配列を関数に渡した時、関数内ではどのようにアクセスするか

```c++:sample3.cpp
#include <bits/stdc++.h>
using namespace std;

#define FOR(i,a,b) for(int i = (a); i < (b); ++i)
#define rep(i,n) FOR(i,0,n)

void rewrite1(int*);
void rewrite2(int[]);

int main(int argc, char const *argv[])
{
	cin.tie(0);
	ios::sync_with_stdio(false);

	
	int a[5]={0};

	rep(i, 5)	cout << a[i] << " ";
	cout << endl;

	rewrite1(a);
	rep(i, 5)	cout << a[i] << " ";
	cout << endl;

	rewrite2(a);
	rep(i, 5)	cout << a[i] << " ";
	cout << endl;

	return 0;
}

void rewrite1(int *array){
	rep(i, 5)	array[i] = i;
}

void rewrite2(int array[]){
	rep(i, 5){
		*array = 0;
		array++;
	}
}
```
```出力.cpp
0 0 0 0 0
0 1 2 3 4
0 0 0 0 0
```
返り値を2つ以上にしたい場合、二次元配列を渡したい場合の処理に関してはこちら[関数](http://www.cc.kyoto-su.ac.jp/~yamada/programming/function.html)


#3.有能な記事
他にも関連した話題で素晴らしい記事があったので掲載。参考文献とは別です。
[C++ポインタまとめ](https://qiita.com/yokoto/items/5672ff20b63815728d90)
[配列とポインタに関することまとめ](https://qiita.com/jonichonpa/items/b38b760162a1f778b612)



#参考文献
[初心者のためのポイント学習C言語](http://www9.plala.or.jp/sgwr-t/index.html)
[C++ 値渡し、ポインタ渡し、参照渡しを使い分けよう](https://qiita.com/agate-pris/items/05948b7d33f3e88b8967)
[プログラミング入門サイト~bituse~ 関数に配列を渡す](https://bituse.info/c/30)
[関数](http://www.cc.kyoto-su.ac.jp/~yamada/programming/function.html)
[数値計算以前 #2.5 ２次元配列とポインタ](http://www.asahi-net.or.jp/~uc3k-ymd/Lesson/index01.html)
[1次元配列とアドレス](http://rainbow.pc.uec.ac.jp/edu/program/b1/Ex3-2.htm)