ấ ề

ể 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  { ờ ể ờ ể ư ng 1>; ư ng 2>;

  

}

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  { ương1>; ương2>;

  

;ế

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: .

ế

ế ỏ ỏ đ n  c u

ế   N u  nó  là  m t  bi n  con  tr   tr   trúc:

ử ể mũi tên (­>) đ  tham chi u ế đ n.ế

Ta dùng toán t Cú pháp:

ế

­>

ư ng>ờ

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à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;

ế

ấ ỳ ộ

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

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

ỏ ỏ đ 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  ế ẫ

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 :ụ

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).