Bài giảng Hệ thống máy tính và ngôn ngữ C - Chương 10: Lớp lưu trữ của biến sự chuyển kiểu

CHƯƠNG 10

LỚP LƯU TRỮ CỦA BIẾN

SỰ CHUYỂN KIỂU

10.1 Khái niệm

10.2 Biến toàn cục và biến cục bộ

10.3 Biến tĩnh (static)

10.4 Biến REGISTER

10.5 Khởi động trị cho biến ở các lớp

10.6 Sự chuyển kiểu

10.6 Định vị vng nhớ cho cc lớp lưu trữ

Bài tập cuối chương

 

pdf42 trang | Chuyên mục: C/C++ | Chia sẻ: yen2110 | Lượt xem: 580 | Lượt tải: 0download
Tóm tắt nội dung Bài giảng Hệ thống máy tính và ngôn ngữ C - Chương 10: Lớp lưu trữ của biến sự chuyển kiểu, để xem tài liệu hoàn chỉnh bạn click vào nút "TẢI VỀ" ở trên
 toàn cục tĩnh là biến khai báo ngoài tất cả các hàm, 
trong một module chương trình nào đó và chỉ có ý nghĩa sử 
dụng bởi các hàm trong cùng module đó mà thôi. Các hàm 
trong các module khác của chương trình không thể sử dụng 
được các biến toàn cục dạng static như thế này. 
CHƯƠNG 10 
LỚP LƯU TRỮ CỦA BIẾN 
SỰ CHUYỂN KIỂU 
10.3 BIẾN TĨNH (STATIC) 
Biến cục bộ tĩnh là các biến được khai báo trong hàm và chỉ 
có ý nghĩa sử dụng trong hàm có khai báo đó mà thôi. 
Nhưng các biến cục bộ tĩnh khác với biến cục bộ (hay tự 
động) ở thời gian tồn tại, biến tĩnh tồn tại suốt trong bộ 
nhớ từ lúc nó được sử dụng lần đầu tiên cho đến khi kết 
thúc chương trình, và giá trị của chúng không hề mất đi khi 
ra khỏi hoặc trở vào hàm chứa nó. 
CHƯƠNG 10 
LỚP LƯU TRỮ CỦA BIẾN 
SỰ CHUYỂN KIỂU 
10.3 BIẾN TĨNH (STATIC) 
Ví dụ : 
static int a; 
main() 
 { 
 clrscr(); 
 ... 
 } 
int func(void) 
 { static int b; 
 ... 
 } 
CHƯƠNG 10 
LỚP LƯU TRỮ CỦA BIẾN 
SỰ CHUYỂN KIỂU 
10.3 BIẾN TĨNH (STATIC) 
Ví dụ: Xét chương trình tính tổng 
 s = 1 +...+ n 
dùng hàm trong đó có khai báo biến static. 
CHƯƠNG 10 
LỚP LƯU TRỮ CỦA BIẾN 
SỰ CHUYỂN KIỂU 
10.3 BIẾN TĨNH (STATIC) 
#include 
#include 
int tong (int a); 
main() 
 { int n, i, kq; 
 clrscr(); 
 printf ("Nhap tri n: "); 
 scanf ("%d", &n); 
 for (i = 1; i <= n; i++) 
 kq = tong (i); 
 printf ("Ket qua: %d", kq); 
 getch(); } 
CHƯƠNG 10 
LỚP LƯU TRỮ CỦA BIẾN 
SỰ CHUYỂN KIỂU 
10.3 BIẾN TĨNH (STATIC) 
int tong (int a) 
 { 
 static int tam = 0; 
 tam += a; 
 return tam; 
 } 
Trong chương trình trên, trong hàm tong(), ta có khai báo 
một biến cục bộ tĩnh, biến tam, biến này chỉ được khởi 
động trị một lần đầu chương trình, trị 0, sau đó trị của biến 
này luôn được giữ lại cho lần sử dụng sau 
CHƯƠNG 10 
LỚP LƯU TRỮ CỦA BIẾN 
SỰ CHUYỂN KIỂU 
10.3 BIẾN TĨNH (STATIC) 
Ví dụ: Khởi động trị của biến static tam trong hàm tổng 
void xoa (void) 
 { 
 int temp; 
 if ( (temp = tong(0)) != 0 ) 
 tong(-temp); 
 } 
