ấ ề
ể i d
CHƯƠNG 7 Ấ C U TRÚC ậ ợ ể ấ
ợ ử ế ạ ấ ộ
ặ ộ ủ C u trúc là t p h p c a m t ho c nhi u đư c nhóm l ạ ư i ớ bi n, có th khác ki u nhau, ố ệ 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 ệ ệ ổ ữ ữ ệ ớ
ế ị ố i
ch c các d li u ương trình l n vì ứ ạ đ c bi t trong nh ng ch ph c t p, ề trong nhi u tình hu ng chúng cho phpé nhóm các ư m t ộ đơn v thay ể ử ạ đ x lý nh bi n có liên quan l ệ ể ự 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
} khoá ấ ỳ ấ ờ ử
ư i s ừ
Trong đó: struct: Là t
ể
Tên_ki u_c u_trúc: là tên b t k , do ng
d ng ụ đ tặ Ví d :ụ struct Date { int day;
int month;
int year;
}; ấ 2. Đ nh nghĩa c u trúc b ng typedef
ấ ị
ế ằ
trúc đư c ợ ể ớ
ị
đ nh nghĩa v i
đê ị ư sau: ể ấ ộ
N u m t c u
ấ
ể
tên_ki u_c u_trúc thì ta có th cùng typedef
đ nh nghĩa nh
Typedef struct < tên_ki u_c u_trúc>
Ví d :ụ typedef struct Date DATE; ế ị ể
ưa đ nh nghĩa, thì ta có th ị ộ ấ
N u m t c u trúc ch
dùng typedef đ ể đ nh nghĩa: ấ ể
ể ờ
ờ ể
Typedef struct [Tên_ki u_c u_trúc] {
ư ng 1>;
ư ng 2>; ể ị đ ể đ nh nghĩa Ví d :ụ
ớ
V i ví d trên ta có th dùng typedef
i nhạ
l ụ
ư 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 ợ đ nh nghĩa b ng typedef ể ấ ế ấ ấ
c u trúc
+ Dùng tên_ki u_c u_trúc:
ể
struct < tên_ki u_c u_trúc> ị ằ Ví d :ụ
struct Date date,*pd;
+ ể ế Dùng tên đ nh nghĩa b ng typedef
Ví d :ụ ấ II. Kh i ở đ u giá tr cho c u trúc: ầ ộ ấ
ị ầ ả ế ấ ằ ị ặ ấ
ớ ứ ờ ư ng t DATE date,*pd
ị
ầ
ở đ u giá tr cho m t c u trúc theo
ể
ị
Ta có th kh i
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 (=),
ở đ u ầ đư c ợ
sau đó là danh dách các giá tr kh i
ở đ u ầ
ị
đ t trong các d u móc {}. Các giá tr kh i
ương ng trong
ể
có cùng ki u v i các tr
ấ
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: ầ ủ ấ
ế ầ ủ ớ ứ ờ ợ
ư ng h p sau: Có hai cách tham chi u ế đ n các thành ph n c a
ấ
c u trúc t
ế ế đ tham chi u ể
ủ ấ ờ ế ương ng v i hai tr
ộ
ế ấ
N u nó là m t bi n c u trúc:
ấ
ử ấ
d u ch m (.)
ầ
ư ng (thành ph n) c a c u trúc. ế ấ Ta dùng toán t
đ n các tr
Cú pháp: ử ể mũi tên (>) đ tham chi u ế đ n.ế Ta dùng toán t
Cú pháp: Ví d :ụ struct Date {
int day;
int month;
int year; } date;
typedef struct Date DATE
DATE *p ế ớ
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;
ị ế ờ ể ấ đ a ch các tr ỉ
ế ủ
ỏ ỏ đ n thành ph n t ấ
ư ng c a c u trúc, k t
ầ ương ng.ứ Có th l y
ả
qu là con tr tr
Ví d :ụ scanf(“%2d %2d %4d”, &today.day,
&today.month, &today.year); ấ ả ữ ệ ấ ố đ i tố ư ng d li u, do ấ ạ ấ ả IV. M ng các c u trúc
ợ
đó hoàn toàn
Vì c u trúc là kh i
ả
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: ể ở Ho c là dùng tên ể ả struct ấ
ả
ư c>];
ớ
đã đư c khai báo b i typedef:
ớ
ư c>]; ấ ế ể ờ 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;
(*(aa+2)).year=2003 ồ ồ ọ ấ
ộ ấ ộ
ể ấ ủ
ồ ấ ợ ổ ế ậ đ lể ưu thông tin ngày sinh V. C u trúc l ng nhau
đư c g i là l ng nhau n u có m t
ế
ợ
M t c u trúc
ạ
ờ
trong các trư ng c a c u trúc này l
i có ki u
đư c dùng
ư ng ờ
ấ
c u trúc. C u trúc l ng nhau th
ở
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
ư i.ờ
ộ
ủ
c a m t ng 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; ế ấ ỳ ộ V m t lý thuy t thì không có b t k m t gi i h n ủ ấ
ẽ ế ờ ớ ạ
ưng lúc đó các
ạ ở
ư ng s càng tr nên phúc t p và ề ặ
ề ố ứ ồ
nào v s m c l ng nhau c a c u trúc. Nh
tham chi u ế đ n các tr
khó đ c họ ơn.
C u trúc t ỏ ỏ đ n các c u trúc ch ặ ạ đưa ra các khai báo các
ị
ưa đư c ợ đ nh nghĩa,
ự ự
tham
ấ
trên. Ta có th t o ra c u ề ậ ở
ư đã đ c p
ế ẫ struct s1
{ int a;
struct s2 *b; }; struct s2 { int a;
struct s1 *b; }; ụ Đ c tính này không áp d ng trong các khai báo ằ ặ
b ng typedef
ề ấ VI. 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 )ị
ề ế ấ ề ọ ỏ ỏ đ n c u trúc (g i là truy n Truy n con tr tr
theo tham chi u)ế Ví d :ụ ị
ị DATE d;
.
.
func (d); /* Đ nh nghĩa hàm func(DATE d) */
func(&d);/* Đ nh nghĩa hàm func (DATE *d)*/
.
. ỉ ợ ị
đ a ch luôn nhanh h
ỏ đơn gi n ả đư c sao chép ỉ
ơn b i vì ch là
ở
đ i ố
ế
đ n vùng
ị ẽ đòi h i toàn b
ộ
ỏ
ương ẽ đư c sao chép. Ch có hai tr ợ ề
Truy n theo
ộ
m t con tr
ề
ặ
ố
s . M t khác, truy n theo giá tr s
ỉ
ợ
ấ
các c u trúc s
ị
ề
h p nên truy n theo giá tr : ỏ ứ ấ ớ ỡ ấ ỉ ớ C u trúc nh (t c là kích th ộ
ư c c x p x v i m t ả ờ ọ
ề ằ
đư c truy n vào. (Khi m t ả đ m r ng l
ợ
ị ị ẽ ạ
ỉ ọ con tr )ỏ
Mu n b o
ẽ
ố
i g i hàm s không làm
ộ đ i ố
ổ ấ
thay đ i c u trúc
ộ
ề
ố
s truy n theo giá tr , trình biên d ch s t o m t
ủ đ i s
ể
ố ố đó. Hàm đư c g i ch có th
ợ
ả
b n sao c a
ả
ổ
thay đ i trên b n sao mà thôi). ;ể
ế
ộ
ấ
ế
ỏ ỏ đ n c u
ế
N u nó là m t bi n con tr tr
trúc:
ế
ấ
ư ng>ờ
ồ
ế
ố
ế
ầ ủ ấ
ệ
ồ
ữ
ỉ
ế ấ
ả
đó vào.
ớ ấ
ụ
ở
ị
ừ đ nh nghĩa
ủ
ầ
ể
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
ư ng ờ
ấ
c u trúc không l ng nhau, tuy ch có nh ng tr
ứ ấ
ch a c u trúc thì ph i thêm tên bi n c u trúc
Ví dụ
ví d trên, ta tham
V i c u trúc v a
ế
ế
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;
tham chi u:
ứ
ộ
ọ
ế
ế
ế
ự
tham chi u n u nó ch a m t
ỏ ỏ đ n chính nó.
ự
ấ
ấ
Các c u trúc g i là t
trư ng là con tr tr
ế
ờ
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
ấ
ế
con tr tr
đ c tính này cũng cho phép ta t o ra s t
ể ạ
ế
chi u nh
ự
trúc s tham chi u l n nhau.
Ví d :ụ
Có thể bạn quan tâm
Tài liêu mới