Pointers, as you might recall from Chapter 9, “Functions,” provide a symbolic way to use addresses. Because the hardware instructions of computing machines rely heavily on addresses, pointers enable you to express yourself in a way that is close to how the machine expresses itself. This correspondence makes programs with pointers efficient. In particular, pointers offer an efficient way to deal with arrays. Indeed, as you will see, array notation is simply a disguised use of pointers.
An example of this disguised use is that an array name is also the address of the first element of an array. That is, if flizny is an array, the following is true:
flizny == &flizny // name of array is the address of the first element