Pointer trong C

Pointer là gì?

Pointer là tính năng rất mạnh mẽ trong C và C++. Trước khi tìm hiểu về pointer, chúng ta hãy tìm hiểu về address trước nhé.


Address trong C

Nếu bạn có một biến var trong chương trình, thì &var sẽ cho ra địa chỉ address của biến này trong bộ nhớ.

Chúng ta xem xét ví dụ sau

#include <stdio.h>
int main()
{
  int var = 5;
  printf("var: %d\n", var);
  printf("địa chỉ của var: %p", &var);  
  return 0;
}

Kết quả

var: 5 
địa chỉ của var: 2686778

C pointer

pointer là một biến đặc biệt, nó dùng để chứa một địa chỉ address thay vì là một giá trị thông thường.

Cú pháp

int* p;

Ở đây chúng ta khai báo một pointer tên là p với kiểu int.
Chúng ta cũng có thể khai báo như sau

int *p1;
int * p2;

Một ví dụ khác về khai báo

int* p1, p2;

p1pointer trong khi p2 là một biến bình thường.


Gán địa chỉ address vào pointer

int* pc, c;
c = 5;
pc = &c;

Ở ví dụ này, biến c được gán giá trị 5 và address của biến c được gán vào pointer pc.


Lấy giá trị của biến được trỏ vào pointer.

int* pc, c;
c = 5;
pc = &c;
printf("%d", *pc);   // Output: 5

pc chứa địa chỉ của biến c, vậy nếu muốn lấy giá trị của biến c ta có thể gọi *pc.
Chúng ta có thể hiểu như sau

pc = &c
*pc = c

Thay đổi giá trị của biến được trỏ vào pointer

int* pc, c;
c = 5;
pc = &c;
c = 1;
printf("%d", c);    // Output: 1
printf("%d", *pc);  // Ouptut: 1

Chúng ta đã gán address của c vào pointer pc.
Khi c thay đổi thành 1, giá trị của pc vẫn là address của c. Vậy nên khi ta gọi *pc vẫn sẽ cho ra 1.


Ví dụ

#include <stdio.h>
int main()
{
   int* pc, c;

   c = 22;
   printf("Địa chỉ của c: %p\n", &c);
   printf("Giá trị của c: %d\n\n", c);  // 22

   pc = &c;
   printf("Giá trị của pointer pc: %p\n", pc);
   printf("Nội dung được trỏ tới của pointer pc: %d\n\n", *pc); // 22

   c = 11;
   printf("Giá trị của pointer  pc: %p\n", pc);
   printf("Nội dung được trỏ tới của pointer pc: %d\n\n", *pc); // 11

   *pc = 2;
   printf("Địa chỉ của c: %p\n", &c);
   printf("Giá trị của c: %d\n\n", c); // 2
   return 0;
}

Kết quả

Địa chỉ của c: 2686784
Giá trị của c: 22

Giá trị của pointer pc: 2686784
Nội dung được trỏ tới của pointer pc: 22

Giá trị của pointer pc: 2686784
Nội dung được trỏ tới của pointer pc: 11

Địa chỉ của c: 2686784
Giá trị của c: 2

Giải thích
1. int* pc, c;
pointer 1
Lệnh trên khai báo một pointer pc và một biến thường c. Ví chưa gán giá trị nên cả 2 biến đều rỗng.
2. c = 22;
pointer 2
Biến c được gán giá trị là 22.
3.pc = &c;
pointer 3
Địa chỉ address của biến c đã được gán vào pc.

  1. c = 11;
    pointer 4
    Giá trị của c được thay đổi thành 11.

  2. *pc = 2;
    pointer 5
    Thay đổi nội dung được trỏ tới của pointer pc thành 2. Điều đó cũng có nghĩa là c thay đổi thành 2.


Những sai lầm phổ biến khi làm việc với pointer trong C

Giả sử bạn muốn một pointer pc trỏ tới địa chỉ của biến c.

int c, *pc;

// pc là địa chỉ address nhưng c không phải
pc = c; // Error

// &c là địa chỉ address nhưng *pc thì không
*pc = &c; // Error

// cả &c và pc là địa chỉ address
pc = &c;

// cả c và *pc là một giá trị 
*pc = c;

Một ví dụ mà các bạn hay dễ nhầm lẫn:

int c = 5;
int *p = &c;

Tại sao int *p = &c; lại hoạt động?
Bởi điều này tương đương với

int c = 5;
int *p:
p = &c;

Lưu ý rằng, trong cả 2 trường hợp chúng ta đều tạo pointer p(không phải *p) và gán địa chỉ vào p.
Để tránh hiểu nhầm chúng ta cũng có thể gõ cú pháp như sau để nhấn mạnh pointer là p mà không phải là *p

int* p; //thay vì int *p;
Series Navigation<< Array đa chiều trong CMối quan hệ giữa Array và Pointer trong C >>

Trả lời

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *