Con trỏ trong ngôn ngữ C++ là một biến, nó còn được gọi là định vị hoặc chỉ báo trỏ đến một địa chỉ của một giá trị.
Biểu tượng của một địa chỉ được đại diện bởi một con trỏ. Ngoài việc tạo và sửa đổi cấu trúc dữ liệu động, chúng cho phép các chương trình mô phỏng theo tham chiếu. Một trong những ứng dụng chính của con trỏ là lặp qua các thành phần của mảng hoặc các cấu trúc dữ liệu khác. Biến con trỏ tham chiếu đến cùng kiểu dữ liệu với biến mà bạn đang xử lý có địa chỉ của biến đó được đặt cho nó (chẳng hạn như kiểu int hoặc chuỗi).
cú pháp
- kiểu dữ liệu *var_name;
- int *ptr; // ptr có thể trỏ đến một địa chỉ chứa dữ liệu int
Làm thế nào để sử dụng một con trỏ?
- Thiết lập một biến con trỏ.
- sử dụng toán tử một ngôi (&), cho ra địa chỉ của biến, để gán một con trỏ tới địa chỉ của biến.
- Sử dụng toán tử một ngôi (*), cung cấp giá trị của biến tại địa chỉ được cung cấp bởi đối số của nó, người ta có thể truy cập giá trị được lưu trữ trong một địa chỉ.
Vì kiểu dữ liệu biết thông tin được lưu giữ trong bao nhiêu byte nên chúng tôi liên kết nó với một tham chiếu. Kích thước của kiểu dữ liệu mà một con trỏ trỏ tới được thêm vào khi chúng ta tăng một con trỏ.
Lợi thế của con trỏ
1) Con trỏ giảm mã và cải thiện hiệu suất, nó được sử dụng để truy xuất chuỗi, cây, v.v. và được sử dụng với mảng, cấu trúc và hàm.
2) Chúng ta có thể trả về nhiều giá trị từ hàm bằng cách sử dụng con trỏ.
3) Nó giúp bạn có thể truy cập vào bất kỳ vị trí bộ nhớ nào trong bộ nhớ của máy tính.
Cách sử dụng con trỏ
Có nhiều cách sử dụng con trỏ trong ngôn ngữ C++.
1) Cấp phát bộ nhớ động
Trong ngôn ngữ c, chúng ta có thể cấp phát bộ nhớ động bằng cách sử dụng các hàm malloc() và calloc() nơi sử dụng con trỏ.
2) Mảng, hàm và cấu trúc
Con trỏ trong ngôn ngữ c được sử dụng rộng rãi trong mảng, hàm và cấu trúc. Nó làm giảm mã và cải thiện hiệu suất.
Các ký hiệu dùng trong con trỏ
Biểu tượng | Tên | Sự miêu tả |
---|---|---|
& (dấu ampersand) | Toán tử địa chỉ | Xác định địa chỉ của một biến. |
∗ (dấu hoa thị) | toán tử chỉ hướng | Truy cập giá trị của một địa chỉ. |
Khai báo một con trỏ
Con trỏ trong ngôn ngữ C++ có thể được khai báo bằng dấu ∗ (ký hiệu dấu hoa thị).
- int ∗a; //con trỏ tới int
- ký tự ∗c; //con trỏ tới char
Ví dụ con trỏ
Hãy xem ví dụ đơn giản về việc sử dụng con trỏ in địa chỉ và giá trị.
- #include <iostream>
- sử dụng không gian tên std;
- int chính ()
- {
- số nguyên = 30;
- int ∗p;
- p=&số; // lưu địa chỉ của biến số
- cout<< “Địa chỉ của biến số là:” <<&number<<endl;
- cout<< “Địa chỉ của biến p là:” <<p<<endl;
- cout<< “Giá trị của biến p là:” <<*p<<endl;
- trả về 0;
- }
Đầu ra:
Địa chỉ của biến số là: 0x7ffccc8724c4 Địa chỉ của biến p là: 0x7ffccc8724c4 Giá trị của biến p là:30
Con trỏ Chương trình hoán đổi 2 số không dùng biến thứ 3
- #include <iostream>
- sử dụng không gian tên std;
- int chính ()
- {
- int a=20,b=10,∗p1=&a,∗p2=&b;
- cout<< “Trước khi hoán đổi: ∗p1=” <<∗p1<< ” ∗p2=” <<∗p2<<endl;
- ∗p1=∗p1+∗p2;
- ∗p2=∗p1-∗p2;
- ∗p1=∗p1-∗p2;
- cout<< “Sau khi hoán đổi: ∗p1=” <<∗p1<< ” ∗p2=” <<∗p2<<endl;
- trả về 0;
- }
Đầu ra:
Trước khi hoán đổi: ∗p1=20 ∗p2=10 Sau khi hoán đổi: ∗p1=10 ∗p2=20
Con trỏ và chuỗi ký tự là gì?
Chuỗi ký tự là mảng các chuỗi ký tự có kết thúc bằng null. Các phần tử của một chuỗi ký tự là các mảng kiểu const char (vì các ký tự trong một chuỗi không thể sửa đổi được) cộng với một ký tự null kết thúc.
Con trỏ void là gì?
Loại con trỏ duy nhất này, có sẵn trong C++, đại diện cho việc thiếu loại. Con trỏ trỏ đến một giá trị không có loại được gọi là con trỏ void (và do đó cũng có độ dài không xác định và thuộc tính hội nghị không xác định). Điều này chỉ ra rằng con trỏ void rất linh hoạt vì chúng có thể trỏ tới bất kỳ kiểu dữ liệu nào. Sự linh hoạt này có lợi ích. Không thể hủy đăng ký trực tiếp với những con trỏ này. Trước khi chúng có thể được hủy đăng ký, chúng phải được chuyển đổi thành một loại con trỏ khác trỏ đến một loại dữ liệu cụ thể.
Con trỏ không hợp lệ là gì?
Một con trỏ phải trỏ đến một địa chỉ hợp lệ, không nhất thiết phải trỏ đến các mục hữu ích (như đối với mảng). Chúng tôi gọi đây là những con trỏ không chính xác. Ngoài ra, con trỏ không chính xác là con trỏ chưa được khởi tạo.
- int *ptr1;
- mảng int [10];
- int *ptr2 = mảng+20;
Ở đây, ptr1 không được khởi tạo, làm cho nó không hợp lệ và ptr2 nằm ngoài giới hạn của arr, làm cho nó yếu tương tự. (Hãy lưu ý rằng không phải tất cả các lỗi xây dựng đều do các tham chiếu bị lỗi gây ra.)
Con trỏ null là gì?
Một con trỏ null không chỉ đơn thuần là một địa chỉ không chính xác; nó cũng chỉ hư không. Đây là hai cách để đánh dấu một con trỏ là NULL:
- int *ptr1 = 0;
- int *ptr2 = NULL;
Con trỏ tới con trỏ là gì?
Trong C++, chúng ta có khả năng xây dựng một con trỏ tới một con trỏ khác, sau đó con trỏ này có thể trỏ tới dữ liệu hoặc một con trỏ khác. Toán tử một ngôi (*) là tất cả những gì cần thiết trong cú pháp khai báo con trỏ cho mỗi cấp độ gián tiếp.
- ký tự a;
- ký tự *b;
- ký tự ** c;
- a = ‘g’ ;
- b = &a;
- c = &b;
Ở đây b trỏ đến một ký tự lưu trữ ‘g’ và c trỏ đến con trỏ b.
Tài liệu tham khảo và con trỏ là gì?
- Gọi theo giá trị
- Gọi theo tham chiếu với đối số con trỏ
- Gọi theo tham chiếu với đối số tham chiếu
Ví dụ
- #bao gồm
- sử dụng không gian tên std;
- // Truyền qua giá trị
- int vuông1( int n)
- { cout << “địa chỉ của n1 trong ô vuông1(): ” << &n << “\n” ;
- n *= n;
- trả lại n;
- }
- // Pass-by-Reference với đối số con trỏ
- khoảng trống hình vuông2( int * n)
- {
- cout << “địa chỉ của n2 trong square2(): ” << n << “\n” ;
- *n *= *n;
- }
- // Truyền qua tham chiếu với đối số tham chiếu
- khoảng trống hình vuông3( int & n)
- {
- cout << “địa chỉ của n3 trong square3(): ” << &n << “\n” ;
- n *= n;
- }
- ví dụ về khoảng trống ()
- {
- // Gọi theo giá trị
- int n1 = 8;
- cout << “địa chỉ của n1 trong hàm main(): ” << &n1 << “\n” ;
- cout << “Bình phương của n1: ” << bình phương1(n1) << “\n” ;
- cout << “Không thay đổi n1: ” << n1 << “\n” ;
- // Gọi theo tham chiếu với đối số con trỏ
- int n2 = 8;
- cout << “địa chỉ của n2 trong hàm main(): ” << &n2 << “\n” ;
- hình vuông2(&n2);
- cout << “Bình phương của n2: ” << n2 << “\n” ;
- cout << “Thay doi trong n2: ” << n2 << “\n” ;
- // Gọi theo tham chiếu với đối số tham chiếu
- int n3 = 8;
- cout << “địa chỉ của n3 trong hàm main(): ” << &n3 << “\n” ;
- hình vuông3(n3);
- cout << “Bình phương của n3: ” << n3 << “\n” ;
- cout << “Thay doi trong n3: ” << n3 << “\n” ;
- }
- // Chương trình điều khiển
- int main() { ví dụ(); }
đầu ra