Hỏi về nhập mảng bằng con trỏ số phần tử nhập trong hàm

các bạn xem cho em phần khai báo hàm với phần nhập bằng lệnh scanf mấy cái đối số sao lạ vậy ạ?
void nhapContro(int *(*a), int *n)
scanf("%d", (*a + i))

#include <stdio.h>
#include <stdlib.h>
  
void nhapContro(int *(*a), int *n) {
    int i;
 
    printf("Nhap so phan tu cua mang: ");
    scanf("%d", n); // khong phai &n
    *a = (int *) malloc ((*n) * sizeof(int));
    // *a : lay dia chi cua mang a chu khong phai gia tri cua a
     
    for (i = 0; i < *n; i++) {
        printf("Nhap a[%d] = ", i);
        scanf("%d", (*a + i));
    }
}
  
void xuatMang(int *a, int n) {
    int i;
    for (i = 0; i < n; i++) {
        printf ("%d \t", a[i]);
    }
}
  
int main() {
    int *a, n;
     
    nhapContro(&a, &n); // lay dia chi cua a va n
    xuatMang(a, n);
      
    return 0;
}

Thứ nhất, int *n là truyền tham trỏ, giá trị của n sẽ thay đổi sau khi ra khỏi hàm. và scanf vẫn cần từ khóa &.
Thứ 2, truyền con trỏ vào hàm, không cần *(*a).
Thứ 3, scanf("%d", (a+i) ) a là con trỏ, a+i cho bạn trỏ tới ô nhớ bên cạnh, nó là địa chỉ nên không cần toán tử &.

83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?