Thứ Sáu, 30 tháng 7, 2021

Con trỏ trong C là gì? Giới thiệu khái niệm và nội dung cơ bản

Con trỏ trong C là một khái niệm rất quen thuộc đối với các nhà lập trình viên. Tuy cơ bản nhưng lĩnh vực kiến thức mà con trỏ trong C++ liên quan là rất rộng. Người dùng cần nắm vững những thông tin quan trọng này để có thể sử dụng một cách nhuần nhuyễn con trỏ C. Bài viết sau sẽ đề cập đến khái niệm của con trỏ C, cách sử dụng và biểu diễn nó trong ngôn ngữ lập trình như thế nào. Hãy theo dõi ngay!

Tìm hiểu địa chỉ ô nhớ trong C

Trước khi tìm hiểu khái niệm con trỏ trong C, ta sẽ điểm qua một vài thông tin của địa chỉ biến nhớ trước. Đầu tiên ta sẽ nhìn qua ví dụ sau:

int number;

printf(“\nNhap number = “);

scanf(“%d”, &number);

printf(“\nnumber = %d”, number);

Bạn có thể thấy rằng khi dùng hàm scanf, để truyền biến number ta cần dùng dấu &. Còn đối với hàm printf thì lại không cần. Lý do ở đây là gì? Câu trả lời là vì scanf cần giá trị của biến, vì thế dấu & sẽ giúp nó định vị được địa chỉ của biến đó.

Mảng con trỏ C++

Mảng con trỏ C++

Từ đó ta rút ra được kết luận: Mỗi biến đều được đính kèm địa chỉ của nó và giá trị nó đang lưu trữ. Để xác định được địa chỉ của biến, ta chỉ cần thêm dấu & đằng trước nó.

Ví dụ thực hành: Khi chạy đoạn mã sau:

#include <stdio.h>

int main()

{

  int number = 5;

  printf(“Gia tri cua number = %d”, number);

 

  // truy xuất địa chỉ bằng cách thêm & trước tên biến

  printf(“\nDia chi cua number = %d”, &number);  

  return 0;

}

Thì ta sẽ nhận được kết quả trả về là:

Gia tri cua number = 5

Dia chi cua number = 6487580

Chú ý rằng kết quả ở mỗi máy có thể khác nhau do thông số không giống nhau. Nếu bạn muốn nhận địa chỉ là hexa như đầu bài, hãy thay thế %d bằng %x.

Con trỏ trong C là gì?

Quay trở lại với khái niệm của con trỏ trong C. Con trỏ C cũng là một dạng biến có địa chỉ và giá trị đi kèm. Nhưng pointer (con trỏ C) là một biến đặc biệt, nó không lưu trữ những giá trị thông thường. Biến của con trỏ sẽ trỏ đến một địa chỉ của biến khác. Chính vì thế giá trị của nó ở trong dạng một địa chỉ.

Vậy là trong con trỏ C sẽ lưu trữ 2 địa chỉ khác nhau: địa chỉ của con trỏ là vị trí của nó nhưng giá trị của nó lại là địa chỉ của biến mà nó đang trỏ tới. Ngoài ra, nhờ khả năng lưu trữ địa chỉ đặc biệt của con trỏ C, nó cho phép người dùng trỏ đến một điểm bất kỳ trong bộ nhớ. Nếu nắm chắc cách sử dụng pointer, bạn sẽ cảm thấy đây là một điểm mạnh tuyệt vời của nó. Nhưng nếu ngược lại, vì tình trạng trỏ lung tung của pointer, người dùng không thể xử lý sẽ cho đây là một điểm yếu phiền phức.

Những nội dung liên quan đến con trỏ C++

Cách khai báo con trỏ

Cách khai báo con trỏ C cũng giống như các biến bình thường khác, bao gồm kiểu dữ liệu và tên biến được ngăn cách ở giữa bới dấu *. Điều kiện là định danh tên biến phải hợp lệ. Cú pháp mẫu khi khai báo con trỏ như sau:

<kiểu dữ liệu> * <tên biến>

hoặc

<kiểu dữ liệu>* <tên biến>

hay

<kiểu dữ liệu> *<tên biến>

Ví dụ về con trỏ trong C

Ví dụ về con trỏ trong C

Cả 3 kiểu khai báo như thế này đều đúng.

Có nhiều kiểu dữ liệu khác nhau, có thể là void, int, float hay double… đều được. Tác dụng của dấu * là cho trình biên dịch biết đằng sau nó là một biến được khai báo dạng con trỏ. Dưới đây là một số ví dụ về cú pháp cụ thể của các loại khai báo trỏ biến khác nhau:

  • Trường hợp khai báo con trỏ để trỏ tới biến kiểu nguyên: int *p_i;
  • Trường hợp khai báo con trỏ C++ kiểu int, biến val (không phải con trỏ) cũng kiểu int: int *p, val;
  • Trường hợp khai báo con trỏ để trỏ tới biến kiểu thực: float *p_f;
  • Trường hợp khai báo con trỏ để trỏ tới biến kiểu ký tự: char *p_char;
  • Trường hợp khai báo con trỏ kiểu void (không kiểu): void *p_v;

