Con trỏ chứa giá trị là địa chỉ, vậy tại sao lại không gán địa chỉ con trỏ cho như cách gán biến thông thường?

từ lúc học con trỏ mình ko có hiểu trừu tượng int a hay int *p nữa mà chuyển qua vẽ ô rồi gán nó 1 cái địa chỉ rồi,2 con trỏ a và b nó là 1 cái ô có địa chỉ nếu mình làm như cách gán biến thông thường thì con trỏ a chứa địa chỉ b và ngược lại như vậy nó dễ hiểu hơn giờ tự nhiên phải ép kiểu mặc dù nó đã cùng kiểu int rồi như int a,b; a=b; nên mình nghĩ con trỏ cũng như thế.

Hi Nguyễn Phú Thành.
Bạn áp dụng sai rồi. int *p, *q; p = q; được nhưng không gán p = &q được (a = &b ?)

Mình bình luận 1 tí về đoạn code của bạn ở trên.

Khi bạn khai báo 2 biến con trỏ kiểu int có tên là a và b, thì giá trị được lưu trong biến a và b là địa chỉ trỏ tới 1 biến int nào đó. Ví du:
a = 0xbffcfd5c
b = 0x80484a1

Nếu bạn thực hiện phép gán a=b , nó sẽ gán địa chỉ của b cho a do cả 2 đều là pointer trỏ tới cùng kiểu. Tuy nhiên, nếu bạn thực hiện a=&b, thì &b không cùng kiểu với a (&b là chứa địa chỉ trỏ tới 1 int pointer b, chứ nó không trỏ tới 1 biến int). Do đó không gán được. Muốn gán thì phai casting.

1 Like

Vẽ ô cũng là một hình thức trừu tượng hóa đấy :slight_smile: và bạn đã nhận ra hạn chế của nó.

vẽ thế qua phần liên kết thì sẽ dễ biết hơn mình sẽ biết nó đang trỏ đến đâu đang giữ địa chỉ của ai chứ ko thì chả biết ai đang giữ địa chỉ của ai
chẳng hạn khi tạo 2 con trỏ a b mình hiểu nó là như này

Mình không hiểu bạn vẽ như thế thì có ý nghĩa gì. Không biết bạn có hiểu sai khái niệm không nữa. Tại sao a lại chứa giá trị địa chỉ của b, và ngược lại.

thì khi mình khai báo int a,int *b,b=&a chẳng phải nó sẽ lấy địa chỉ của a đưa vào b sao ? vd int *a,int *b a=b đc mình biết đc nhưng vì a hay b làm gì có địa chỉ nào nên nó sẽ in ra 1 dãy số CCCCC thế nên mình muốn gán a = địa chỉ của b và b = địa chỉ của a.thế nên mình mới nghĩ là khai báo a=&b ấy để lấy địa chỉ b gán vào a và ngược lại.

Bạn không thể gán địa chỉ trỏ đến một int pointer b (tức là &b) vào a được. Dù cả 2 đều chứa giá trị địa chỉ, nhưng không cùng kiểu (a trỏ đến 1 biến int, trong khi &b lại chứa địa chỉ của 1 biến kiểu pointer int).

chỉ có 1 cách duy nhất là khai báo int **a = &b thì mới lấy đc địa chỉ ra nhưng chỉ lấy đc b còn ngược lại nếu mình muốn lấy xuôi lấy ngược gán vào thì sao ?

Hi Nguyễn Phú Thành.
Nếu bạn thật sự muốn làm thế thì có thể ép kiểu (kich thước của mọi biến con trỏ là bằng nhau nên khi ép kiểu không bị mất dữ liệu.) Tuy nhiên ứng dụng thực tế là không có vì khi đó a và b thành một hệ kín bạn không thể dùng để làm gì nữa.

(Đã sửa)

Không hẳn là con trỏ nào cũng cast qua lại được. (void*) chắc ăn 100%, với (unsigned char*) được đảm bảo do char chỉ 1 byte. Nếu type đích đòi hỏi alignment chặt hơn type nguồn thì mới undefined. Tất nhiên deref được hay không lai là chuyện khác.

thường thì ít có ứng dụng lắm à ? nếu thế bỏ qua có sao ko chứ sợ mốt đụng đến thì xác định

Hi rogp10.
Kích thước con trỏ bằng hai từ máy nên nói chung là gán thế nào cũng không bi mất dữ liệu (như ép kiểu float -> int). Vấn đề là các toán tử thôi.

Hi Nguyễn Phú Thành.
Vì bạn gán như vậy thì lấy chô nào để gán biên thứ 3 ? Giống bạn úp hai cái miệng cốc vào nhau vậy không thể đựng nước được nữa chỉ tốn chỗ thôi.

Theo mình nghĩ muốn gán a vào b, và b vào a, thì chỉ có nước dung 1 biến pointer int tạm thời (temp) để giữ giá trị khi swap thôi.

Vẫn gán được bình thường nha bạn, chỉ có điều khi dùng toán tử * trước con trỏ thì máy sẽ báo lỗi vì không tìm được ô nhớ nào có địa chỉ mà con trỏ chỉ tới

theo mình hiểu như sau:khi khai báo int *a; thi tại địa chỉ a trỏ đến dc trình biên dịch tổ chức để chứa 1 giá trị int(cách tổ chức chứa giá trị của int,float,… sẽ khác nhau,theo 1 chuẩn nào đó).đồng thời địa chỉ cũng vậy.sẽ có 1 chuẩn nào đó để lưu giá trị của con trỏ.cho nên khi bạn gán b=&a sẽ gây ra lỗi ko cùng kiểu dữ liệu. vi b trỏ trên cùng nhớ chứa int,còn &a thì trỏ đến địa chỉ.

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