thohnb1997
Senior Member
Dễ mà, thím phân ra 2 trường hợp: khai báo và sử dụng. Với khai báo thì chỉ dấu*
, không có dấu&
, mỗi dấu*
lúc khai báo chỉ 1 tầng gián tiếp (note: dấu&
trong khai báo vẫn hợp lệ trong C++, nhưng nó là reference, một tính năng của C++, tính năng này không liên quan pointer, pointer là tính năng có từ C rồi). Ví dụint
là một biến số nguyên, thìint*
là một con trỏ chỉ lưu địa chỉ của 1 biếnint
,int**
là 1 con trỏ lưu địa chỉ 1 biến kiểuint*
.
Còn phần sử dụng thì dấu * là đọc giá trị được chỉ tới, dấu & là lấy địa chỉ. Ví dụ con mèo đang ở lầu 2 thì&conMèo
sẽ cho ra giá trị là "lầu 2". Biến con trỏ sẽ lưu cái "lầu 2" này, đây gọi là địa chỉ của biến. Khi dùng*
thì nghĩa là đi tới địa chỉ đó để lấy cái đang được chỉ đến. Trong ví dụ trên, ví dụp = &conMèo
thìp
là "lầu 2",*p
sẽ là con mèo, là cái đang được chỉ đến.
Còn nếu ví dụ trên khó hình dung thì thử tiếp cận thế này xem sao: Coi memory như 1 bảng dài như vầy, mỗi byte có 1 số được gọi là địa chỉ. Pointer là biến dùng để lưu số, nhưng không phải số bất kỳ, mà là cái số thể hiện địa chỉ trên memory.
Ví dụ mình cóint a = 1000;
với int chiếm 4 bytes,a
sẽ chiếm 4 bytes như bảng dưới, từ vị trí0x1234
tới0x1237
, địa chỉ củaa
sẽ là0x1234
, vậy nên&a
sẽ là0x1234
. Nếu cóint* p = &a
thì biến p sẽ có giá trị là0x1234
.*p
là đọc giá trị được chỉ tới,p
đang chỉ tới ô có địa chỉ0x1234
nên*p
sẽ là đọc giá trị tại ô0x1234
, là1000
.
Address Value ... ... 0x1234 1000 0x1235 0x1236 0x1237 Chung với ở trên, voz không cho merge cell
số 1000 được lưu bằng cả 4 bytes này... ... 0x5600 0x1234
ôi , em xin cảm ơn hai thím đã giải thích ạ cặn kẽ và dễ hiểu ạip=&y là lấy địa chỉ của thằng y trong mem gán cho ip
*ip=x là gán value ở cái địa chỉ mà thằng ip trỏ tới gán bằng x
Khẩu quyết tâm pháp : là một biến mà trong đó giá trị của nó là địa chỉ của biến khác
Cuối cùng cũng được khai sáng về phần con trỏ này