A static array has a fixed size chosen when it is created, and that size never changes. A dynamic array can grow and shrink at runtime, resizing itself as you add or remove elements.
Under the hood, a dynamic array still uses a contiguous block. When that block fills up, it allocates a larger one and copies the elements across. You get flexibility, but occasional resize work happens behind the scenes.
Use a static array when you know the count ahead of time and want zero overhead. Reach for a dynamic array, like a Python list or a Java ArrayList, when the size is unknown or keeps changing. Access stays O(1) for both; only the growth behavior differs between them.
Rewriting in plainer words…
This answer doesn't lend itself to a diagram - it reads best . No credits were charged.