My experience is limited. Here is my understanding of arrays and pointers to pointers.
The C language array has two basic points,
The first is fixed length, and the second is essentially one-dimensional.
These two points depend on the hardware, because the memory is one-dimensional and the space is limited.
Therefore, to declare a continuous address space such as an array based on a linear table, it must be fixed, otherwise the system cannot reserve space for it.
The second point is the one-dimensional nature.
C language, although more advanced than Assembly, is not too advanced, there are many underlying functions and shadows.
On the one hand, it can be very powerful, and on the other hand it is very cumbersome.
Although the C language has a two-dimensional array, it is said that it is not very useful. I know the disadvantage is that two-dimensional arrays cannot be used as function parameters or function return values.
To use a two-dimensional array flexibly, you must use a pointer to the pointer.
The one-dimensional array and pointer of C language are basically equal, but the pointer to the pointer is not equal to the two-dimensional array.
Pointers to pointers are much more powerful. A pointer is essentially a one-dimensional array, but the elements in it are addresses, that is, pointers,
The address points to multiple pointers, that is, a one-dimensional array, to complete the two-dimensional array function.
If you do not want to specify the length of the applied array, you need to use some container classes.
The container class encapsulates some operations on the length, if implemented using a linear table,
In fact, the implementation must first have a fixed length, and then find that the space is not enough to apply for a larger one.
If you use a linked list, adding new elements is simple, but the search efficiency is lower.
These are my immature opinions.