Tác giả phạm hồng thái bài giảng ngôn ngữ LẬp trình c/C++



tải về 1.98 Mb.
trang34/55
Chuyển đổi dữ liệu07.07.2016
Kích1.98 Mb.
1   ...   30   31   32   33   34   35   36   37   ...   55

Cấu trúc với thành phần kiểu bit

Trường bit


Thông thường các trường trong một cấu trúc thường sử dụng ít nhất là 2 byte tức 16 bit. Trong nhiều trường hợp một số trường có thể chỉ cần đến số bit ít hơn, ví dụ trường gioitinh thông thường chỉ cần đến 1 bit để lưu trữ. Những trường hợp như vậy ta có thể khai báo kiểu bit cho các trường này để tiết kiệm bộ nhớ. Tuy nhiên, cách khai báo này ít được sử dụng trừ khi cần thiết phải truy nhập đến mức bit của dữ liệu trong các chương trình liên quan đến hệ thống.

Một trường bit là một khai báo trường int và thêm dấu: cùng số bit n theo sau, trong đó 0 £ n < 15. Ví dụ do độ lớn của ngày không vượt quá 31, tháng không vuợt quá 12 nên 2 trường này trong cấu trúc ngày tháng có thể khai báo tiết kiệm hơn bằng 5 và 4 bit như sau:


struct Date {

int ng: 5;

int th: 4;

int nam;

} ;

Đặc điểm


Cần chú ý các đặc điểm sau của một cấu trúc có chứa trường bit:

Các bit được bố trí liên tục trên dãy các byte.

Kiểu trường bit phải là int (signed hoặc unsigned).

Độ dài mỗi trường bit không quá 16 bit.

Có thể bỏ qua một số bit nếu bỏ trống tên trường, ví dụ:

struct tu {

int: 8;

int x:8;

}

mỗi một biến cấu trúc theo khai báo trên gồm 2 byte, bỏ qua không sử dụng byte thấp và trường x chiếm byte (8 bit) cao.



Không cho phép lấy địa chỉ của thành phần kiểu bit.

Không thể xây dựng được mảng kiểu bit.

Không được trả về từ hàm một thành phần kiểu bit. Ví dụ nếu b là một thành phần của biến cấu trúc x có kiểu bit thì câu lệnh sau là sai:

return x.b ; // sai

tuy nhiên có thể thông qua biến phụ như sau:

int tam = x.b ; return tam ;

Tiết kiệm bộ nhớ

Dùng trong kiểu union để lấy các bit của một từ (xem ví dụ trong phần kiểu hợp).


Câu lệnh typedef


Để thuận tiện trong sử dụng, thông thường các kiểu được NSD tạo mới sẽ được gán cho một tên kiểu bằng câu lệnh typedef như sau:

typedef ;

Ví dụ: Để tạo kiểu mới có tên Bool và chỉ chứa giá trị nguyên (thực chất chỉ cần 2 giá trị 0, 1), ta có thể khai báo:

typedef int Bool;

khai báo này cho phép xem Bool như kiểu số nguyên.

hoặc có thể đặt tên cho kiểu ngày tháng là Date với khai báo sau:

typedef struct Date {

int ng;

int th;


int nam;

};

khi đó ta có thể sử dụng các tên kiểu này trong các khai báo (ví dụ tên kiểu của đối, của giá trị hàm trả lại …).


Hàm sizeof()


Hàm trả lại kích thước của một biến hoặc kiểu. Ví dụ:

Bool a, b;

Date x, y, z[50];

cout << sizeof(a) << sizeof(b) << sizeof(Bool) ; // in 2 2 2

cout << "Số phần tử của z = " << sizeof(z) / sizeof(Date) // in 50

CẤU TRÚC TỰ TRỎ VÀ DANH SÁCH LIÊN KẾT


Thông thường khi thiết kế chương trình chúng ta chưa biết được số lượng dữ liệu cần dùng là bao nhiêu để khai báo số biến cho phù hợp. Đặc biệt là biến dữ liệu kiểu mảng. Số lượng các thành phần của biến mảng cần phải khai báo trước và chương trình dịch sẽ bố trí vùng nhớ cố định cho các biến này. Do buộc phải khai báo trước số lượng thành phần nên kiểu mảng thường dẫn đến hoặc là lãng phí bộ nhớ (khi chương trình không dùng hết) hoặc là không đủ để chứa dữ liệu (khi chương trình cần chứa dữ liệu với số lượng thành phần lớn hơn).

