* Value of an array name is the address of first element in array
* Value of pointer variable is address
* If pointer points to same data type as array element, pointer and array name can be used (almost) interchangeably
```cpp
int scores[] {100, 95, 89}
// prints address of first element
cout << scores << endl;
// prints value of first element
cout << *scores << endl;
*int score_ptr {scores};
// also prints address of first element
cout << score_ptr << endl;
// also prints value of first element
cout << *score_ptr << endl;
```
Can do array subscripting on pointers:
```cpp
int scores[] {100, 95, 89};
int *score_ptr {socres};
cout << score_ptr[0] << endl;
cout << score_ptr[1] << endl;
cout << score_ptr[2] << endl;
```
| Subscript notation | Offset notation |
| -------------------- | ----------------------- |
| `array_name[index]` | `*(array_name + index)` |
| `pointer_name[index]` | `*(pointer_name + index)` |