Chuyển đến nội dung
AIOTAIOT
  • Trang chủ
  • Giới thiệu
  • Tin tức
  • Sản phẩm
  • Giải pháp
    • Chấm công bằng Face ID
    • Thiết bị đọc căn cước
    • IoT trong giáo dục
    • IoT trong quản lý năng lượng
    • IoT trong y tế
  • Đào tạo
    • Khóa đào tạo cơ bản
      • Hệ thống nhúng
      • LabVIEW FPGA
      • Phần cứng máy tính & Truyền thông công nghiệp
      • FPGA cơ bản
    • Khóa đào tạo nâng cao
      • LabVIEW FPGA High Performance
    • Tài liệu
  • PCCC
  • Liên hệ
  • icon
    097 186 8316    |    0839 799 889
Đào tạo, Hệ thống nhúng, Khóa đào tạo cơ bản

[Embedded Series – Bài 5] Làm Chủ Con Trỏ (Pointer) Và Quy Ước Lập Trình C

Đã đăng trên 07/04/202606/04/2026 bởi ThaoNguyen
07
Th4

[Embedded Series – Bài 5] Con Trỏ (Pointer) Và Quy Ước Trình Bày Chương Trình

Trong lập trình C, đặc biệt là lập trình Nhúng, Con trỏ (Pointer) là một trong những phần kiến thức quan trọng và mạnh mẽ nhất. Bài viết này sẽ giúp bạn hiểu rõ bản chất của con trỏ, cách nó tương tác với mảng, hàm và những quy tắc để viết mã nguồn chuyên nghiệp tại AIoT Systems.

🎯 Mục tiêu học tập

  • Nắm vững khái niệm con trỏ, địa chỉ và giá trị của vùng nhớ.
  • Thành thạo khai báo, gán giá trị và sử dụng con trỏ để thay đổi dữ liệu gián tiếp.
  • Hiểu mối quan hệ mật thiết giữa con trỏ và mảng.
  • Phân biệt truyền tham trị và truyền tham chiếu trong hàm.
  • Nhận biết rủi ro khi hàm trả về địa chỉ của biến cục bộ.

1. Con trỏ (Pointer)

a) Khái niệm

Con trỏ trong C cũng chỉ là một biến. Nó có thể được khai báo, khởi tạo và lưu trữ giá trị, đồng thời có địa chỉ của riêng nó. Tuy nhiên, thay vì lưu trữ các giá trị thông thường (như số nguyên, ký tự), biến con trỏ lưu trữ địa chỉ của một biến khác trong RAM.

Các khái niệm cần thống nhất:

  • Kiểu dữ liệu của con trỏ: Trùng với kiểu dữ liệu tại vùng nhớ mà nó trỏ đến.
  • Giá trị của con trỏ: Chứa địa chỉ vùng nhớ mục tiêu.
  • Địa chỉ của con trỏ: Địa chỉ của bản thân biến con trỏ đó trong RAM.

b) Cách khai báo con trỏ

Khai báo giống như biến bình thường nhưng có thêm dấu :

<kiểu dữ liệu> * <tên biến>;
  • Kiểu dữ liệu: void, char, int, float, double…
  • Dấu trước tên biến báo cho trình biên dịch biết đây là một con trỏ.

c) Gán giá trị cho con trỏ

Sau khi khai báo, bạn phải khởi tạo giá trị cho con trỏ. Nếu sử dụng con trỏ chưa khởi tạo, nó sẽ chứa giá trị rác, có thể khiến chương trình chạy sai hoặc treo hệ thống (cực kỳ nguy hiểm trong lập trình nhúng).

int *p, value;
value = 5;
p = &value; // Gán địa chỉ của value cho con trỏ p
// Hoặc khai báo và khởi tạo đồng thời
int *p_int = NULL; // Khởi tạo bằng NULL nếu chưa dùng ngay

d) Tác dụng của con trỏ

Con trỏ cho phép thay đổi giá trị vùng nhớ mà nó trỏ đến một cách gián tiếp.

Ví dụ, để đổi giá trị biến c = 22 thành 11:

  • Cách 1: Thay đổi trực tiếp: c = 11;
  • Cách 2: Thay đổi qua con trỏ: int *pc = &c; *pc = 11; (Lúc này *pc chính là giá trị của c).

2. Con trỏ và Mảng

Mảng và con trỏ có mối quan hệ rất chặt chẽ. Khi khai báo int x[4], tên mảng x chính là địa chỉ của phần tử đầu tiên.

int x[4];
int *p = x; // Tương đương p = &x[0]

Dựa vào sơ đồ bộ nhớ, ta có các tương đương sau:

  • &x[i] tương đương với p + i.
  • x[i] tương đương với *(p + i) hoặc p[i].

Ví dụ minh họa:

int a[4] = {1, 2, 3, 4};
int *p = a;
*p = 11; // a[0] = 11
*(p + 1) = 12; // a[1] = 12
*(p + 2) = 13; // a[2] = 13
*(p + 3) = 14; // a[3] = 14

3. Con trỏ và Hàm

a) Truyền địa chỉ biến vào con trỏ (Tham chiếu)

Khi truyền tham trị (truyền giá trị), hàm sẽ tạo bản sao nên không thay đổi được biến gốc. Để thay đổi giá trị biến sau khi hàm thực hiện xong, ta phải truyền vào địa chỉ (tham chiếu).

