30/09/2018, 19:16
Sự khác nhau giữa (*) khai báo con trỏ và (*) khi lấy giá trị trong con trỏ
Như tiêu đề em đã viết. Mọi người có thể nói cho em biết sự khác nhau giữa 2 dấu (*) đó được không.
Bài liên quan
int *c; //Khai báo một con trỏ kiểu nguyên tên là c.
int a=10;
c=&a;
Lúc này :c = địa chỉ của ô nhớ mà nó trỏ đến. Ở đây là địa chỉ của biến a trong bộ nhớ máy tính!
*c = giá trị của ô nhớ mà nó trỏ đến. Cụ thể ở đây là giá trị của biến a trong bộ nhớ máy tính.
&c= địa chỉ ô nhớ của biến con trỏ.
Thật ra nó chỉ là quy ước thôi, dùng * vậy cho dễ ghi nhớ, nếu không dùng * để lấy giá trị con trỏ thì người ta cũng quy ước dùng cái khác
Suy luận vui của mình (fun thôi nhé vì kí hiệu đó cũng chỉ là qui ước). Có thể bạn hay khai báo một var con trỏ kiểu như
int *p
, nó cũng đúng nhưng đôi khi dễ nhầm lẫn*p
là biến kiểuint
. Khi khai báo dạngint* p
thì dễ hiểu hơn,p
có kiểuint*
mình nghĩ cách qui ước*p
để lấy ra giá trị củap
cũng vậy, khi chuyển dấu*
từint*
sangp
(thành*p
) thì int mất*
->*p
có kiểuint
Vậy có nghĩa là 2 dấu (*) này hoàn toàn khác nhau phải không ạ.
Hiểu nó là như vậy. Cái đầu là để phân biệt giữa khai báo tên biến và con trỏ. Nhưng khi sử dụng nó thì nó lai chỉ giá trị của biến mà nó trỏ đến.
Đơn giản thôi mà
Giả sử ta có một biến a có địa chỉ trong ô nhớ là 220 (cái này là máy nó random lưu vào chỗ bất kỳ nhé) và một con trỏ p
-Khi bạn viết :
Thì ngay lập tức, giá trị của con trỏ p sẽ bằng địa chỉ của biến a, tức là p=220 .
-Còn giả sử nếu bạn viết :
Thì máy sẽ in ra là 5
-> *p=5
=> viết *p có nghĩa là tham chiếu đến giá trị của cái biến mà con trỏ đã lấy địa chỉ , ở đây biến mà con trỏ đã lấy địa chỉ là biến a, mà a=5 => *p=5
Code này không đúng đâu
Còn vì sao thuật toán nó vậy thì bạn thử đổi chỗ hai cái tô/bát là thấy ngay.
#ngừng_đào_mộ