Để giải thích việc này, phải hiểu tại sao lại có pointer type trong khi các ngôn ngữ bậc cao hơn hầu như ko có!
Pointer là biến chỉ lưu địa chỉ, có giá tri bằng 4 bytes đối với OS 32bit và 8 bytes đối với OS 64bit! Pointer ra đời giúp ích rất nhiều cho việc duyệt mảng vì nó rất nhanh, và nó cũng giúp C/C++ gần với ngôn ngữ máy hơn!
Tên của array là địa chỉ đầu tiên của biến đầu tiên trong mảng, vd:
int arr[5] = {1, 2, 3, 4, 5}; //arr == &arr[0] == 1
C/C++ chia ra lvalue & rvalue! lvalue nói đơn giản là biến chỉ chứa địa chỉ, nên ta phải gán giá trị trực tiếp cho nó! Trong trường hợp gán mảng, vd arr[0] = 5 thì gán giá trị của biến đầu tiên là 5! Tương tự nếu em gán arr1 = arr2 thì nó chỉ gán địa chỉ đầu tiên thôi, nó ko thể hiểu tiếp theo con trỏ mảng sẽ đi đâu (cái này gọi là shallow copy), nên cách làm này nên tránh!
Còn các ngôn ngữ bậc cao hơn thì nó luôn qui về 1 Object, tức là có mọi hàm cần thiết để em duyệt các giá trị chứa trong object đó, nên em ko cần quan tâm tới địa chỉ của Object đó làm gì, nên có thể dễ dàng gán 2 mảng (vd vậy)!