arrayとpointerの関係は面白い。
面白いけどかなり混乱を招くので、メモしておく。
簡単に復習すると、array変数の名前に関しては配列の一番最初のアドレスを保持している。
ポインタ変数に関してはアドレス値を保持しているため、
array変数とarray変数を参照したポインタはほぼ同じような動きになってしまうのです。
int array[] {10,20,30}; int *array_ptr {array}; //出力される値はarrayのアドレス(同じ値) cout << array << endl; cout << array_ptr << endl; //出力される値は10(同じ値) cout << *array << endl; cout << *array_ptr << endl; //出力される値は10(同じ値) cout << array[0]; cout << array_ptr[0]; //array_ptrのアドレスからint型4バイト進んだ先のアドレス cout << (array_ptr + 1) << endl; //20 cout << *(array_ptr + 1) << endl;
混乱するけど、結局はarray型及びarray型のポインターであれば、値の参照方法は2通り。
array[index] array_ptr[index]
とするか、
*(array + index) *{array_ptr + index)
とするかです。 前者の方がわかりやすいけどね。
ちなみに、
cout << *array[0] << endl; cout << *array_ptr[0] << endl;
とかをしてしまうとコンパイルエラーになります。
いまいち理解できていないけど、そんなところに値も保持していないし、何よりも構文エラーなのかと考えている。。
arrayを関数に渡す際
最初にも述べた通り、arrayは配列の最初のアドレスを保持している。
ので値を参照する場合は関数側変数定義でポインタにて参照可能にしてあげないといけない。
void print (const int *array, size_t size) { cout << " [ "; for (size_t i{0}; i < size; i++) { cout << array[i] << " "; } cout << "] " << endl; } int main() { const size_t array_size1 {5}; int array1 [] {1,2,3,4,5}; cout << "array1 :" << endl; print(array1, array_size1); }