Con trỏ C ++

Trong hướng dẫn này, chúng ta sẽ tìm hiểu về con trỏ trong C ++ và hoạt động của chúng với sự trợ giúp của các ví dụ.

Trong C ++, con trỏ là biến lưu địa chỉ bộ nhớ của các biến khác.

Địa chỉ trong C ++

Nếu chúng ta có một biến var trong chương trình của mình, & var sẽ cung cấp cho chúng ta địa chỉ của nó trong bộ nhớ. Ví dụ,

Ví dụ 1: In địa chỉ biến trong C ++

 #include using namespace std; int main() ( // declare variables int var1 = 3; int var2 = 24; int var3 = 17; // print address of var1 cout << "Address of var1: "<< &var1 << endl; // print address of var2 cout << "Address of var2: " << &var2 << endl; // print address of var3 cout << "Address of var3: " << &var3 << endl; )

Đầu ra

 Địa chỉ của var1: 0x7fff5fbff8ac Địa chỉ của var2: 0x7fff5fbff8a8 Địa chỉ của var3: 0x7fff5fbff8a4

Ở đây, 0xở phần đầu đại diện cho địa chỉ ở dạng thập lục phân.

Lưu ý rằng địa chỉ đầu tiên khác địa chỉ thứ hai 4 byte và địa chỉ thứ hai khác địa chỉ thứ ba 4 byte.

Điều này là do kích thước của một intbiến là 4 byte trong hệ thống 64 bit.

Lưu ý: Bạn có thể không nhận được kết quả tương tự khi chạy chương trình.

Con trỏ C ++

Như đã đề cập ở trên, con trỏ được sử dụng để lưu trữ địa chỉ hơn là giá trị.

Đây là cách chúng ta có thể khai báo con trỏ.

 int *pointVar;

Ở đây, chúng tôi đã khai báo một pointVar con trỏ của intkiểu.

Chúng ta cũng có thể khai báo con trỏ theo cách sau.

 int* pointVar; // preferred syntax

Hãy lấy một ví dụ khác về khai báo con trỏ.

 int* pointVar, p;

Ở đây, chúng ta đã khai báo một con trỏ pointVar và một biến bình thường p.
Lưu ý: Các *nhà điều hành được sử dụng sau khi kiểu dữ liệu để con trỏ khai báo.

Gán địa chỉ cho con trỏ

Đây là cách chúng ta có thể gán địa chỉ cho con trỏ:

 int* pointVar, var; var = 5; // assign address of var to pointVar pointer pointVar = &var;

Ở đây, 5được gán cho biến var. Và, địa chỉ của var được gán cho con trỏ pointVar với mã pointVar = &var.

Nhận giá trị từ địa chỉ bằng cách sử dụng con trỏ

Để nhận giá trị được trỏ bởi một con trỏ, chúng ta sử dụng *toán tử. Ví dụ:

 int* pointVar, var; var = 5; // assign address of var to pointVar pointVar = &var; // access value pointed by pointVar cout << *pointVar << endl; // Output: 5

Trong đoạn mã trên, địa chỉ của var được gán cho pointVar. Chúng tôi đã sử dụng *pointVarđể lấy giá trị được lưu trữ trong địa chỉ đó.

Khi *được sử dụng với con trỏ, nó được gọi là toán tử tham chiếu . Nó hoạt động trên một con trỏ và cung cấp giá trị được trỏ bởi địa chỉ được lưu trữ trong con trỏ. Đó là *pointVar = var,.

Lưu ý: Trong C ++, pointVar và * pointVar hoàn toàn khác nhau. Chúng ta không thể làm điều gì đó như*pointVar = &var;

Ví dụ 2: Làm việc của con trỏ C ++

 #include using namespace std; int main() ( int var = 5; // declare pointer variable int* pointVar; // store address of var pointVar = &var; // print value of var cout << "var = " << var << endl; // print address of var cout << "Address of var (&var) = " << &var << endl << endl; // print pointer pointVar cout << "pointVar = " << pointVar << endl; // print the content of the address pointVar points to cout << "Content of the address pointed to by pointVar (*pointVar) = " << *pointVar << endl; return 0; )

Đầu ra

 var = 5 Địa chỉ của var (& var) = 0x61ff08 pointVar = 0x61ff08 Nội dung của địa chỉ được trỏ đến bởi pointVar (* pointVar) = 5
Hoạt động của con trỏ C ++

Thay đổi giá trị được trỏ bởi con trỏ

Nếu pointVar trỏ đến địa chỉ của var, chúng ta có thể thay đổi giá trị của var bằng cách sử dụng * pointVar.

Ví dụ,

 int var = 5; int* pointVar; // assign address of var pointVar = &var; // change value at address pointVar *pointVar = 1; cout << var << endl; // Output: 1

Ở đây, pointVar và &varcó cùng địa chỉ, giá trị của var cũng sẽ bị thay đổi khi * pointVar được thay đổi.

Ví dụ 3: Thay đổi giá trị được trỏ bởi con trỏ

 #include using namespace std; int main() ( int var = 5; int* pointVar; // store address of var pointVar = &var; // print var cout << "var = " << var << endl; // print *pointVar cout << "*pointVar = " << *pointVar << endl << endl; cout << "Changing value of var to 7:" << endl; // change value of var to 7 var = 7; // print var cout << "var = " << var << endl; // print *pointVar cout << "*pointVar = " << *pointVar << endl << endl; cout << "Changing value of *pointVar to 16:" << endl; // change value of var to 16 *pointVar = 16; // print var cout << "var = " << var << endl; // print *pointVar cout << "*pointVar = " << *pointVar << endl; return 0; )

Đầu ra

 var = 5 * pointVar = 5 Thay đổi giá trị của var thành 7: var = 7 * pointVar = 7 Thay đổi giá trị của * pointVar thành 16: var = 16 * pointVar = 16 

Những lỗi thường gặp khi làm việc với con trỏ

Giả sử, chúng ta muốn một con trỏ varPoint trỏ đến địa chỉ của var. Sau đó,

 int var, *varPoint; // Wrong! // varPoint is an address but var is not varPoint = var; // Wrong! // &var is an address // *varPoint is the value stored in &var *varPoint = &var; // Correct! // varPoint is an address and so is &var varPoint = &var; // Correct! // both *varPoint and var are values *varPoint = var;

Bài đọc được đề xuất :

  • Làm cách nào để sử dụng con trỏ kiểu dữ liệu chung bằng con trỏ void?
  • Làm thế nào để biểu diễn một mảng bằng cách sử dụng một con trỏ?
  • Làm thế nào để sử dụng con trỏ với các hàm?
  • Làm thế nào để sử dụng con trỏ với cấu trúc?

thú vị bài viết...