Khi suy nghĩ về con trỏ, bạn cần phải rõ ràng về một vài trừu tượng.
Một đối tượng trong bộ nhớ. Đây có thể là bất kỳ loại (và kích thước) nào. Một đối tượng số nguyên, ví dụ, sẽ chiếm 4 byte trong bộ nhớ (trên các máy 32 bit). Một đối tượng con trỏ sẽ chiếm 4 byte trong bộ nhớ (trên các máy 32 bit). Như là hiển nhiên, đối tượng số nguyên giữ các giá trị nguyên; một đối tượng con trỏ chứa các địa chỉ của các đối tượng khác.
Ngôn ngữ lập trình C cho phép các biểu tượng (biến) đại diện cho các đối tượng này trong bộ nhớ. Khi bạn khai báo,
int i;
biểu tượng (biến) i đại diện cho một số đối tượng số nguyên trong bộ nhớ. Cụ thể hơn, nó đại diện cho giá trị của đối tượng này. Bạn có thể thao tác giá trị này bằng cách sử dụng i trong chương trình.
& tôi sẽ cung cấp cho bạn địa chỉ của đối tượng này trong bộ nhớ.
Đối tượng con trỏ có thể giữ địa chỉ của đối tượng khác. Bạn khai báo một đối tượng con trỏ bằng cách sử dụng cú pháp,
int * ptr;
Cũng giống như các biến khác, biến con trỏ biểu diễn giá trị của một đối tượng, một đối tượng con trỏ. Giá trị này chỉ xảy ra là địa chỉ của một số đối tượng khác. Bạn đặt giá trị của đối tượng con trỏ như vậy,
ptr = & i;
Bây giờ, khi bạn nói ptr trong chương trình, bạn đang đề cập đến giá trị của nó, đó là địa chỉ của i. Nhưng nếu bạn nói * ptr, bạn đang đề cập đến không phải là giá trị của ptr, mà đúng hơn là giá trị của đối tượng có địa chỉ trong ptr tức là i.
Sự cố với chức năng hoán đổi của bạn là bạn đang hoán đổi giá trị của con trỏ, không phải giá trị của các đối tượng mà các con trỏ này giữ địa chỉ. Để có được các giá trị của các đối tượng, bạn sẽ phải sử dụng * ptr.
Câu hỏi rõ ràng sẽ là gì, sự khác biệt giữa triển khai này và triển khai của bạn hoạt động như thế nào? (Tôi biết vấn đề với cái này là gì, tôi chỉ đang cố gắng giúp bạn tìm ra nó.) [Tất nhiên, tất cả các hải ly háo hức trên SO đều sẵn sàng nhảy thẳng đến câu trả lời.] –
Bài học về sự cố vững chắc khi vượt qua theo giá trị. Cảm ơn ppl. –