Arrays are a type of data structure. Data structure means it's a compound of multiple elements organized in a certain way. Arrays are a very simple case where the elements have to be of the same type and you store/read the individual element by presenting an integer index, for one-dimensional arrays at least. Imagine the table in Excel, just use one column, then you have a number of rows each with a certain position (a vector), those are the slots, the position is the index. A two-dimensional array would be multiple columns and rows (a matrix), so you provide two indizes. A three-dimensional one would be like multiple Excel tables and so on. However, Wc3 natively only supports 1d arrays. The index range is from 0 to 8190 statically (8191 is kinda bugged).
The major advantage of data structures is that you can write the code more dynamically. For example, if you wanted to count the kills of multiple units separately, it would require multiple integer variables and you would have to pick the right variable for the unit. This would result in IF/THEN/ELSE branching or more triggers, one solution for each unit. The problem arising becomes even more evident when more units spawn during runtime. You won't have code prepared for them, at maximum have reserves, but that would be a big mess and quite limited. So a proper solution would be to give each unit a unique index for an array (at least until it gets removed again) and dynamically address the memory space meant for the specific unit by presenting its index to the array. It's similar as if you were creating new variables during runtime.