Cấu trúc giúp cho việc tổ chức các dữ liệu phức tạp, đặc biệt trong những chương trình lớn vì trong nhiều tình huống chúng cho phpé nhóm các biến có liên quan lại để xử lý như một đơn vị
Trang 1CHƯƠNG 7 CẤU TRÚC
Cấu trúc là tập hợp của một hoặc nhiều biến, có thể khác kiểu nhau, được nhóm lại dưới dạng một tên duy nhất cho tiện xử lý (Giống cấu trúc Record trong Pascal)
Cấu trúc giúp cho việc tổ chức các dữ liệu phức tạp, đặc biệt trong những chương trình lớn vì trong nhiều tình huống chúng cho phpé nhóm các biến có liên quan lại để xử lý như một đơn vị thay vì như các thực thể tách biệt
Trang 2I Định nghĩa cấu trúc và khai báo
biến cấu trúc
1 Định nghĩa cấu trúc
Tên_kiểu_cấu_trúc: là tên bất kỳ,
do người sử dụng đặt
Trang 32 Định nghĩa cấu trúc bằng typedef
Nếu một cấu trúc được định nghĩa với tên_kiểu_cấu_trúc thì ta có thể cùng typedef đê định nghĩa như sau:
Typedef struct < tên_kiểu_cấu_trúc>
<Tên_kiểu>;
Trang 4Ví dụ:
typedef struct Date DATE;
Nếu một cấu trúc chưa định nghĩa, thì
ta có thể dùng typedef để định nghĩa:
Typedef struct [Tên_kiểu_cấu_trúc] {
Với ví dụ trên ta có thể dùng typedef
để định nghĩa lại như sau:
Trang 6Khai báo riêng lẽ:
Dùng Tên_kiểu_bản_ghi hoặc thông qua tên cấu trúc đã được định nghĩa bằng typedef
+ Dùng tên_kiểu_cấu_trúc:
struct < tên_kiểu_cấu_trúc> <Danh sách các biến>
Trang 7Ví dụ:
struct Date date,*pd;
+ Dùng tên định nghĩa bằng typedef
<Tên_kiểu> <danh sách các biến>
Ví dụ:
DATE date,*pd
II Khởi đầu giá trị cho cấu trúc:
Ta có thể khởi đầu giá trị cho một cấu trúc theo phương cách như là khởi đầu giá trị cho mảng Theo sau tên_biến_cấu_trúc là dấu bằng (=), sau đó là danh dách các giá trị khởi đầu được đặt trong các dấu móc {} Các giá trị khởi đầu có cùng kiểu với các trường tương ứng trong cấu trúc.
Trang 8Nếu nó là một biến cấu trúc:
Ta dùng toán tử dấu chấm (.) để tham chiếu đến các trường (thành phần) của cấu trúc.
Cú pháp:
<tên_biến_cấu_trúc>.<Tên_trường>
Trang 9Nếu nó là một biến con trỏ trỏ đến cấu trúc:
Ta dùng toán tử mũi tên (->) để tham chiếu đến.
Trang 10Với các khai báo trên ta có các cách tham chiếu sau:
Trang 11Gán hai biến cấu trúc cho nhau(cùng kiểu cấu trúc)
Ví dụ:
scanf(“%2d - %2d %4d”, &today.day,
&today.month, &today.year);
Trang 12IV Mảng các cấu trúc
Vì cấu trúc là khối đối tượng dữ liệu, do đó hoàn toàn có khả năng tạo ra một mảng các cấu trúc Khai báo mảng các cấu truc như sau:
struct <Tên_kiểu_cấu_trúc> <Tên_mảng> [<kích_thước>];
Hoặc là dùng tên đã được khai báo bởi typedef:
<Tên_kiểu> <Tên_mảng>[<kích_thước>];
Ví dụ:
Khai báo mảng cấu trúc:
struct Date aa[10];
Trang 13V Cấu trúc lồng nhau
Một cấu trúc được gọi là lồng nhau nếu có một trong các trường của cấu trúc này lại có kiểu cấu trúc Cấu trúc lồng nhau thường được dùng phổ biến trong lập trình C bởi vì nó cho phép tạo ra các dữ liệu có thứ bậc
Vi dụ: Tạo cấu trúc để lưu thông tin ngày sinh của một người
Trang 14typedef struct
{
char name[30];struct
{
int day;
int month;int year;
} birth_day;
} BDATE;
Trang 16Tham chiếu đến các thành phần của cấu trúc lồng nhau thì hoàn toàn giống với việc tham chiếu trong cấu trúc không lồng nhau, tuy chỉ có những trường chứa cấu trúc thì phải thêm tên biến cấu trúc đó vào.
Ví dụ
Với cấu trúc vừa định nghĩa ở ví dụ trên,
ta tham chiếu đến các thành phần của biến ngaysinh có kiểu BDATE là:
Tên: ngaysinh.name=“Tran Van A”;
Ngày sinh:
ngaysinh.birth_day.day=19;
ngaysinh.birth_day.month=04;
ngaysinh.birth_day.year=2003;
Trang 17Về mặt lý thuyết thì không có bất kỳ một giới hạn nào về số mức lồng nhau của cấu trúc Nhưng lúc đó các tham chiếu đến các trường sẽ càng trở nên phúc tạp và khó đọc hơn.
Các cấu trúc gọi là tự tham chiếu nếu nó chứa một trường là con trỏ trỏ đến
Trang 18 Tính tham chiếu trước (Forward
Referencing)
Tính chất này cho phép ta đưa ra các khai báo các con trỏ trỏ đến các cấu trúc chưa được định nghĩa, đặc tính này cũng cho phép ta tạo ra sự tự tham chiếu như đã đề cập ở trên Ta có thể tạo ra cấu trúc sự tham chiếu lẫn nhau.
Trang 19VI Truyền cấu trúc cho hàm
Có hai cách truyền cấu trúc cho hàm:
- Truyền theo biến cấu trúc (gọi là truyền theo giá trị)
- Truyền con trỏ trỏ đến cấu trúc (gọi là truyền theo tham chiếu)
Trang 20Truyền theo địa chỉ luôn nhanh hơn bởi vì chỉ là một con trỏ đơn giản được sao chép đến vùng đối số Mặt khác, truyền theo giá trị sẽ đòi hỏi toàn bộ các cấu trúc sẽ được sao chép Chỉ có hai trương hợp nên truyền theo giá trị:
Trang 21Cấu trúc nhỏ (tức là kích thước cỡ xấp xỉ với một con trỏ)
Muốn bảo đảm rằng lời gọi hàm sẽ không làm thay đổi cấu trúc được truyền vào (Khi một đối số truyền theo giá trị, trình biên dịch sẽ tạo một bản sao của đối số đó Hàm được gọi chỉ có thể thay đổi trên bản sao mà thôi)