Ví dụ 11.9: (332-333) 
CHƯƠNG 10 
LỚP LƯU TRỮ CỦA BIẾN 
SỰ CHUYỂN KIỂU 
10.3 BIẾN TĨNH (STATIC) 
Hàm được khai báo là static thì nó chỉ có thể được sử dụng 
trong module mà nó được khai báo và định nghĩa mà thôi. 
Cú pháp khai báo và định nghĩa hàm static như sau: 
static kiểu tên_hàm (danh_sách_khai_báo_đối_số) 
 { 
 ... 
 } 
CHƯƠNG 10 
LỚP LƯU TRỮ CỦA BIẾN 
SỰ CHUYỂN KIỂU 
10.4 BIẾN REGISTER 
Bộ dịch C cho phép tận dụng các tài nguyên có sẵn của máy 
để tối ưu hóa chương trình, một trong các tối ưu này là C 
cho phép lập trình viên sử dụng một số thanh ghi của bộ vi 
xử lý để khai báo biến, biến này gọi là biến thanh ghi 
(register). Khai báo biến thanh ghi: 
 register kiểu danh_sách_tên_biến; 
với kiểu là kiểu khai báo cho biến, kiểu này chỉ có thể là 
int, char, unsigned, long hoặc pointer 
CHƯƠNG 10 
LỚP LƯU TRỮ CỦA BIẾN 
SỰ CHUYỂN KIỂU 
10.4 BIẾN REGISTER 
Ví dụ: 
register int i; 
register char c; 
register unsigned u; 
resister long l; 
register int *r; 
register t; 
CHƯƠNG 10 
LỚP LƯU TRỮ CỦA BIẾN 
SỰ CHUYỂN KIỂU 
10.4 BIẾN REGISTER 
Tầm sử dụng và thời gian tồn tại của các biến thanh ghi 
tương tự như các biến cục bộ, nhưng chúng được truy xuất 
nhanh hơn các biến cục bộ bình thường vì chúng chính là 
các thanh ghi của bộ vi xử ly. 
Các biến thanh ghi thường được sử dụng làm các biến điều 
khiển trong các vòng lặp hoặc các biến phải truy xuất nhiều 
lần trong chương trình. 
CHƯƠNG 10 
LỚP LƯU TRỮ CỦA BIẾN 
SỰ CHUYỂN KIỂU 
10.5 KHỞI ĐỘNG TRỊ CHO BIẾN Ở CÁC LỚP 
Đối với biến toàn cục hoặc biến tĩnh, ngay sau khi được khai 
báo, mỗi biến sẽ được C tự động gán trị là 0. 
Trong khi đó biến tự động và biến thanh ghi sẽ có giá trị 
không xác định (gọi là trị rác). 
trị bằng một biểu thức hằng. 
CHƯƠNG 10 
LỚP LƯU TRỮ CỦA BIẾN 
SỰ CHUYỂN KIỂU 
10.5 KHỞI ĐỘNG TRỊ CHO BIẾN Ở CÁC LỚP 
Trong suốt quá trình chạy chương trình, biến toàn cục và 
biến tĩnh chỉ có thể được khởi động trị một lần, đó là lần 
đầu tiên mà khai báo biến đó được thực thi. 
Biến toàn cục và biến tĩnh có thể được khởi động trị bằng 
một biểu thức hằng. 
Biến tự động và biến thanh ghi có thể được khởi động trị 
bằng một biểu thức mà giá trị của biểu thức tới lúc đó đã 
xác định(có thể gọi hàm). 
CHƯƠNG 10 
LỚP LƯU TRỮ CỦA BIẾN 
SỰ CHUYỂN KIỂU 
10.5 KHỞI ĐỘNG TRỊ CHO BIẾN Ở CÁC LỚP 
Việc khởi động cho các biến thuộc kiểu dữ kiện có cấu trúc 
như mảng (array), struct và union chỉ có thể thực hiện được 
đối với các biến toàn cục hoặc biến tĩnh mà thôi 
CHƯƠNG 10 
LỚP LƯU TRỮ CỦA BIẾN 
SỰ CHUYỂN KIỂU 
10.6 SỰ CHUYỂN KIỂU 
Khi thực hiện các phép toán số học hoặc luân lý, C luôn 
thực hiện sự chuyển kiểu tự động. 
C còn cho phép lập trình viên thực hiện việc chuyển kiểu 
bắt buộc, ép kiểu (type casting). Cú pháp để ép kiểu một 
biến, hằng hay biểu thức: 
 (type) giá_trị 
