Tại sao có lúc scanf cần dấu &, có lúc không?

void Nhap(int *array,int *n)
{
    *n=0;while(*n<=0){
    printf("Nhap n > 0\n");
    scanf("%d",n);
    }
    int i;for(i=0;i<*n;i++){
        printf("\narray[%d]=",i);
        scanf("%d",&array[i]);
    }
}

mọi người cho em hỏi trong hàm này có 2 hàm scanf nhưng sao hàm 1 không cần dấu & nhưng hàm 2 lại cần ạ

Về bản chất là scanf sẽ lưu vào địa chỉ

1 Like

Vì scanf nhận vào địa chỉ để pass giá trị nhập vào.
Trong lệnh scanf 1 thì n là con trỏ, bản thân con trỏ chứa địa chỉ rồi nên viết n không cần &.
Trong lệnh scanf 2 thì array[i] là giá trị, không phải con trỏ (mặc dù array truyền vào là con trỏ, do dấu truy xuất [] nên thành giá trị). Giá trị muốn đưa vào scanf phải cho nó thành địa chỉ, nghĩa là có thêm & phía trước.
Nếu lệnh 2 bạn ghi array + i thay vì array[i] thì không cần dấu &.

2 Likes

scanf lưu giá trị vào địa chỉ . Trong trường hợp đầu tiên n là con trỏ nên nó lưu sẵn địa chỉ của 1 biến khác còn trường hợp thứ 2 thì arr[i] kiểu chỉ là 1 biến nên dấu & dùng để gọi địa chỉ của biến arr[i] thôi

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