Cả con trỏ và tham chiếu đều là các tính năng mạnh nhất trong C và C ++, cho phép lập trình viên thao tác trực tiếp địa chỉ bộ nhớ để quản lý bộ nhớ hiệu quả.
Cả hai đều là các biến được sử dụng để chỉ các đối tượng khác một cách gián tiếp và chúng chia sẻ một số tính năng phổ biến trên bề mặt. Mặc dù chúng chia sẻ rất nhiều khả năng chung, nhưng chúng cũng rất phức tạp để hiểu.
Một con trỏ là một biến chứa địa chỉ bộ nhớ của một biến khác, trong khi một tham chiếu giống như một con trỏ có thể được sử dụng để gián tiếp tham chiếu đến một biến khác.
Hầu hết các lập trình viên dường như phát triển một số hiểu biết về khi nào nên sử dụng con trỏ và khi nào nên sử dụng tài liệu tham khảo, nhưng họ thường gặp phải các vấn đề mà giải pháp có vẻ không rõ ràng.
Vì vậy, để hiểu rõ hơn về triết lý, hãy hiểu sự khác biệt giữa hai.
Mỗi biến là một vị trí bộ nhớ được xác định bởi địa chỉ của nó và được ghép nối với một mã định danh có chứa một số giá trị có thể được thay đổi trong quá trình của chương trình. Nói một cách đơn giản, biến là một biểu tượng đại diện cho một đại lượng.
Một con trỏ là một biến chứa địa chỉ bộ nhớ của một biến khác. Một con trỏ không là gì ngoài một địa chỉ và một biến lưu trữ một con trỏ được gọi là biến con trỏ.
Ý tưởng là sử dụng mã định danh (hoặc tên) thay vì địa chỉ số để giảm bớt gánh nặng lập trình do đó giảm độ phức tạp của các chương trình. Vì các địa chỉ này đề cập đến các vị trí thực tế trong bộ nhớ máy tính, con trỏ có thể được sử dụng để truy cập và thao tác nội dung được lưu trữ trong bộ nhớ.
Giống như bất kỳ biến hoặc hằng, con trỏ phải được khai báo cho các loại của chúng. Vì các con trỏ chứa các địa chỉ bộ nhớ thuộc về một loại dữ liệu riêng biệt, chúng phải được khai báo bằng các con trỏ trước khi bạn có thể làm việc với chúng. Hình thức chung của khai báo con trỏ là:
Data_type * var-name;
Ở đây, dữ liệu của Data_type là loại cơ sở của con trỏ và tên var của tên là một biến con trỏ. Dấu hoa thị (*) ở đây được sử dụng để khai báo con trỏ chỉ định biến var-name tên là một biến con trỏ.
int * p; // con trỏ nguyên
phao * x; // con trỏ float
Ở đây, biến pv của PTC chỉ ra một kiểu dữ liệu số nguyên được khai báo là kiểu int int mà dùng để chỉ kiểu dữ liệu của biến. Tương tự như vậy, trong ví dụ thứ hai, thì flo float chỉ đề cập đến kiểu dữ liệu của biến số x x mà thực tế được chỉ định là một con trỏ tới biến dấu phẩy động.
Một tham chiếu giống như một con trỏ với quyền truy cập gián tiếp vào một biến. Nó giống như một bí danh cho một biến khác, có nghĩa nó chỉ là một tên khác cho một biến đã tồn tại.
Nó cho phép các lập trình viên tạo một tên thứ hai cho biến mà họ có thể sử dụng để thao tác nội dung được lưu trữ trong biến đó. Đó là một thực thể là bí danh cho một biến khác và nó có cùng địa chỉ với biến ban đầu. Nó hỗ trợ tham chiếu qua hoạt động như các tham số chính thức của hàm và một khi được định nghĩa để tham chiếu đến một biến, nó không thể được nối lại, điều đó có nghĩa là nó không thể được chuyển đến một biến khác.
Không giống như con trỏ, họ không cần nhà điều hành hội nghị để truy cập giá trị; trong thực tế, chúng có thể được sử dụng như các biến thông thường.
int i;
int & ri = i;
Ở đây, phần ri ri là một tham chiếu số nguyên được khởi tạo cho bản i i. Nó tuyên bố là ri ri và là một đối tượng của kiểu tham chiếu trên mạng. Một tham chiếu có thể dễ bị nhầm lẫn với một con trỏ là một biến độc lập, các giá trị địa chỉ không thể được gán lại sau khi tạo.
- Cả hai đều cung cấp các khả năng gần như tương tự về khả năng sử dụng và sự khác biệt có thể là khó khăn. Một con trỏ chỉ là một biến lưu trữ địa chỉ bộ nhớ của một biến khác, trong khi một tham chiếu giống như một bí danh cho một biến đã tồn tại. Nó tạo một tên thứ hai cho một biến có thể được sử dụng để sửa đổi nội dung được lưu trữ trong biến đó.
- Một con trỏ giống như bất kỳ biến nào khác lưu trữ một phần dữ liệu. Không giống như các biến khác, biến con trỏ lưu địa chỉ bộ nhớ thay vì giá trị. Một con trỏ được hủy đăng ký bằng cách sử dụng toán tử cảm ứng * để truy cập vị trí bộ nhớ của biến mà nó trỏ tới. Mặt khác, một tài liệu tham khảo không cần bất kỳ nhà điều hành hội nghị nào để truy cập giá trị.
- Không giống như các con trỏ có thể được khởi tạo bất cứ lúc nào, các tham chiếu phải được chỉ định khi khởi tạo. Con trỏ có thể được truy cập trực tiếp, trong khi tài liệu tham khảo không thể được truy cập trực tiếp.
- Một biến con trỏ có vị trí riêng trong bộ nhớ, có nghĩa là khi bạn khai báo một con trỏ, bạn chỉ định một vị trí là địa chỉ bộ nhớ được gán cho mỗi đơn vị bộ nhớ. Biến con trỏ có cùng địa chỉ lưu trong bộ nhớ. Mặt khác, một biến tham chiếu là một bí danh cho một biến khác do đó lấy địa chỉ của biến tham chiếu.
- NULL đại diện cho phần cuối của danh sách, có nghĩa là nó chỉ ra giá trị không xác định và nó chỉ định rằng biến đó không có không gian địa chỉ hợp lệ. Giá trị NULL có thể được gán trực tiếp cho một biến con trỏ cho thấy nó không trỏ đến bất kỳ đâu, trong khi NULL không thể được gán cho một biến tham chiếu.
Con trỏ luôn là một trong những chủ đề thảo luận yêu thích của các lập trình viên C / C ++ cho đến khi các tài liệu tham khảo được đưa ra. Tài liệu tham khảo có phần giống với con trỏ nhưng có sự chia sẻ công bằng về ưu và nhược điểm. Mặc dù cả hai có thể được sử dụng để thay đổi các biến cục bộ của một hàm trong một hàm khác, chúng có những khác biệt của chúng. Cả hai đều là các tính năng mạnh mẽ trong C và C ++, cho phép bạn thao tác trực tiếp bộ nhớ, nhưng với một vài ngoại lệ. Một con trỏ giữ địa chỉ bộ nhớ của một biến, trong khi tham chiếu chỉ là bí danh cho một biến khác.