/ *g ọi hàm g() biến b được cấp phát
Bài 29 Biến tổng thể và bộ nhớ tĩnh
Tóm tắt nội dung:
Một biến tổng thể được khai báo ngoài hàm và dùng tại mọi nơi trong chương trình. Ngược lại một biến cục bộ chỉ có tầm tác dụng trong chính hàm nơi nó khai báo.
Thời lượng: 1 tiết
Khác với biến cục bộ của một hàm, biến tổng thể của chương trình được cấp phát nhớ trên bộ nhớ tĩnh của chương trình. Bộ nhớ tĩnh của một chương trình được tạo ra ngay từ khi chương trình chạy và nó tồn tại cho đến khi chương trình kết thúc. Chính vì vậy một biến tổng thể có thể được sử dụng trong mọi hàm của chương trình.
Ví dụ:
void f() { int b; a = 5; /* truy cập biến tổng thể */ b = 5; /* truy cập biến cục bộ */ } void g() { a = 5; /* truy cập biến tổng thể */
b = 5; /* truy cập biến cục bộ mà không tồn tại */ }
Trong một chương trình có thể đặt tên trùng nhau cho một biến tổng thể của chương trình và một biến cục bộ của hàm. Khi đó biến được dùng trong hàm ln ưu tiên cho biến cục bộ. Ví dụ: int a; /* biến tổng thể a */ void f() { int a; /* biến cục bộ trùng tên biến tổng thể */ a = 5; /* lệnh gán cho biến cục bộ */ }
Vì biến tổng thể có thể sử dụng được mọi nơi trong chương trình nên rất khó kiểm sốt và dễ gây nhầm lẫn. Một trong những nguyên tắc cơ bản của việc thiết kế chương trình là hạn chế tối đa số biến tổng thể sử dụng trong chương trình. Nói chung ngồi những trường hợp cần biến tổng thể vào một mục đích nhất định nào đó cịn khơng ln chỉ sử dụng biến cục bộ trong chương trình. Để truyền thơng tin giữa các hàm trong chương trình chúng ta có thể dùng tham số truyền vào và kết quả trả về của các hàm.
Ví dụ: /* Một chương trình tạo danh sách móc nối động sử dụng biến tổng thể */ struct nut_hs { char ten[25]; int diem;
struct nut_hs* tiep; };
/* khai báo biến tổng thể là con trỏ đến nút đầu danh sách */ struct nut_hs *nutdauds = NULL;
/* hàm thêm một nút học sinh mới có tên (ten) và điểm (diem) vào danh sách */ void them_nuths(const char* ten, int diem)
{
struct nut_hs * hs;
hs = (struct nut_hs*)malloc(sizeof(struct nut_hs)); strcpy(hs->ten, ten); hs->diem = diem; hs->tiep = nutdauds; nutdauds = hs; } void main() {
}
/* Một chương trình tương đương nhưng chỉ sử dụng biến cục bộ */ struct nut_hs
{
char ten[25]; int diem;
struct nut_hs* tiep; };
/* hàm thêm một nút học sinh mới cần có tham số là con trỏ đến đầu danh sách cần thêm
truyền theo dạng tham biến do nội con trỏ này sẽ bị thay đổi khi thêm nút vào đầu danh sách
*/
void them_nuths(struct nut_hs **nutdauds_ptr, const char* ten, int diem) {
struct nut_hs * hs;
hs = (struct nut_hs*)malloc(sizeof(struct nut_hs)); strcpy(hs->ten, ten); hs->diem = diem; hs->tiep = *nutdauds_ptr; *nutdauds_ptr = hs; } void main() {
/* khai báo biến cục bộ là con trỏ đến nút đầu danh sách */ struct nut_hs *nutdauds = NULL;
/* truyền con trỏ đầu danh sách cho hàm thêm nút theo địa chỉ */ them_nuths(&nutdauds, "Nguyen Van A", 9);
}