Saturday, 23 October 2010

[C] Struct

Viết bài ngắn về Struct trong C rồi đi ngủ.

1. Tạo 1 Struct
Nếu bạn dùng lệnh
int age để khởi tạo biến age thuộc kiểu int,
char name để khởi tạo biến name thuộc kiểu char thì dùng
struct hehe memb để khởi tạo 1 cấu trúc có tên là memb thuộc kiểu struct hehe.
Cái tên Struct để nói rằng trong nó có chứa các "thành phần" con.
Tựa như 1 cái xe máy vậy, nếu gọi cái xe máy là 1 Struct thì nó gồm các thành phần bánh, ống xả, máy... các thành phần này có kiểu: nhựa, sắt thép... ví dụ thế :D Nếu bạn tạo 1 cái xe máy nghĩa là đã tạo ra các bánh, động cơ, ống xả... của nó. Tương tự
Tạo 1 struct chứa các thành phần int age; char name[20] nghĩa là bạn đã tạo ra các biến age, name.

VD
[code]
struct mem{
char name[30];//với char phải luôn gán độ rộng của nó.
char nick[15];
int age;
char phone[11];};


struct mem list[]={{"Nguyen Viet Hung","FamiHug",20,"0982xxxxxx"},{"Đặng Tùng Lâm","LoveYoyo",5,"016899xxxxxx"}};//tạo 1 list gồm 2 phần tử có cấu trúc kiểu mem.
[/code]

Vậy cú pháp để tạo 1 kiểu struct là:

struct TÊN {
int ....;
char....;
float ....;
};

Thay vì mỗi lần phải gõ struct TÊN ta gán 1 nhãn cho kiểu struct này bằng cách sửa lại đoạn lệnh ở ví dụ trên:
[code]
typedef struct mem{
char name[30];//với char phải luôn gán độ rộng của nó.
char nick[15];
char phone[11];} newtype;
newtype list[]..... //newtype giờ để thay thế cho struct mem
[/code]

2. Truy cập đến các "thành phần" con của struct.


Để truy cập đến một member của struct ta dùng dấu "."
VD:

newtype list[]={{"HVN","FamiHug","09xxxxxx"},{"Cici","Invisible","01689xxxxx"}};
    printf("%s %3s %3s",list[1].name,list[1].nick,list[1].phone);//có thể dùng vòng lặp for để in hêt ra màn

thay vì viết list[1].name ta có thể viết
*(list+1)
và để truy cập vào name ta viết như sau:
(*(list+1)).name
Để tránh việc viết dài và dùng dấu ".", C cung cáp tóan tử "->". p->a là dạng rút gọn của (*p).a
Vậy để truy cập vào list[1].name ta viết:
(list+1)->name

Sau đây là code đầy đủ của chương trình tạo 1 struct và truy cập các phần tử của nó.

http://pastebin.com/SDANcnYw