1. Trang chủ
  2. » Công Nghệ Thông Tin

Bài giảng Ngôn ngữ lập trình C - Chương 7: Cấu trúc

21 15 0

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 21
Dung lượng 313,5 KB

Nội dung

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). Mời các bạn cùng tham khảo Bài giảng Ngôn ngữ lập trình C - Chương 7: Cấu trúc để nắm bắt được những nội dung chi tiết trong bài.

CHƯƠNG CẤU TRÚC Cấu trúc tập hợp nhiều biến, khác kiểu nhau, nhóm lại dạng tên cho tiện xử lý (Giống cấu trúc Record Pascal) Cấu trúc giúp cho việc tổ chức liệu phức tạp, đặc biệt chương trình lớn nhiều tình chúng cho phpé nhóm biến có liên quan lại để xử lý đơn vị thay thực thể tách biệt I Định nghĩa cấu trúc khai báo biến cấu trúc Định nghĩa cấu trúc struct { ; ; } Trong đó: struct: Là từ khoá Tên_kiểu_cấu_trúc: tên bất kỳ, người sử dụng đặt Ví dụ: struct Date { int day; int month; int year; }; Định nghĩa cấu trúc typedef Nếu cấu trúc định nghĩa với tên_kiểu_cấu_trúc ta typedef đê định nghĩa sau: Typedef struct < tên_kiểu_cấu_trúc> ; Ví dụ: typedef struct Date DATE; Nếu cấu trúc chưa định nghĩa, ta dùng typedef để định nghĩa: Typedef struct [Tên_kiểu_cấu_trúc] { ; ; } ; Ví dụ: Với ví dụ ta dùng typedef để định nghĩa lại sau: typedef struct { int day; int month; int year; } DATE; 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 thông qua tên cấu trúc định nghĩa typedef + Dùng tên_kiểu_cấu_trúc: struct < tên_kiểu_cấu_trúc> II Ví dụ: struct Date date,*pd; + Dùng tên định nghĩa typedef Ví dụ: DATE date,*pd Khởi đầu giá trị cho cấu trúc: Ta khởi đầu giá trị cho cấu trúc theo phương cách khởi đầu giá trị cho mảng Theo sau tên_biến_cấu_trúc dấu (=), sau danh dách giá trị khởi đầu đặt dấu móc {} Các giá trị khởi đầu có kiểu với trường tương ứng cấu trúc Ví dụ: DATE date = {12, 3, 2003} III Truy cập đến thành phần cấu trúc: Có hai cách tham chiếu đến thành phần cấu trúc tương ứng với hai trường hợp sau: Nếu biến cấu trúc: Ta dùng tốn tử dấu chấm (.) để tham chiếu đến trường (thành phần) cấu trúc Cú pháp: . Nếu biến 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 DATE *p Với khai báo ta 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 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 trường cấu trúc, kết 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ấu trúc Vì cấu trúc khối đối tượng liệu, hồn tồn có khả tạo mảng cấu trúc Khai báo mảng cấu truc sau: struct []; Hoặc dùng tên khai báo 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 trường ta dùng sau: aa[2].month = 4; (*(aa+2)).year=2003 V Cấu trúc lồng Một cấu trúc gọi lồng có trường cấu trúc lại có kiểu cấu trúc Cấu trúc lồng thường dùng phổ biến lập trình C cho phép tạo liệu có thứ bậc Vi dụ: Tạo cấu trúc để lưu thông tin ngày sinh 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 thành phần cấu trúc lồng hoàn toàn giống với việc tham chiếu cấu trúc khơng lồng nhau, có trường chứa cấu trúc 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 thành phần 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 khơng có giới hạn số mức lồng cấu trúc Nhưng lúc tham chiếu đến trường trở nên phúc tạp khó đọc Cấu trúc tự tham chiếu: Các cấu trúc gọi tự tham chiếu chứa trường trỏ trỏ đế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 cho phép ta đưa khai báo trỏ trỏ đến cấu trúc chưa định nghĩa, đặc tính cho phép ta tạo tự tham chiếu đề cập Ta tạo cấu trúc tham chiếu lẫn Ví dụ: struct s1 { int a; struct s2 *b; }; struct s2 { int a; struct s1 *b; }; Đặc tính khơng áp dụng khai báo 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 truyền theo giá trị) - Truyền trỏ trỏ đến cấu trúc (gọi truyền 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)*/ Truyền theo địa ln nhanh trỏ đơn giản chép đến vùng đối số Mặt khác, truyền theo giá trị đòi hỏi toàn cấu trúc chép Chỉ có hai trương hợp nên truyền theo giá trị: Cấu trúc nhỏ (tức kích thước cỡ xấp xỉ với trỏ) Muốn bảo đảm lời gọi hàm không làm thay đổi cấu trúc truyền vào (Khi đối số truyền theo giá trị, trình biên dịch tạo đối số Hàm gọi thay đổi mà thôi) ... khơng c? ? giới hạn số m? ?c lồng c? ??u tr? ?c Nhưng l? ?c tham chiếu đến trường trở nên ph? ?c tạp khó đ? ?c ? ?C? ??u tr? ?c tự tham chiếu: C? ?c cấu tr? ?c gọi tự tham chiếu chứa trường trỏ trỏ đến Ví dụ: struct a... Định nghĩa c? ??u tr? ?c khai báo biến c? ??u tr? ?c Định nghĩa c? ??u tr? ?c struct { ; ; } Trong đó: struct: Là từ khố Tên_kiểu _c? ??u_tr? ?c: tên bất... mảng c? ??u tr? ?c: struct Date aa[10]; DATE ab[10]; L? ?c để tham chiếu đến trường ta dùng sau: aa[2].month = 4; (*(aa+2)).year=2003 V C? ??u tr? ?c lồng Một c? ??u tr? ?c gọi lồng c? ? trường c? ??u tr? ?c lại c? ? kiểu

Ngày đăng: 20/05/2021, 08:44