CHƯƠNG 10 
LỚP LƯU TRỮ CỦA BIẾN 
SỰ CHUYỂN KIỂU 
10.6 SỰ CHUYỂN KIỂU 
Ví dụ: 
Cho khai báo biến sau: 
 int a = 10, b = 3; 
 double d; 
biểu thức nào cho kết quả đúng, giải thích?(xem lại thứ tự 
ưu tiên các phép toán của C) 
a) d = (double)(a/b); 
b) d = (double)a/b; 
c) d = a/(double)b; 
CHƯƠNG 10 
LỚP LƯU TRỮ CỦA BIẾN 
SỰ CHUYỂN KIỂU 
10.7 ĐỊNH VỊ VÙNG NHỚ CHO CÁC LỚP LƯU TRỮ 
Cĩ hai cơ chế cơ bản giúp bộ dịch làm cơng việc này: 
-Bộ dịch cần dùng một cách đúng đắn bảng biểu trưng để theo 
dõi các biến trong quá trình dịch. 
-Bộ dịch cũng theo một sự phân chia bộ nhớ hệ thống, nĩ cẩn 
thận định vị bộ nhớ cho các biến dựa vào các đặc tính cụ thể, 
với các vùng nhớ xác định dành riêng cho các đối tượng đặc 
biệt. 
CHƯƠNG 10 
LỚP LƯU TRỮ CỦA BIẾN 
SỰ CHUYỂN KIỂU 
10.7 ĐỊNH VỊ VÙNG NHỚ CHO CÁC LỚP LƯU TRỮ 
10.6.1 Bảng biểu trưng 
Bộ dịch C theo dõi các biến trong một chương trình với một bảng 
biểu trưng. 
Mỗi đầu vào của bảng biểu trưng cho biến chứa: 
(1) tên của biến, 
(2) kiểu của biến, 
(3) vị trí trong bộ nhớ mà biến đĩ được định vị. 
(4) một danh hiệu chỉ định khu vực mà trong đĩ biến được khai 
báo (tức tầm vực của biến đĩ). 
CHƯƠNG 10 
LỚP LƯU TRỮ CỦA BIẾN 
SỰ CHUYỂN KIỂU 
10.7 ĐỊNH VỊ VÙNG NHỚ CHO CÁC LỚP LƯU TRỮ 
 10.6.1 Bảng biểu trưng 
 Ví dụ 11.18: Chương trình tính tốc độ mạng 
 #include 
 int main() 
 { int amount; int rate; int time; int hours; int minutes; 
 int seconds; 
 // Nhập: số lượng byte và tốc độ truyền của mạng 
 printf (“Cĩ bao nhiêu byte dữ liệu được truyền? ”); 
 scanf (“%d”, &amount); 
 printf (“Tốc độ truyền (bytes/giây)? ”); 
 scanf (“%d”, &rate); 
CHƯƠNG 10 
LỚP LƯU TRỮ CỦA BIẾN 
SỰ CHUYỂN KIỂU 
10.7 ĐỊNH VỊ VÙNG NHỚ CHO CÁC LỚP LƯU TRỮ 
 10.6.1 Bảng biểu trưng 
 Ví dụ 11.18: Chương trình tính tốc độ mạng 
 // Tính thời gian theo số giây 
 time = amount / rate;` 
 // Chuyển thời gian sang giờ, phút giây 
 hours = time / 3600;// 3600 giây trong một giờ 
 minutes = (time % 3600) / 60;// 60 giây trong một phút 
 seconds = (time % 3600) % 60;// phần dư cịn lại là giây 
 // Xuất ra kết quả 
 printf(“Thời gian: %dh %dm %ds\n”, hours, minutes, 
seconds); } 
CHƯƠNG 10 
LỚP LƯU TRỮ CỦA BIẾN 
SỰ CHUYỂN KIỂU 
10.7 ĐỊNH VỊ VÙNG NHỚ CHO CÁC LỚP LƯU TRỮ 
 10.6.1 Bảng biểu trưng 
CHƯƠNG 10 
LỚP LƯU TRỮ CỦA BIẾN 
SỰ CHUYỂN KIỂU 
Danh hiệu Kiểu 
Vị trí 
(offset) 
Tầm vực 
Amount int 0 Main 
Hours int -3 Main 
Minutes int -4 Main 
Rate int -1 Main 
Seconds int -5 Main 
Time int -2 Main 
10.7 ĐỊNH VỊ VÙNG NHỚ CHO CÁC LỚP LƯU TRỮ 
 10.6.2 Định vị vùng nhớ cho biến 
 Cĩ hai vùng nhớ mà các biến C được định vị ở đĩ: vùng dữ liệu 
tồn cục (global data section) và ngăn xếp thực thi (run-time 
stack) (ngồi ra cịn cĩ biến thanh ghi). 
- Vùng biến tồn cục là nơi chứa tất cả các biến tồn cục. Tổng 
quát hơn, nĩ cũng là nơi chứa các biến tĩnh. 
- Vùng stack thực thi là nơi chứa các biến cục bộ (hay lớp biến 
lưu trữ tự động). 
 Vùng offset trong bảng biểu trưng cung cấp thơng tin chính 
xác về vị trí trong bộ nhớ của các biến. Nĩ cho biết số ơ nhớ tính 
từ địa chỉ nền của vùng nhớ chứa biến. 
CHƯƠNG 10 
LỚP LƯU TRỮ CỦA BIẾN 
SỰ CHUYỂN KIỂU 
BÀI TẬP CUỐI CHƯƠNG 
1. Viết một hàm sao cho mỗi lần gọi hàm thì hàm sẽ trả 
về một trị số ngay sau trị trước đó trong dãy số 
Fibonaci. 
2. Viết chương trình với các hàm tính các biểu thức sau đây: 
dùng và không dùng biến thanh ghi 
... ... ( ) ... ( )
...
! ( )! ( )! !
       
    
 
1 n 1 n 1 1 n 2 1
t
n n 1 n 2 1
( ... ) ( ... ( )) ( ... ( )) ... !
! ( )! ( )! ... !
           

     
1 n 1 n 1 1 n 2 1
T
n n 1 n 2 1
CHƯƠNG 10 
LỚP LƯU TRỮ CỦA BIẾN 
SỰ CHUYỂN KIỂU 
BÀI TẬP CUỐI CHƯƠNG 
3. Viết một chương trình gồm hai module: main.c và func.c, 
trong đó module main.c lưu hàm main() có các lệnh gọi nhập 
ba hệ số của tam thức bậc hai, kiểm tra in ấn; còn trong 
module func.c lưu các hàm cần thiết để giải phương trình 
bậc hai và biện luận tam thức bậc hai. 
4. In ra màn hình các số nguyên tố từ 1 đến 1.000. Dùng 
biến thanh ghi và không dùng biến thanh ghi. Kiểm tra 
thời gian. 
CHƯƠNG 10 
LỚP LƯU TRỮ CỦA BIẾN 
SỰ CHUYỂN KIỂU 
 KẾT THÚC CHƯƠNG 10 
CHƯƠNG 10 
LỚP LƯU TRỮ CỦA BIẾN 
SỰ CHUYỂN KIỂU 

File đính kèm:

  • pdfbai_giang_he_thong_may_tinh_va_ngon_ngu_c_chuong_10_lop_luu.pdf