Thứ Hai, 22 tháng 4, 2024

47. Con Trỏ Kiểu Cấu Trúc

Chúng ta đã tìm hiểu qua về cấu trúc trong C, chúng ta cũng đã "miễn cưỡng" sử dụng con trỏ kiểu cấu trúc trong việc hoàn tất chương trình tào lao phiên bản 3. Chúng ta sẽ thảo luận kỹ hơn về con trỏ trong phần này.


Nhắc lại là Struct hay cấu trúc là một kiểu dữ liệu mà chúng ta tự định nghĩa bằng cách gộp nhiều kiểu dữ liệu có sẵn lại nhằm mục đích có thể mô tả nhiều trường thông tin của đối tượng chúng ta cần lưu.

Cú pháp :

    struct ten_struct{
         data_type1 data_field1;
         data_type2 data_field2;
         ....
         data_typen data_fieldn;
    }
;




Ví dụ chúng ta sẽ xây dựng một cấu trúc lưu sinh viên gồm :

    Họ tên - Chuỗi ký tự không quá 50
    Email - Chuỗi ký tự không quá 50
    Chuyên ngành - Chuỗi ký tự không quá 60
    Điểm trung bình - Số thực

Ta sẽ xây dựng cấu trúc sinh viên như sau :



    
    struct SinhVien{
            char hoten[50];
            char email[50];
            char chuyenNganh[60];
            double diemTrungBinh;
        };


Sau khi xây dựng xong cấu trúc thì bạn có thể dùng nó như kiểu dữ liệu thông thường và khai báo các biến thuộc kiểu cấu trúc này.

Để truy cập vào các trường dữ liệu của cấu trúc bạn dùng toán tử (.)

Chúng ta đã sử dụng toán tử (.) nhiều lần trong chương trình tào lao phiên bản 3. Ví dụ struct SinhVien ở trên, bạn khai báo một biên x có kiểu dữ liệu là SinhVien.

struct SinhVien x;


Sau đó, khi bạn muốn truy cập vào trường họ tên của biến x, bạn sẽ sử dụng toán tử 
(.) như thế này

x.hoten;


Nếu muốn truy cập vào trường điểm trung bình, chúng ta sẽ sử dụng toán tử 
(.) như sau


x.diemTrungBinh;


Vì cấu trúc cũng như một kiểu dữ liệu, chúng ta cũng sử dụng con trỏ như với mọi kiểu dữ liệu khác.

 

Con trỏ kiểu cấu trúc

Con trỏ kiểu cấu trúc có thể sử dụng để trỏ tới biến cấu trúc, để truy cập các trường dữ liệu của biến cấu trúc thông qua con trỏ chúng ta có hai cách:

  • Sử dụng toán tử hoa thị (*) kết hợp với dấu chấm (.)
  • Sử dụng toán tử mũi tên (->)

Đây là một đoạn code đơn giản khai báo một cấu trúc rất đơn giản gọi là point.  Sau đó khai báo một con trỏ tên là ptr với kiểu dữ liệu cấu trúc point. Chương trình không in ra bất cứ cái gì, chỉ nhằm mục đích cho chúng ta hình dung một con trỏ cấu trúc.

#include <stdio.h>
 
 //Khai bao mọt cau truc point
struct point {
    int value;
};
 
int main()
{
 
    struct point s;
   
    // Khoi tao mot con tro cau truc  kieu point
    struct point* ptr = &s;
 
    return 0;
}


Sử dụng IDE Online, chúng ta chạy thử chương trình


Đây là ví dụ truy cập các trường dữ liệu của cấu trúc thông qua con trỏ:


#include <stdio.h>
#include <string.h>

struct SinhVien{
    char hoten[50];
    char diachi[50];
    
};

typedef struct SinhVien SinhVien;

int main(){
    SinhVien s;
    strcpy(s.hoten, "Tran Van Teo");
    strcpy(s.diachi, "1234 HV Da Nang");
    SinhVien *ptr = &s;
    printf("Thong tin Sinh vien : \n");
    printf("Ho ten : %s\n", (*ptr).hoten);
    printf("Dia chi : %s\n", (*ptr).diachi);
   
    return 0;
}


Bấm Run để chạy chương trình




  • Đầu tiên chúng ta khai báo một cấu trúc tên là SinhVien với 2 trường đơn giản kiểu char là hoten[50]diachi[50].
  • Tiếp theo lệnh typedef nhằm mục đích để có thể sử dụng SinhVien s; thay vì struct SinhVien s; Nói cách khác nếu bạn không sử dụng typedef ở đây, câu lệnh bên dưới bắt buộc phải là struct SinhVien s; nhưng nếu bạn sử dụng typedef, câu lệnh bên dưới có thể là struct SinhVien s; hay SinhVien s; đều được.
  • Trong hàm main(), chúng ta khai một biến s với kiểu dữ liệu là cấu trúc SinhVien.
  • Tiếp theo chúng ta sử dụng hàm strcpy để sao chép hay nói cách khác là gán giá trị cho các trường trong biến cấu trúc s.
  • Lệnh SinhVien *ptr = &s; khai báo một con trỏ tên là ptr trỏ vào biến cấu trúc s.
  • Hai lệnh printf cuối không có gì đặc biệt ngoài việc sử dụng câu lệnh (*ptr).hoten(*ptr).diachi để truy cập các trường trong cấu trúc SinhVien s.

Chúng ta có thể thay (*ptr).diachi bằng ptr->diachi, áp dụng vào chương trình chúng ta sẽ thấy hai lệnh đều hoạt động giống nhau


Phần tiếp theo

Phần trước

Không có nhận xét nào:

Đăng nhận xét