1.Con trỏ trỏ đến struct

Chúng ta đã biết rằng một con trỏ là một biến trỏ đến địa chỉ của một biến khác của bất kỳ loại dữ liệu như int, char, float….vv

Tương tự như vậy, chúng ta có thể có một con trỏ đến cấu trúc, nơi một biến con trỏ có thể trỏ đến địa chỉ của một biến cấu trúc .

Xét ví dụ dưới đây, tôi khai báo con trỏ p cho kiểu struct sinh viên:

#include <stdio.h>
struct sinhvien{
    int MaSinhVien;
    char TenSinhVien[25];
    float DiemSinhVien;
};
typedef sinhvien SV;

int main(){
    //khai bao sinh vien NguyenVanA
    SV NguyenVanA = {1,"NguyenVanA",10};
    //khai bao con tro p co kieu SV
    SV *p;
    p = &NguyenVanA;
}

2.Con trỏ truy cập thành phần struct

Có hai cách để truy cập các thành phần của cấu trúc bằng cách sử dụng con trỏ:

  1. Sử dụng toán tử * (dấu sao) và toán tử dấu “.” (dấu chấm)
  2. Sử dụng toán tử -> (mũi tên)

2.1 Sử dụng toán tử sao kết hợp với chấm

Ở ví dụ trên, ta cần truy cập vào các thành phần như Mã Sinh Viên, Tên Sinh Viên, Điểm Sinh Viên bằng con trỏ, ta sẽ sử dụng như sau:

#include <stdio.h>
struct sinhvien{
    int MaSinhVien;
    char TenSinhVien[25];
    float DiemSinhVien;
};
typedef sinhvien SV;

int main(){
    //khai bao sinh vien NguyenVanA
    SV NguyenVanA = {1,"NguyenVanA",10};
    //khai bao con tro p co kieu SV
    SV *p;
    p = &NguyenVanA;
    //con tro den cac thanh phan trong struct
    (*p).MaSinhVien;
    (*p).TenSinhVien;
    (*p).DiemSinhVien;
}

Giải thích:

Để truy cập một thành phần của cấu trúc,ta sẽ viết con trỏ *p theo sau bởi toán tử dấu chấm ( . ), sau đó là thành phần cần truy cập.

2.2 Sử dụng toán tử mũi tên

Phương pháp sử dụng toán tử * (sao) kết hợp với dấu “.” (chấm), đôi khi làm khó hiểu và ít được sử dụng khi thao tác con trỏ với kiểu dữ liệu struct.

Vì thế, ngôn ngữ C cung cấp cho chúng ta thêm một toán tử gọi là toán tử -> (mũi tên).

Ở ví dụ này, tôi sử dụng toán tử -> thay thế cho toán tử ( * ) và (.) ở ví dụ trên:

#include <stdio.h>
struct sinhvien{
    int MaSinhVien;
    char TenSinhVien[25];
    float DiemSinhVien;
};
typedef sinhvien SV;

int main(){
    //khai bao sinh vien NguyenVanA
    SV NguyenVanA = {1,"NguyenVanA",10};
    //khai bao con tro p co kieu SV
    SV *p;
    p = &NguyenVanA;
    //con tro den cac thanh phan trong struct
    p->MaSinhVien;
    p->TenSinhVien;
    p->DiemSinhVien;
}

Việc sử dụng toán tử -> trực quan và dễ viết dễ đọc hơn, toán tử (*) và (.) , vì thế tôi sẽ sử dụng -> cho những phần sau!