Glossing over some things a bit..
Every geometrical entity in Blender is made up of two parts: they are Objects, which contain Data.
In the case of a polygonal object, the Data is a representation of the Object's mesh - the location of all its vertices, which vertices constitute which edges and faces,and so on. The vertex locations in the Data are not measured in World Space, but in the space of their Object. You can see the space of an Object by switching on 'Axis' in the Object > Properties > 'Viewport Display' panel.
The top face of the default 2x2x2 cube on the left is at Z = 1, in its object's space. Because the object has no transform, the top face is also at Z = 1 in World Space. The cube next door has been scaled in Z, and the one on the right rotated, too. As far as the Data are concerned, the top faces of those cubes are still at Z = 1, in their object's spaces. They are then given their object's transform, which puts them at different locations and rotations in the world.
In Edit Mode, you are transforming elements of the mesh in their object's space. In Object Mode, you are transforming the object (i.e its space, along with the vertices in it.)
When you Apply the transforms of an object, the World transform of the object is given to all of its vertices in their object's space, and, to compensate, the inverse of the transform is given to the object itself. That results in the mesh remaining where it was in the world, and the object's transform being returned to 0 translation, 0 rotation, 1 scale...
Counting from 0, an object-targeted Array modifier gives each iteration of the mesh [iteration-count] times whatever transform would would map the zeroth (original) arrayed object on to the target object. (The inverse of the arrayed object's transform in the target object's space.) The first copy's axes, if it had them, would always match the target's axes. Try it with some simple transforms, and the axes showing, to get the idea.