Arrays and pointers are very different things:
Think of an array as a block of houses in a city and a pointer as a piece of paper with the GPS coordinates of the first house written on it.
The block cannot move, nor can you change its size. Houses can be built on the block (value assignment), which does not change the coordinates on the pointer.
The name of the street (array name) can be used to refer to a given house, but the coordinates are just as efficient, especially for someone who does not have a map (the array name is out of scope).
You can make the pointer point to another house by erasing the coordinates and writing different ones. Writing nothing is similar to making the pointer a null pointer. If the house was destroyed or the street has restricted access, going there with the GPS coordinates may get you in trouble (segmentation fault).
Just looking at the pointer, you cannot tell how many houses are in the block. Getting there and going from house to house may feel safe, but you cannot know where the street ends and another one starts or you may cross the border into enemy territory (out of bounds access, undefined behavior).
The coordinates may be those of any house, not necessarily the first one of the street. Changing them geometrically may get you to the next house if they have a known size (pointer increment).
You can put some pieces of paper in your pockets (CPU registers) or you can stick them on a wall (store them in memory)... At which point they have GPS coordinates themselves which you can write on a piece of paper (pointer to a pointer).
In C, when you pass an array as an argument, the function only gets its address as a pointer, just like the Uber driver gets GPS coordinates.