Khóa học c

Pointer trong C là gì

0 phút đọc

Pointer (biến con trỏ) là các biến đặc biệt được sử dụng để lưu trữ địa chỉ hơn là giá trị.

Và trong bài học ngày hôm nay chúng ta sẽ cùng tìm hiểu về:

  • Cú pháp con trỏ.
  • Gán địa chỉ vào một con trỏ.
  • Lấy giá trị của địa chỉ được con trỏ trỏ vào.
  • Thay đổi giá trị được trỏ bởi con trỏ.
  • Cách con trỏ hoạt động.

Cú pháp con trỏ trong C

Đây là cách chúng ta dùng để khai báo con trỏ:

cpp Copy
int* p;

Tại đây ta đã khai báo một con trỏ tên là p và có kiểu dữ liệu là int.

Hoặc ta có thể khai báo theo cách sau:

cpp Copy
int *p1;
int * p2;

Chú ý ta có trường hợp sau:

cpp Copy
int* p1, p2;

Dòng lệnh trên có nghĩa là chúng ta khai báo một con trỏ p1 kiểu dữ liệu int và một biến p2 cùng kiểu dữ liệu

Gắn địa chỉ cho con trỏ trong C

Ví dụ:

cpp Copy
int* pc, c;
c = 10;
pc = &c;

Như đã nói ở trên, tại đây chúng ta đang khai báo con trỏ pc và một biến c mang cùng kiểu dữ liệu int.

Ở đây 10 được gán cho biến c, sau đó địa chỉ của c được gán cho con trỏ pc

Lấy giá trị của con trỏ trong C

Để nhận giá trị từ địa chỉ được con trỏ trỏ vào ta sử dụng *, Ví dụ:

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

Địa chỉ của c được trỏ bởi con trỏ pc: pc = &c . Để lấy giá trị được lưu trữ trong địa chỉ đó chúng ta sử dụng *pc.

pc là một con trỏ trỏ tới một địa chỉ, còn *pc là cú pháp để lấy giá trị được lưu trữ trong địa chỉ mà con trỏ pc trỏ vào nên chúng ta không được code như *pc = &c.

Thay đổi giá trị của con trỏ

Ví dụ 1:

cpp Copy
int* pc, c;
c = 10;
pc = &c;
c = 2;
printf("%d", c);    // Output: 2
printf("%d", *pc);  // Output: 2

Tại ví dụ này chúng ta đã dùng con trỏ pc để trỏ tới địa chỉ của c thì khi ta thay đổi biến c = 2 đồng nghĩa với việc *pc cũng được thay đổi giá trị thành 2.

Ví dụ 2:

cpp Copy
int* pa, a, b;
a = 2;
b = -3;

pa = &a;
printf("%d", *pa); // Output: 2
pa = &b;
printf("%d", *pa); // Output: -3

Ở ví dụ này con trỏ pa sẽ trỏ vào địa chỉ của biến a
mà giá trị của biến a lúc này là 2 nên giá trị của *pa cũng là 2.

Sau đó con trỏ pa sẽ trỏ vào địa chỉ của biến b, tương tự *pa lúc này mang giá trị là -3 do b = -3.

Cách làm việc của con trỏ

Ví dụ:

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

   c = 18;
   printf("Address of c: %p\n", &c);
   printf("Value of c: %d\n\n", c);

   pc = &c;
   printf("Address of pointer pc: %p\n", pc);
   printf("Content of pointer pc: %d\n\n", *pc);

   c = 10;
   printf("Address of pointer pc: %p\n", pc);
   printf("Content of pointer pc: %d\n\n", *pc);

   *pc = -2;
   printf("Address of c: %p\n", &c);
   printf("Value of c: %d\n\n", c);
   return 0;
}

Kết quả

Address of c: 000000000062FE14
Value of c: 18

Address of pointer pc: 000000000062FE14
Content of pointer pc: 18

Address of pointer pc: 000000000062FE14
Content of pointer pc: 10

Address of c: 000000000062FE14
Value of c: -2

Giải thích về cách hoạt động của con trỏ.

cpp Copy
int* pc, c;

Tại đây chúng ta đang khai báo một con trỏ pc và một biến c thuộc kiểu dữ liệu int.

cpp Copy
c = 18;

Giá trị 18 đang được lưu trữ trong bộ nhớ của c.

cpp Copy
pc = &c;

Con trỏ pc sẽ trỏ đến địa chỉ bộ nhớ của biến c.

cpp Copy
c = 10;

Giá trị 10 được lưu trữ trong bộ nhớ của c.

Trong khi đó con trỏ pc đang được trỏ đến địa chỉ bộ nhớ của biến sẽ nên lúc này *pc sẽ có giá trị là 10.

cpp Copy
*pc = -2;

Ta thay đổi giá trị được lưu trữ tại bộ nhớ mà con trỏ pc trỏ vào nên giá trị của biến c thay đổi, lúc này giá trị được lưu trự tại biến c-2.

Avatar
Được viết bởi

Admin Team

Gợi ý câu hỏi phỏng vấn

Không có dữ liệu

Không có dữ liệu

Gợi ý bài viết
Không có dữ liệu

Không có dữ liệu

Bình luận

Chưa có bình luận nào

Chưa có bình luận nào