Con trỏ trong C++ là gì? Các khái niệm cơ bản xung quanh con trỏ

Con trỏ hay còn được gọi là Pointer trong C++ là một phần học thức khá khó. Không những thế cũng không kém phần thú vị. Nếu bạn nắm chắc cách dùng con trỏ trong C++ thì sẽ đơn giản thực hiện các thao tác thượng hạng cùng bộ nhớ lưu trữ. Việc này là vô cùng thiết yếu nếu mục tiêu của các bạn là trở thành một lập trình viên chuyên nghiệp. Vốn dĩ các thông tin xung quanh con trỏ C++ rất mênh mông. Chính vì thế, trong nội dung này, Teky sẽ đề cập nhanh đến các khái niệm cơ bản cho những bạn chưa từng xem qua về con trỏ C++ trước đó. Hãy cùng khởi đầu thôi.

Khái niệm của con trỏ trong C++

Tìm tòi thiết kế laptop

Để hiểu được khái niệm của con trỏ trong C++, ta cần khởi đầu với kết cấu của sản phẩm tính trước, rõ ràng và cụ thể là bộ nhớ lưu trữ, hay còn gọi là Bộ nhớ đệm. Bộ nhớ đệm là tên viết tắt của Random Access Memory. Bộ nhớ đệm được sử dụng như một bộ nhớ lưu trữ tạm thời để giải quyết các dữ liệu trong điều kiện được phân phối điện. Nếu Bộ nhớ đệm bị ngắt điện, nó sẽ chẳng thể hoạt động được nữa. Bộ nhớ đệm được kết cấu nên từ rất là nhiều ô nhớ. Mỗi ô có kích cỡ là 1 byte = 8 bit & sở hữu một địa chỉ duy nhất. Các ô nhớ được đánh số xuất phát điểm từ 0 trở đi.

Mỗi kiểu dữ liệu lại có kích cỡ khác nhau. Chính vì như thế, không phải kiểu dữ liệu nào cũng nằm gọn trong một ô nhớ được. Ta biết rằng địa chỉ của biến dữ liệu chính là địa chỉ của ô nhớ nó nằm trong. Vậy nếu chẳng hạn như kiểu int chiếm tới 4 ô nhớ thì địa chỉ của nó là gì? Khi một biến chiếm nhiều ô nhớ, địa chỉ của nó là địa chỉ của ô nhớ trước nhất trong chuỗi các ô nhớ liền kề nhau.

Khi trình biên dịch code hoạt động, nó sẽ dành riêng một vùng để ghi nhớ các biến. Địa chỉ của biến là địa chỉ của ô nhớ trước nhất trong chuỗi liền kề. Khi được gọi tên, nó sẽ tự truy xuất đến địa chỉ phù hợp. Các biến khác nhau không nhất thiết phải liền kề nhau.

Xem Thêm  Top 19 kết quả tìm kiếm down game ban trung mới nhất 2022

Cấp bộ nhớ lưu trữ trong C++

Khi ta tiến hành khai báo tên & vùng nhớ cố định cho một biến, nó được gọi là biến tĩnh hay biến được cấp phát tĩnh. Vì nó nối liền với vùng nhớ cố định nên trong công cuộc chương trình được thực thi chẳng thể ảnh hưởng lên nó được. Ảnh hưởng ở giai đoạn này bao gồm xóa đi & cả biến đổi kích cỡ. Toàn bộ những điều này chỉ có thể thực hiện khi chương trình chấm dứt.

Chính vì thế, nó gây phiền toái trong hơi nhiều trường hợp. Khi một biến trở nên vô ích hoặc bành trướng quá mức mà ta chẳng thể xóa & cân chỉnh nó thì sẽ gây nên chiếm hữu bộ nhớ lưu trữ & hoang phí tài nguyên. Biện pháp trong trường hợp này chính là biến được hoặc biến được cấp phát động trong C++.

Biến động là một kiểu dữ liệu đã được khái niệm. Nó có tên nhưng không được khai báo biến. Biến động sẽ được cấp phát một vùng nhớ trong Bộ nhớ đệm, có thể sử dụng khi có nguồn điện áp & trái lại, không hoạt động khi không có nguồn điện áp. Biến động sẽ được điều khiển bằng con trỏ trong C++.

Biến con trỏ trong C++

Bản thân một con trỏ trong C++ là một biến, vậy nên nó chứa địa chỉ của ô nhớ trước nhất trong vùng nhớ. Con trỏ C++ có thể chứa địa chỉ của cả biến tĩnh lẫn biến động. Không những thế, như đã nói ở trên, biến động không có tên, chính vì thế con trỏ C++ sẽ chịu nhiệm vụ làm chủ biến động đó. Khi đó ta nói, con trỏ này trỏ đến biến kia hoặc con trỏ này tham chiếu đến vùng nhớ kia. Mỗi con trỏ chứa một địa chỉ khác nhau nên chúng cũng có kích cỡ khác nhau.

Khi làm việc với con trỏ C++, ta chẳng thể tự ý biến đổi địa chỉ của nó, đây là việc HĐH chịu nhiệm vụ. không dừng lại ở đó, không phải vùng nhớ nào con trỏ C++ cũng tham chiếu được. Nó chỉ có thể trỏ đến loại dữ liệu phù hợp mà thôi. Bản chất của con trỏ C++ là làm chủ địa chỉ, chính vì thế ta chẳng thể trỏ nó đến biểu thức hoặc hằng, những đối tượng này vốn không có địa chỉ.

Xem Thêm  Các phần tử về cụm từ trong HTML

Cách dùng con trỏ trong C++

Khai báo con trỏ C++

Để khai báo con trỏ C++, ta thực hiện một cách thức giống như các biến bình bình:

<kiểu dữ liệuvàgt; * <tên biếnvàgt;

Trong số đó, kiểu dữ liệu có thể là nguyên thủy như int, char, double hoặc các struct, class như vectorvàlt;stringvàgt;, queuevàlt;pairvàlt;int, intvàgt;>. Toàn bộ đều được. Nhưng nếu một con trỏ trỏ vào nhiều biến khác nhau trong những thời điểm khác nhau thì các biến này cần phải có cùng một kiểu dữ liệu. Cần phải có kiểu dữ liệu chung giữa các biến thì mới có thể khai báo được. Dấu * trong cách thức có nghĩa rằng ta đang báo hiệu hoạt động khai báo con trỏ cho trình biên dịch.

Một số chẳng hạn thường gặp về kiểu khai báo cho các loại dữ liệu khác nhau:

  • Nếu biến có kiểu dữ liệu int thì cú pháp khai báo sẽ là int *p hoặc int* p.
  • Nếu biến có kiểu dữ liệu string hoặc queuevàlt;charvàgt; thì cú pháp khai báo sẽ là string *s hoặc queuevàlt;charvàgt; *q.

Vậy có trường hợp nào con trỏ trỏ vào con trỏ mà không trỏ vào biến không? Giải đáp là có. Con trỏ cũng là một biến, nó được hiểu như một kiểu dữ liệu. Chính vì thế một con trỏ bất kỳ có thể trỏ vào con trỏ khác nó. Không những thế phương pháp thực hiện khá cầu kỳ & hầu hết chỉ được dùng trong các cuộc thi lập trình chuyên nghiệp. Chính vì thế Teky sẽ không đề cập sâu hơn ở giai đoạn này.

Gán giá trị cho con trỏ

Sau khoảng thời gian khai báo hoàn thành thì ta cần gán giá trị cho con trỏ trong C++. Bạn cũng nên cảnh báo rằng, nếu dùng con trỏ mà không khởi tạo thì giá trị của nó sẽ vô nghĩa, hay còn được gọi là giá trị rác. Rất là nhiều nguy cơ có thể xảy ra nếu chương trình dính giá trị rác, nhất là khi giá trị rác bị trùng với một địa chỉ biến mà bạn đang sử dụng.

Xem Thêm  Đồ án " Bài toán Quản lý sinh viên bằng danh sách liên kết đơn " pdf

Để khởi tạo & khai báo giá trị cho con trỏ, ta đọc qua chẳng hạn sau:

int *p, value;

value = 5;

p = &value; // khởi tạo giá trị cho con trỏ p là địa chỉ của value

Hoặc bạn cũng có thể khai báo & khởi tạo song song:

int value = 5;

int *p = &value; // khai báo con trỏ p & khởi tạo giá trị cho con trỏ là địa chỉ của value

Còn nếu lỡ khai báo con trỏ rồi nhưng nó vẫn chưa có giá trị phù hợp, ta tạm thời khởi tạo giá trị NULL cho nó theo cách thức: int *p_int = NULL;

Truy cập vào biến được con trỏ trỏ tới

Con trỏ được dùng để đặt tên khác cho một biến bất kỳ nào đó. Khi bạn mong muốn truy cập vào biến p được con trỏ trỏ tới, hãy quan tâm tới *p. *p sẽ có kiểu hiện ra giống với p. Chính vì thế cách truy cập p chính là truy cập *p. Điều này được trổ tài rõ trong chẳng hạn sau:

int *p_int = …; // something which does not matter

string *p_string = …; // something which does not matter

*p_int = 5; (*p_int)++; cout << *p_int << endl;

if (!(*p_string).empty()) for (int i = 0; i < (*p_string).size(); i++) printf(“%c”, (*p_string)[i]);

Tổng kết

Với những học thức căn bản vừa được Teky đem đến, hẳn độc giả đã có những khái niệm trực quan hơn về con trỏ trong C++. Đây chưa lúc nào là một ngành nghề dễ tìm hiểu cả. Không những thế nó lại chứa đựng nhiều điều rất thú vị. Chính vì thế sẽ không hoang phí thời gian khi bạn quyết định tìm tòi sâu hơn về con trỏ trong C++. Để có thể thành thảo sử dụng con trỏ C++, khuyến cáo của Teky là chúng ta nên thực hành nhiều lần & vận dụng thường xuyên vào công việc của mình nếu được. Chúc bạn có thể mau chóng kiểm soát ngành nghề này!

Viết một bình luận