Tìm hiểu về con trỏ (Pointer) trong ngôn ngữ lập trình C

23:55 21/11/2023

Khi học và tìm hiểu về ngôn ngữ lập trình C có một phần kiến thức khá quan trọng không thể không nhắc đến – con trỏ (pointer). Về bản chất con trỏ là một biến (variable), một loại biến đặc biệt mà giá trị của nó là địa chỉ của một biến khác. Cùng tìm hiểu về cách sử dụng con trỏ trong ngôn ngữ lập trình C ở bài viết này nhé! 

Con trỏ trong ngôn ngữ lập trình C

Ví dụ quen thuộc của con trỏ: 

//Tạo biến lưu số nguyên

int soNguyen;

//Cho phép nhập vào từ bàn phím 1 số nguyên bất kỳ và lưu vào biến vừa tạo

scanf(“%d”, &soNguyen);

//In ra màn hình giá trị của số nguyên đã được lưu vào biến

printf(“\nSo Nguyen vua nhap la: %d”, soNguyen);

Khi nhìn vào ví dụ trên, bạn có thể thấy, khi dùng hàm “scanf” ta cần truyền vào “&soNguyen”, còn khi dùng hàm “printf” ta lại không cần dấu “&”. Bởi vì nếu bạn muốn thay đổi giá trị cho một biến, hàm “scanf” cần biết địa chỉ của biến đó trong bộ nhớ.

Mỗi biến mà bạn khai báo đều có địa chỉ riêng của chúng và giá trị mà chúng đang lưu trữ. Để xem được địa chỉ của biến, bạn thêm dấu “&” vào trước tên biến, chẳng hạn như: printf(“\nDia chi cua bien ‘soNguyen’ la: %x”, &soNguyen);

Để làm việc với con trỏ, bạn cần hiểu về địa chỉ của biến. Con trỏ trong C cũng chỉ là một biến có thể khai báo, khởi tạo, lưu trữ giá trị và có địa chỉ của riêng nó. Nhưng biến con trỏ không lưu giá trị bình thường, nó là biến trỏ tới một địa chỉ khác, tức mang giá trị là một địa chỉ.

Chúng ta cùng thống nhất một số khái niệm khi làm việc với con trỏ nhé:

  • Giá trị của con trỏ: là địa chỉ mà con trỏ trỏ đến.
  • Địa chỉ của con trỏ: là địa chỉ của bản thân biến con trỏ đó.
  • Địa chỉ của biến nơi con trỏ đang trỏ tới: là giá trị của con trỏ.
  • Giá trị của biến nơi con trỏ đang trỏ tới: là giá trị được nhập vào từ bàn phím.

Chính vì con trỏ mang địa chỉ nên nó là một biến đặc biệt và có thêm những quyền năng mà biến bình thường không có. Nhờ việc nó mang địa chỉ, nó có thể trỏ ở nhiều vị trí trong bộ nhớ. Đây là một điểm mạnh nếu chúng ta khai thác tốt, nhưng nếu quản lý không tốt thì lại là một sai lầm.

Cách khai báo con trỏ

Con trỏ trong C cũng có thể khai báo giống như biến bình thường, tên biến là một định danh hợp lệ. Cú pháp như sau: <kiểu dữ liệu> *<tên biến>

Trong đó:

  • Kiểu dữ liệu có thể là: void, int, float, double,…
  • Dấu * trước tên biến là ký hiệu báo cho trình biên dịch biết ta đang khai báo con trỏ.

Tiếp nối ví dụ trên:

//Tạo biến lưu số nguyên

int soNguyen;

//Khai báo con trỏ

int *p;

//Cho phép nhập vào từ bàn phím 1 số nguyên bất kỳ và lưu vào biến vừa tạo

scanf(“%d”, &soNguyen);

//Gán giá trị cho con trỏ – khởi tạo giá trị cho con trỏ là địa chỉ của biến

p = &soNguyen;

Sau khi khai báo con trỏ, bạn cần khởi tạo giá trị cho nó. Nếu con trỏ được khai báo và sau đó được sử dụng mà không được khởi tạo, giá trị của nó sẽ là giá trị rác. Điều này sẽ làm chương trình của bạn chạy không đúng, thậm chí là nguy hiểm nếu giá trị rác đó chẳng may lại là địa chỉ của 1 biến khác đang được dùng trong chương trình.