Hoán vị Tham Trị (Sai) Hoán vị Tham Chiếu (Đúng)
void hoanVi_thamtri(int a, int b) {
int temp = a;
a = b;
b = temp;
}
void hoanVi_thamchieu(int *a, int *b) {
int temp = *a;
*a = *b;
*b = temp;
}

Hàm hoanVi_thamchieu tác động trực tiếp vào vùng địa chỉ của biến gốc trên RAM nên giá trị thực tế sẽ được hoán đổi.

b) Hàm trả về một con trỏ

Cấu pháp: kieu_tra_ve * ten_ham() { ... }

Cảnh báo (Ví dụ 1): Trong một hàm, nếu bạn khai báo biến cục bộ (ví dụ int x, y) và trả về địa chỉ của chúng, địa chỉ này sẽ không còn ý nghĩa khi hàm kết thúc (biến cục bộ bị giải phóng khỏi Stack). Việc truy cập vào địa chỉ này sẽ gây ra lỗi nghiêm trọng.

⚠️ Lưu ý cực kỳ quan trọng: Tuyệt đối không trả về địa chỉ của một biến cục bộ từ trong hàm.
📝 Tóm tắt: Con trỏ là biến lưu trữ địa chỉ vùng nhớ. Nó giúp thao tác trực tiếp với RAM, quản lý mảng linh hoạt và cho phép hàm thay đổi giá trị biến bên ngoài. Tuy nhiên, cần chú ý khởi tạo con trỏ và tránh lỗi trả về địa chỉ biến cục bộ.

Gợi ý bài tiếp theo: Cấp phát bộ nhớ động và Quy ước trình bày chương trình (Coding Convention).


Người thực hiện: Nguyễn Đình Tuấn

Email: tuannguyen.aiot@gmail.com | Website: aiots.vn

Mục nhập này đã được đăng trong Đào tạo, Hệ thống nhúng, Khóa đào tạo cơ bản và được gắn thẻ Embedded Systems.
ThaoNguyen

[Embedded Series – Bài 4] Quản Lý Chương Trình Với Hàm, Mảng Và Chuỗi
[Embedded Series – Bài 6] Con Trỏ Nâng Cao: Quản Lý Bộ Nhớ Động Và Chuẩn Hóa Mã Nguồn

Để lại một bình luận Hủy

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 *

Bài viết mới
  • [Embedded Series – Bài 11] Tối Ưu Hóa Tìm Kiếm Và Sắp Xếp: Quick Sort & Binary Search
  • [Embedded Series – Bài 10] Làm Chủ Các Thuật Toán Sắp Xếp Cơ Bản: Bubble, Selection & Insertion Sort
  • [Embedded Series – Bài 9] Nhập Môn Cấu Trúc Dữ Liệu Và Giải Thuật: Sức Mạnh Của Danh Sách Liên Kết
  • [Embedded Series – Bài 8] Thao Tác Với Tệp Tin (File I/O) Trong Lập Trình C
  • [Embedded Series – Bài 7] Kiểu Dữ Liệu Cấu Trúc (Struct) Và Quản Lý Dữ Liệu Phức Hợp
Danh mục
  • Đào tạo
  • FPGA cơ bản
  • Giải pháp
  • Hệ thống nhúng
  • IoT trong giáo dục
  • IoT trong y tế
  • Khóa đào tạo cơ bản
  • Khóa đào tạo nâng cao
  • LabVIEW FPGA
  • LabVIEW FPGA High Performance
  • Phần cứng máy tính & Truyền thông công nghiệp
  • Sản xuất công nghiệp
  • Thiết bị dịch vụ thông minh
  • Thiết bị đọc căn cước
  • Tin tức

CÔNG TY CỔ PHẦN HỆ THỐNG AIOT

VPGD: Số A21-TT9 Đường Foresa 1 KĐT Xuân Phương, Phường Xuân Phương, Hà Nội.

Địa chỉ kinh doanh: Đường Phú Diễn, Tổ dân phố 18, phường Phú Diễn, Thành phố Hà Nội, Việt Nam

Hotline/Zalo: 097 186 8316 | 0839 799 889

Email: aiot@aiots.vn

VỀ CHÚNG TÔI

Giới thiệu

Sản phẩm

Giải pháp

Đào tạo

Tin tức

QUY ĐỊNH & CHÍNH SÁCH

Chính sách thanh toán

Chính sách vận chuyển

Chính sách bảo hành

Chính sách đổi trả

Chính sách bảo mật

ĐỊA CHỈ VĂN PHÒNG GIAO DỊCH

Copyright 2024 © Bản quyền thuộc về AIOT. Thiết kế bởi Jamina JSC
  • Trang chủ
  • Giới thiệu
  • Tin tức
  • Sản phẩm
  • Giải pháp
    • Chấm công bằng Face ID
    • Thiết bị đọc căn cước
    • IoT trong giáo dục
    • IoT trong quản lý năng lượng
    • IoT trong y tế
  • Đào tạo
    • Khóa đào tạo cơ bản
      • Hệ thống nhúng
      • LabVIEW FPGA
      • Phần cứng máy tính & Truyền thông công nghiệp
      • FPGA cơ bản
    • Khóa đào tạo nâng cao
      • LabVIEW FPGA High Performance
    • Tài liệu
  • PCCC
  • Liên hệ
Zalo
Phone

Đăng nhập

Quên mật khẩu?