Hỏi về con trỏ các kiểu:Tại sao a[0] = 5;

void cap_phat_bo_nho(int*a)
{ a= new int[5];
for(int i=0; i<5; i++) a[i]=i+1;
}
void main()
{ int n=5;
int *a= &n;
cap_phat_bo_nho(a);
printf(“Giá trị a[0]=%d và n=%d”,a[0],n);
}

Bạn theo dõi hình này nha (thông cảm vì mình vẽ xấu).


Giả sử biến n có địa chỉ là 0x123 mang giá trị là 5. a có địa chỉ là 0x567 mang giá trị 0x123 (địa chỉ của n). Khi chương trình gọi hàm cap_phat_bo_nho(a) thì compiler sẽ tạo một vùng nhớ giống hệt con trỏ a đã khai báo ở trên tức là nó trỏ đến n (mang giá trị 0x123 như trong hình), nhưng vùng nhớ này hoàn toàn phân biệt với con trỏ a (nằm ở địa chỉ 0x789) truyền vào hàm. Và trong thân hàm cap_phat_bo_nho thực hiện thay đổi giá trị của vùng nhớ này (trỏ tới địa chỉ 0x456)…
Sau khi ra khỏi hàm, con trỏ a vẫn trỏ tới n chứ không trỏ tới vùng nhớ bạn cấp phát. Bạn có thể in địa chỉ của a ở trong và ngoài hàm cap_phat_bo_nho để rõ hơn. Và lý do tại sao a[0]=5 là bởi vì a[0] <=> *(a+0)=*a=n=5.
Nếu muốn thay đổi giá trị của a bạn phải truyền cho hàm cap_phat_bo_nho con trỏ cấp 2 trỏ tới a(C or C++) hoặc một reference tới a (only C++)

7 Likes

Quá tuyệt cho 1 câu trả lời :kissing_heart:

Bạn cho mình 1 ví dụ về con trỏ cấp 2 trong bài này đc ko?

This post was flagged by the community and is temporarily hidden.

Con trỏ cấp 2:

void cap_phat_bo_nho(int** a){
       *a=new int[5];
       ....
}
void main(){
       ....
       cap_phat_bo_nho(&a);
      ...
}

Dùng reference:

void cap_phat_bo_nho(int*&a){
       a=new int[5];
       ....
}
void main(){
      ....
      cap_phat_bo_nho(a);
      ....
}
2 Likes
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?