Lưu ý:

  • Con trỏ khi khai báo nên được khởi tạo giá trị ngay.
  • Con trỏ kiểu void là loại biến con trỏ tổng quát, nó có thể nhận địa chỉ của biến bất kỳ ở bất cứ kiểu dữ liệu nào.
  • Khởi tạo con trỏ bằng địa chỉ NULL nếu chưa cần dùng theo cách sau: int *p = NULL. Khi đó con trỏ NULL luôn có giá trị 0.

Để hiểu rõ hơn các quyền năng đặc biệt của con trỏ, ta cùng xem qua ví dụ sau:

// Khai báo và khởi tạo biến soNguyen = 10

int soNguyen = 10;

// Lấy giá trị của biến soNguyen

printf(“\nGia tri cua `soNguyen` = %d”, soNguyen);

// Lấy địa chỉ của biến soNguyen

printf(“\nDia tri cua `soNguyen` = %d”, &soNguyen);

/*

Khai báo và khởi tạo biến con trỏ p có giá trị là địa chỉ của biến soNguyen

*/

int *p = &soNguyen;

// Lấy giá trị của con trỏ p

printf(“\nGia tri cua con tro `p` = %d”, p);

// Lấy địa chỉ của con trỏ p

printf(“\nDia tri cua con tro `p` = %d”, &p);

// Lấy giá trị của biến mà con trỏ p đang trỏ tới dùng toán tử *

printf(“\nGia tri cua bien ma con tro `p` dang tro toi = %d”, *p);

/*

Thay đổi giá trị của biến soNguyen thông qua con trỏ p, giống như hàm scanf() có thể thay đổi giá trị của biến khi nhận vào địa chỉ. Con trỏ khi có địa chỉ của 1 biến hoàn toàn có thể thay đổi giá trị của biến đó theo cách dưới đây.

*/

// Lấy giá trị của biến soNguyen

printf(“\nGia tri cua `soNguyen` = %d”, soNguyen);

// Thay đổi giá trị của biến soNguyen thông qua `p`

*p = 100;

// Lấy giá trị của biến soNguyen

printf(“\nGia tri cua `soNguyen` = %d”, soNguyen);

// Lấy giá trị của biến mà con trỏ p đang trỏ tới dùng toán tử *

printf(“\nGia tri cua bien ma con tro `p` dang tro toi = %d”, *p);

 

/*

Việc lấy giá trị của biến thông qua con trỏ chỉ là một cách khác để lấy được giá trị của biến đó.

*/

soNguyen = 1000;

// Lấy giá trị của biến soNguyen

printf(“\nGia tri cua `soNguyen` = %d”, soNguyen);

// Lấy giá trị của biến mà con trỏ p đang trỏ tới dùng toán tử *

printf(“\nGia tri cua bien ma con tro `p` dang tro toi = %d”, *p);

Kết quả chạy:

  • Gia tri cua `soNguyen` = 10
  • Dia tri cua `soNguyen` = 6487580
  • Gia tri cua con tro `p` = 6487580
  • Dia tri cua con tro `p` = 6487568
  • Gia tri cua bien ma con tro `p` dang tro toi = 10
  • Gia tri cua `soNguyen` = 10
  • Gia tri cua `soNguyen` = 100
  • Gia tri cua bien ma con tro `p` dang tro toi = 100
  • Gia tri cua `soNguyen` = 1000
  • Gia tri cua bien ma con tro `p` dang tro toi = 1000

Vậy, địa chỉ của biến soNguyen chính là giá trị của con trỏ p, đều là `6487580`. Lưu ý mỗi lần chạy thì giá trị địa chỉ này có thể khác nhau. Con trỏ có thể lấy giá trị của biến mà nó đang trỏ tới bằng toán tử *: `printf(“\nDia tri cua con tro `p` = %d”, *p);`

Con trỏ có thể thay đổi giá trị của biến mà nó đang trỏ tới. Do nó mang địa chỉ của biến, khi đó nó hoàn toàn có quyền thay đổi giá trị của biến đó. Như ở ví dụ trên ta thay đổi giá trị từ 10 lên 100.

Hy vọng những thông tin trên sẽ giúp bạn có kiến thức cơ bản về con trỏ (pointer) và có thể sử dụng con trỏ một cách hiệu quả trong C. Chúc các bạn thành công!

Giảng viên Nguyễn Thị Hồng Hà
Bộ môn Ứng dụng phần mềm
Trường Cao đẳng FPT Mạng cá cược bóng đá cơ sở Hà Nội

Cùng chuyên mục

Đăng Kí học Fpoly 2023