Struct trong C – Kiểu cấu trúc (structure) trong C

This entry is part 66 of 69 in the series Học C Không Khó

Trong bài hướng dẫn này, bạn sẽ cùng Lập trình không khó tìm hiểu về kiểu struct trong C (kiểu cấu trúc). Bạn sẽ học cách định nghĩa và sử dụng kiểu cấu trúc với sự đi kèm của các ví dụ. Nếu dịch từ tiếng anh ra thì nghĩa của nó là kiểu cấu trúc, tuy nhiên chúng ta vẫn thường hay gọi nó là kiểu struct. Nhưng mục tiêu sau cùng của chúng ta là hiểu và biết cách sử dụng struct trong C, cùng bắt đầu nào…

Cách định nghĩa struct trong C

Trước khi chúng ta có thể khai báo biến với struct, bạn cần định nghĩa nó – Đó cũng là lý do tại sao struct được gọi là kiểu dữ liệu người dùng định nghĩa.

Khi nào chúng ta cần phải tự định nghĩa 1 kiểu cấu trúc? Khi bạn cần lưu trữ một đối tượng có nhiều thuộc tính. Ví dụ, đối tượng SinhVien có các thuộc tính (Mã sinh viên, họ, tên, giới tính, quê quán,…) hay đối tượng LopHoc có các thuộc tính (Mã lớp, tên lớp, giáo viên chủ nhiệm, sĩ số,…). Khi đó chúng ta nên dùng struct để quản lý chương trình.

Cú pháp định nghĩa struct trong C

Dưới đây là 1 ví dụ:

Như vậy, kiểu dữ liệu SinhVien đã được định nghĩa. Từ đây chúng ta có thể khai báo các biến với kiểu dữ liệu này.

Cách khai báo biến kiểu struct trong C

Việc khai báo biến với struct cũng giống như cách khai báo biến thông thường, trong đó kiểu dữ liệu là kiểu struct trong C mà bạn vừa định nghĩa. Xem ví dụ dưới đây:

Truy xuất các thuộc tính của struct

Chúng ta có 2 toán tử dùng để truy xuất tới các biến thành viên của kiểu struct trong C.

  • Sử dụng . => Toán tử truy xuất tới thành viên khi khai báo biến bình thương.
  • Sử dụng -> => Toán tử truy xuất tới thành viên khi biến là con trỏ.

Giả sử trong ví dụ trên, bạn muốn truy xuất gioiTinh của đối tượng sinh viên, bạn làm như sau:

Từ khóa typedef

Bạn có thể sử dụng từ khóa typedef để tạo ra một tên thay thế cho kiểu dữ liệu đã có. Nó thường được sử dụng kiểu struct để đơn giản hóa cú pháp khai báo biến. Nhưng nó cũng có thể sử dụng với các kiểu dữ liệu nguyên thủy nhé.

Code trên tương đương với:

Hoặc:

Hoặc bạn có thể dùng với kiểu nguyên thủy như sau:

Tuy nhiên, nếu không có nhu cầu thực tế thì ta cũng không nên bày vẽ làm gì. Trong một số code đặc thù ta muốn có quy chuẩn riêng thì nên dùng.

Cấu trúc struct lồng nhau

Giả sử bạn muốn xây dựng kiểu dữ liệu để lưu trữ đối tượng Tam giác, khi đó chúng ta có thể xây dựng struct mô tả tọa độ của 1 điểm, khi đó đối tượng tam giác sẽ là 3 đối tượng điểm. Cụ thể:

Sau đây là các ví dụ sử dụng kiểu cấu trúc struct trong C vào các bài tập thực tế. Các bạn tham khảo và chạy thử cũng như thử sửa đổi các code mẫu này để hiểu hơn về struct nhé.

Chương trình cộng trừ nhân chia phân số trong C

Code này mình giả sử các bạn nhập mẫu số cho phân số khác 0 nhé. Bạn có thể kiểm tra bổ sung thêm các tùy chọn/ chức năng để code tối ưu hơn.

Phần thuật toán tìm ước chung lớn nhất, bạn có thể xem tại bài tìm ước chung lớn nhất.

Kết quả chạy:

Struct và con trỏ

Tương tự như khai báo con trỏ với các kiểu dữ liệu có sẵn trong C. Chúng ta cũng có thể khai báo biến con trỏ, cấp phát động cho biến con trỏ kiểu struct.

Sau đây là cách chúng ta khai báo biến con trỏ kiểu struct trong C:

Khi đó ptr là con trỏ kiểu name, còn Harry là biến kiểu name.

Để truy cập vào các biến thành viên sử dụng biến con trỏ của struct trong C, bạn dùng ->, ví dụ:

Trong ví dụ này, địa chỉ của biến person1 được lưu giữ bởi con trỏ personPtr. Và bạn có thể thao tác với biến con trỏ giống như chúng ta đã học ở bài Con trỏ trong C.

Ta có:

  • personPtr->age cho kết quả giống với (*personPtr).age
  • personPtr->weight cho kết quả giống với (*personPtr).weight

Cấp phát bộ nhớ động

Trước khi bạn đọc phần này, mình hi vọng các bạn đã có kiến thức về cấp phát động trong C.

Đôi khi, số lượng biến struct trong C mà chúng ta cần có thể lớn. Khi đó có thể bạn sẽ cần tới cấp phát động trong quá trình chương trình thực thi. Dưới đây là cách để cấp phát bộ nhớ động với kiểu cấu trúc:

Kết quả khi chạy chương trình:

Trong ví dụ trên, sau khi người dùng nhập số lượng n thì ta mới tiến hành cấp phát đúng n ô nhớ sử dụng dòng lệnh này:

Và sau đó, ta dùng con trỏ ptr để truy cập vào các thành viên của person.

Hoặc bài tập cấp phát động cho kiểu cấu trúc sinh viên dưới đây, ta thực hiện nhập, xuất và sắp xếp danh sách sinh viên theo điểm sử dụng cấp phát động cho con trỏ trong C++ (new và delete):

Kết quả chạy:

Ngoài ra, mình cũng có một bài hướng dẫn chi tiết và nâng cao hơn: Bài tập quản lý sinh viên sử dụng struct trong C. Các bạn tiếp tục tham khảo bài viết này nhé!

Tài liệu tham khảo

  1. http://uet.vnu.edu.vn/~diepht/s12_int2202/lect06_struct_class.pdf
  2. C Struct (Structure)