Gán địa chỉ vào con trỏ trong C

Bạn chỉ nên gán địa chỉ cho con trỏ sau khi đã khai báo nó thành công. Nếu chưa khai báo mà bạn đã gán giá trị thì con trỏ đó sẽ tương đương như một biến rác, có thể làm lỗi hệ thống khi khởi chạy. Phiền phức hơn, nếu con trỏ đó bị trỏ đến một biến quan trọng, nó sẽ làm đảo lộn toàn bộ phần mềm của bạn.

Có 2 trường hợp để bạn gán địa chỉ cho con trỏ trong C:

  • Gán địa chỉ sau khi đã khai báo: Trong ví dụ dưới đây, giá trị được gán cho p là địa chỉ của value.

int *p, value;

value = 5;

p = &value;

  • Khai báo và gán địa chỉ đồng thời: Trong ví dụ dưới, hoạt động khai báo và gán giá trị cho p là địa chỉ của value được thực hiện cùng lúc.

int value = 5;

int *p = &value;

Lưu ý rằng hoạt động khởi tạo và gán địa chỉ nên được thực hiện cùng nhau. Nếu con trỏ bạn định khởi tạo là dạng void, nó có thể được trỏ tới bất kỳ địa chỉ của bất kỳ biến hay kiểu dữ liệu nào. Nếu bạn đã khai báo con trỏ rồi nhưng vẫn chưa biết gắn vào địa chỉ nào thì hay trỏ nó đến NULL bằng cú pháp int *p = NULL. Khi đó con trỏ sẽ vô hại với giá trị bằng 0.

Cấu tạo của con trỏ C

Cấu tạo của con trỏ C

Mối quan hệ giữa con trỏ và mảng động trong C++

Biến con trỏ và mảng động trong C++ có một mối liên hệ rất lớn. Trước hết ta sẽ đi nhanh về những định nghĩa cơ bản. Biến động còn được gọi là biến cấp phát động. Nó được hiểu như một kiểu dữ liệu dùng để định nghĩa. Nó không có tên mà cũng không được khai báo trong vùng biến. Biến động không được liên kết với bất kỳ biến nào. Để quản lý nó, người ta sẽ dùng con trỏ trong C++.

Vì biến động không có tên hay phần khai báo nên con trỏ sẽ quản lý các biến cấp phát động trong C++. Khi đó ta gọi nó là biến con trỏ. Để bắt đầu cấp phát vùng nhớ cho một vùng nhớ, ta sẽ thực hiện như sau:

new <kiểu_dữ_liệu>;

Ví dụ thực tế:

new int;

new float;

Khi cấp phát thành công, con trỏ sẽ tự động trỏ đến biến động. Vì biến động không có địa chỉ, ta phải gắn địa chỉ của nó lên con trỏ như sau:

int *ptr = new int; 

Lúc này, con trỏ đã được trỏ tới biến động kiểu int.

Ngoài ra, bạn cũng có thể khai báo là khởi tạo giá trị cùng lúc như sau:

int *ptr1 = new int(2409);

Nếu muốn xóa vùng nhớ của biến động, ta sẽ dùng toán tử delete. Cú pháp mẫu như sau:

delete <tên_biến_con_trỏ>;

Ví dụ thực tế: delete ptr_a;

Hướng dẫn sử dụng con trỏ

Hướng dẫn sử dụng con trỏ

Kết luận

Qua bài viết trên, hẳn là bạn đọc đã biết thêm được rất nhiều thông tin hữu ích xoay xung quanh chủ đề về con trỏ trong C. Nhìn chung, con trỏ trong C có liên quan mật thiết đến rất nhiều lĩnh vực khác nhau tại cấp phát động trong C. Vì thế để thao tác thành thạo với ngôn ngữ lập trình C++, con trỏ là phần bạn phải hiểu rõ. Những khái niệm như địa chỉ ô nhớ hay cách khai báo, cách gán biến nhớ chỉ là những kiến thức cơ bản và đơn giản nhất. Phạm vi kiến thức mà con trỏ C mang đến còn rất nhiều, đòi khỏi người học phải biết tự tìm tòi và rèn luyện chăm chỉ.

Mời bạn đọc tham khảo thêm: Hadoop là gì?

Tuy nhiên bạn đừng nản chí bởi con trỏ C là phần không quá khó nếu được luyện tập nhiều lần. Đây cũng là phần mà bất kỳ lập trình viên nào cũng cần thông thạo. Vì thế bên cạnh những kiến thức mà Teky cung cấp, hãy chịu khó tìm đọc thêm nhiều tài liệu nâng cao hơn về con trỏ C nhé. Rất nhiều thông tin hữu ích được biên soạn lại bằng tiếng Việt, vì thế bạn cũng không cần lo lắng không tìm được tài liệu dễ hiểu. Chúc bạn đọc nhanh chóng làm chủ được phần kiến thức xung quanh con trỏ C++.

The post Con trỏ trong C là gì? Giới thiệu khái niệm và nội dung cơ bản appeared first on TEKY - Học viện sáng tạo công nghệ.



source https://teky.edu.vn/blog/con-tro-trong-c/

Không có nhận xét nào:

Đăng nhận xét