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);
}
Hỏi về con trỏ các kiểu:Tại sao a[0] = 5;
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
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