vì khi malloc thì giá trị của con trỏ truyền vào có thay đổi, còn các hàm bình thường thì giá trị trong mảng / phần tử mà con trỏ trỏ tới bị thay đổi.
void ThayDoi(int *a,int n): chỉ thay đổi được *a, ko thay đổi được a. Khi gọi ThayDoi(p, n) thì ko phải con trỏ p được truyền vào hàm ThayDoi, mà 1 bản copy của p được truyền vào.
LinhTinh(int *&a): thay đổi được *a và cả a. Khi gọi LinhTinh(p) thì chính p được truyền vào LinhTinh. Khi viết a = (int*) malloc(...) thì giá trị của a bị thay đổi. Nếu ko truyền bản chính mà truyền bản copy thì giá trị của p (hay địa chỉ mà p trỏ tới) ko bị thay đổi, vì chỉ có giá trị bản copy bị thay đổi.
trong C/C++ các tham số luôn được truyền vào bản copy. Muốn truyền bản chính (tham chiếu) thì phải viết dấu &.