Thông tin tài liệu:
Bài giảng "Lập trình C: Chương 7 - Cấu trúc" được biên soạn với các nội dung chính sau: Định nghĩa cấu trúc và khai báo biến cấu trúc; Khởi đầu giá trị cho cấu trúc; Truy cập đến các thành phần của cấu trúc; Mảng các cấu trúc; Cấu trúc lồng nhau;... Mời các bạn cũng tham khảo bài giảng tại đây!
Nội dung trích xuất từ tài liệu:
Bài giảng Lập trình C: Chương 7 - Cấu trúc
CHƯƠ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.
I. Đị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
struct {
;
;
...
}
Trong đó: struct: Là từ khoá
Tên_kiểu_cấu_trúc: là tên bất kỳ, do người sử
dụng đặt
Ví dụ:
struct Date {
int day;
int month;
int year;
};
2. Đị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
;
Ví 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í dụ:
Với ví dụ trên ta có thể dùng typedef để định nghĩa
lại như sau:
typedef struct {
int day;
int month;
int year;
} DATE;
3. Khai báo biến cấu trúc
Khai báo kết hợp:
struct {
;
;
...
} ;
Ví dụ:
struct Date {
int day;
int month;
int year;
} date, *pd;
Khai 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
Ví dụ:
struct Date date,*pd;
+ Dùng tên định nghĩa bằng typedef
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.
Ví dụ:
DATE date = {12, 3, 2003}
III. Truy cập đến các thành phần của cấu trúc:
Có hai cách tham chiếu đến các thành phần của
cấu trúc tương ứng với hai trường hợp sau:
Nế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:
.
Nế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.
Cú pháp:
>
Ví dụ:
struct Date {
int day;
int month;
int year;
} date;
typedef struct Date DATE
Với các khai báo trên ta có các cách tham chiếu
sau:
date.day=18;
date.month=4;
date.year=2003;
Hoặc:
p>day = 18
p>month=4;
p>year=2003;
Các phép toán con trỏ tương đương với:
(*p).day=18;
(*p).month=4;
(*p).year=2003;
Gán hai biến cấu trúc cho nhau(cùng kiểu cấu
trúc)
Ví dụ:
struct Date d={18,4,2003};
struct Date today;
today=d;
Có thể lấy địa chỉ các trường của cấu trúc, kết
quả là con trỏ trỏ đến thành phần tương ứng.
Ví dụ:
scanf(“%2d %2d %4d”, &today.day,
&today.month, &today.year);
IV. 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 [];
Hoặc là dùng tên đã được khai báo bởi typedef:
[];
Ví dụ:
Khai báo mảng cấu trúc:
struct Date aa[10];
DATE ab[10];
Lúc đó để tham chiếu đến các trường ta có thể dùng như
sau:
aa[2].month = 4;
V. 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.
typedef struct
{
char name[30];
struct
{
int day;
int month;
int year;
} birth_day;
} BDATE;
Hoặc:
typedef struct
{
char name[30];
struct Date birth_day;
} BDATE;
Hoặc
typedef
{
char name[30];
DATE birth_day;
}BDATE;
Tham 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;
Về 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ấu trúc tự tham chiếu:
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 chính nó.
Ví dụ:
struct a
{
int a,b;
float c;
struct a *ptoa;
};
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 ...