Để khắc phục tình trạng này C++ cho phép cấp phát bộ nhớ động, nghĩa là số lượng các thành phần không cần phải khai báo trước. Bằng toán tử new chúng ta có thể xin cấp phát vùng nhớ theo nhu cầu mỗi khi chạy chương trình. Tuy nhiên, cách làm này dẫn đến việc dữ liệu của một danh sách sẽ không còn nằm liên tục trong bộ nhớ như đối với biến mảng. Mỗi lần xin cấp phát bởi toán tử new, chương trình sẽ tìm một vùng nhớ đang rỗi bất kỳ để cấp phát cho biến và như vậy dữ liệu sẽ nằm rải rác trong bộ nhớ. Từ đó, để dễ dàng quản lý trật tự của một danh sách các dữ liệu, mỗi thành phần của danh sách cần phải chứa địa chỉ của thành phần tiếp theo hoặc trước nó (điều này là không cần thiết đối với biến mảng vì các thành phần của chúng sắp xếp liên tục, kề nhau). Từ đó, mỗi thành phần của danh sách sẽ là một cấu trúc, ngoài các thành phần chứa thông tin của bản thân, chúng còn phải có thêm một hoặc nhiều con trỏ để trỏ đến các thành phần tiếp theo hay đứng trước. Các cấu trúc như vậy được gọi là cấu trúc tự trỏ vì các thành phần con trỏ trong cấu trúc này sẽ trỏ đến các vùng dữ liệu có kiểu chính là kiểu của chúng.


Cấu trúc tự trỏ


Một cấu trúc có chứa ít nhất một thành phần con trỏ có kiểu của chính cấu trúc đang định nghĩa được gọi là cấu trúc tự trỏ. Có thể khai báo cấu trúc tự trỏ bởi một trong những cách sau:

Cách 1:


typedef struct ; // định nghĩa tên cấu trúc

struct

{

các thành phần chứa thông tin … ;



*con trỏ ;

} ;


Ví dụ:

typedef struct Sv Sinhvien ; // lưu ý phải có từ khoá struct

struct Sv

{

char hoten[30] ; // thành phần chứa thông tin



float diem ; // thành phần chứa thông tin

Sinhvien *tiep ; // thành phần con trỏ chứa địa chỉ tiếp theo

} ;

Cách 2:


struct

{

các thành phần chứa thông tin … ;



*con trỏ ;

} ;


typedef ; // định nghĩa tên cấu trúc tự trỏ

Ví dụ:


struct Sv

{

char hoten[30] ; // thành phần chứa thông tin



float diem ; // thành phần chứa thông tin

Sv *tiep ; // thành phần con trỏ chứa địa chỉ tiếp theo

} ;

typedef Sv Sinhvien ;


Cách 3:

typedef struct // định nghĩa tên cấu trúc tự trỏ

{

các thành phần chứa thông tin … ;



*con trỏ ;

} ;


Ví dụ:

typedef struct Sinhvien

{

char hoten[30] ; // thành phần chứa thông tin



float diem ; // thành phần chứa thông tin

Sinhvien *tiep ; // con trỏ chứa địa chỉ thành phần tiếp theo

} ;
Cách 4:

struct

{

các thành phần chứa thông tin … ;



*con trỏ ;

} ;


Ví dụ:

struct Sinhvien

{

char hoten[30] ; // thành phần chứa thông tin



float diem ; // thành phần chứa thông tin

Sinhvien *tiep ; // con trỏ chứa địa chỉ của phần tử tiếp.

} ;

Trong các cách trên ta thấy 2 cách khai báo cuối cùng là đơn giản nhất. C++ quan niệm các tên gọi đứng sau các từ khoá struct, union, enum là các tên kiểu (dù không có từ khoá typedef), do vậy có thể sử dụng các tên này để khai báo.


1   ...   30   31   32   33   34   35   36   37   ...   55


Cơ sở dữ liệu được bảo vệ bởi bản quyền ©hocday.com 2016
được sử dụng cho việc quản lý

    Quê hương