Chuong 2 - Luu Tru Du Lieu

  • November 2019
  • PDF

This document was uploaded by user and they confirmed that they have the permission to share it. If you are author or own the copyright of this book, please report to us by using this DMCA report form. Report DMCA


Overview

Download & View Chuong 2 - Luu Tru Du Lieu as PDF for free.

More details

  • Words: 1,881
  • Pages: 25
Lưu trữ dữ liệu và bộ nhớ chương trình

Giới thiệu • • • • •

Khái niệm bộ nhớ của chương trình Biến toàn cục Biến cục bộ Biến tĩnh Biến register

1. Bộ nhớ của chương trình Bộ nhớ chương trình được chia thành 4 phần: • Vùng mã lệnh (chứa mã lệnh và hằng) • Vùng cấp phát tĩnh (chứa các biến toàn cục, và biến tĩnh) • Vùng cấp phát động • Vùng ngăn xếp (chứa các biến cục bộ) Trong đó: • Hai vùng đầu có độ lớn cố định trong suốt thời gian chương trình làm việc • Vùng cấp phát động sẽ lưu trữ các đối tượng được cấp phát bằng hàm malloc, calloc, hay các đối tượng được cấp phát bằng toán tử new

Bộ nhớ của chương trình (tt) • Vùng ngăn xếp lưu trữ các biến cục bộ. Mỗi chương trình thực hiện một khối lệnh hoặc một hàm, các biến khai báo trong khối hoặc hàm đó được lưu trữ trong ngăn xếp, chương trình ra khỏi một hàm hay khối lệnh, các biến cục bộ của hàm hay khối bị lấy ra khỏi ngăn xếp, không còn nữa. • Do đó vị trí khai báo (bên trong hoặc bên ngoài hàm) quyết định 2 vấn đề then chốt: + Biến được lưu trữ trong phần cố định hay vùng tạm thời + Phạm vi sử dụng của biến là cục bộ bên trong một hàm hay toàn bộ đến cuối chương trình

2. Phạm vi hoạt động của các biến • Tất cả các biến đều phải được khai báo trước khi sử dụng. Một điểm khác biệt giữa C và C++ là trong C++ chúng ta có thể khai báo biến ở bất kỳ nơi nào trong chương trình. • Thời gian sống của một biến bị giới hạn bởi phạm vi của nó. – Các biến toàn cục tồn tại suốt thời gian thực hiện chương trình. Không gian bộ nhớ cho các biến toàn cục được dành riêng trước khi sự thực hiện của chương trình bắt đầu. – Các biến cục bộ được tạo ra khi phạm vi của chúng bắt đầu và mất đi khi phạm vi của chúng kết thúc. Nhưng ngược lại không gian bộ nhớ cho các biến cục bộ được cấp phát ở thời điểm thực hiện chương trình.

2.1 Biến toàn cục - global variable • Biến toàn cục: là biến khai báo bên ngoài tất cả các hàm của chương trình trong đó có cả hàm main. • Có thể được sử dụng ở bất kì đâu trong chương trình (trong hàm main và cả bên trong các hàm con). • Phạm vi sử dụng của biến toàn cục là bắt đầu từ vị trí khai báo đến cuối chương trình vì thế người ta thường khai báo biến toàn cục ở đầu chương trình. • Biến toàn cục khi khai báo không khởi tạo giá trị thì biến toàn cục kiểu số sẽ có giá trị là 0

Sử dụng từ khóa extern cho biến toàn cục • C cho phép các phần riêng rẽ của một chương trình lớn có thể được biên dịch riêng rẽ và liên kết lại với nhau. • Có cách để báo cho tất cả các file về biến toàn cục mà chương trình cần. Sử dụng từ khóa extern. • Cách tốt nhất là khai báo tất cả các biến toàn cục của chương trình vào 1 file (header file), và sử dụng extern để khai báo trong những file khác, như ví dụ:

//File vidu.h #include <stdio.h> #include int a=10, b=20; float xyz; // xyz là toan cuc void Foo (int xyz); void keep_track(); void In (int a) ;

//File vidu.cpp #include <stdio.h> #include extern int a, b; extern float xyz; void Foo (int xyz) // xyz là cục bộ cho thân hàm Foo { printf("bien cuc bo cua ham Foo xyz= %d\n", xyz) ; if (xyz >= 0) { double xyz; // xyz là cuc bo cua khoi này xyz=15; printf("bien cuc bo cua khoi nay : xyz= %lf\n", xyz) ; } } void keep_track() { static int count = 0; count++; printf("count= %d\n", count); } void In (int a){ printf("toan cuc: %d \n", ::b); printf("cuc bo: %d \n", a); }

//File main.cpp #include <stdio.h> #include #include "vidu.h" int main() { In(5); printf("bien toan cuc xyz= %f\n", xyz) ; Foo(1); //keep_track(); //keep_track(); //keep_track(); getch(); return 1; }

2.2 Biến cục bộ - local variable • Biến cục bộ (được gọi là biến riêng): là biến khai báo trong 1 hàm hay một khối. • Phạm vi sử dụng là bên trong hàm hay trong khối lệnh mà nó khai báo, nghĩa là chỉ được sử dụng bên trong thân hàm hay khối lệnh mà nó được khai báo. • Biến cục bộ chỉ tồn tại khi chương trình con đang hoạt động, nghĩa là biến cục bộ sẽ được cấp phát bộ nhớ khi chương trình con được gọi để thi hành, và nó sẽ được giải phóng ngay sau khi chương trình con kết thúc.

2.3 Chú ý Nếu trong một hàm hay khối lệnh có khai báo các biến cục bộ trùng tên với biến toàn cục. Khi chương trình thực hiện đến hàm hay khối lệnh này, chương trình tương tác với biến cục bộ của hàm hay khối lệnh, không hề làm thay đổi giá trị của biến toàn cục float xyz; // xyz là toàn cục void Foo (int xyz) // xyz là cục bộ cho thân của Foo { printf("bien xyz cua khoi nay : xyz= %d\n", xyz) ; if (xyz > 0) { double xyz=15; // xyz là cục bộ cho khối này printf("bien xyz cua khoi nay : xyz= %f\n", xyz) ; } }

Ví dụ biến toàn cục và cục bộ #include <stdio.h> int x = 1, y = 2, a=20; void demo(void); void main() { printf("Truoc khi goi ham demo x=%d, y=%d và a=%d",x,y,a); demo(); printf("\nSau khi goi ham demo x=%d, y=%d và a=%d",x,y,a); } void demo(void) { /* Khai báo và khởi động giá trị cho 2 biến cục bộ */ int x = 88, y = 99; a=a+5; /* Hiển thị kết quả */ printf("\nTrong hàm demo x=%d, y=%d và a=%d.", x, y,a);

Ví dụ biến toàn cục và cục bộ #include <stdio.h> int x = 1, y = 2, a=20; void demo(void);

Truoc khi goi ham demo x =1, y =2 và a = 20

void main() { Trong hàm printf("Truoc khi goi ham demo x=%d, y=%d và a=%d",x,y,a); demo x = 88, y = 99 và demo(); a=25 printf("\nSau khi goi ham demo x=%d, y=%d và a=%d",x,y,a); } void demo(void) { /* Khai báo và khởi động giá trị cho 2 biến cục bộ */ int x = 88, y = 99; a=a+5; /* Hiển thị kết quả */ printf("\nTrong hàm demo x=%d, y=%d và a=%d.", x, y,a);

Sau khi goi ham demo x=1, y = 2 và a=25

Xét ví dụ giải phương trình bậc 2 void gptb1(int a1, int b1); void gptb2(int a, int b, int c) { if(a==0) { if(b==0) if(c==0) printf("phuong trinh vo so nghiem") ; else printf("phuong trinh vo nghiem"); else gptb1(b, c); return; } float delta=b*b-4*a*c; if(delta<0) printf("phuong trinh vo nghiem"); else if(delta==0) printf("phuong trinh co nghiem kep x=%.2f", -(float)b/2/a); else printf(“PT co nghiem x1=%.2f \t x2=%.2f", (-b+sqrt(delta))/2/a, (-b-sqrt(delta))/(2*a)); }

2.4 Toán tử phạm vi • Khi một biến cục bộ có cùng tên với biến toàn cục làm cho biến toàn cục không thể truy xuất được tới phạm vi cục bộ. • Ví dụ: int e; void Error (int e) { //... } biến toàn cục e là không thể truy xuất được bên trong hàm Error. => Vấn đề này được giải quyết nhờ vào sử dụng toán tử phạm vi đơn hạng (::) :

#include <stdio.h> #include int a=10; void In (int a) { printf("toan cuc: %d \n", ::a); printf("cuc bo: %d \n", a); } int main() { In(5); getch(); return 1; }

3. Biến thanh ghi - register variable • Các biến biểu thị các vị trí bộ nhớ nơi mà giá trị của biến được lưu trữ tới. Khi mã chương trình tham khảo tới một biến (ví dụ, trong một biểu thức), trình biên dịch phát ra các mã máy truy xuất tới vị trí bộ nhớ được biểu thị bởi các biến. • Đối với các biến dùng thường xuyên (ví dụ như các biến vòng lặp), hiệu xuất chương trình có thể thu được bằng cách giữ biến trong một thanh ghi, bằng cách này có thể tránh được truy xuất bộ nhớ tới biến đó. • Bộ lưu trữ thanh ghi có thể được sử dụng để chỉ định cho trình biên dịch biến có thể được lưu trữ trong một thanh ghi nếu có thể.

Khai báo biến thanh ghi • Dùng từ khóa register để khai báo các biến cục bộ kiểu int hoặc char như sau: register int i,j; register char ch • Ví dụ: for (register int i = 0; i < n; ++i) sum += i; • Mỗi vòng lặp i được sử dụng ba lần: một lần khi nó được so sánh với n, một lần khi nó được cộng vào sum, và một lần khi nó được tăng. • Giữ biến i trong thanh ghi trong suốt vòng lặp for là nhằm tăng tốc độ thực hiện của vòng lặp .

Chú ý: • Bất kỳ máy tính nào cũng có một số hữu hạn các thanh ghi, nên biến thanh ghi được lưu trữ ở các thanh ghi nếu có thể và nhưng trong trường hợp tất cả các thanh ghi đang được sử dụng, thì biến thanh ghi được lưu trữ vào ngăn xếp như biến cục bộ.

4.Biến tĩnh – static variable • Biến tĩnh cục bộ: khác với các biến cục bộ sẽ bị hủy bỏ khi thoát khỏi hàm, biến static sẽ không mất giá trị của nó khi thoát khỏi hàm và sẽ giữ nguyên giá trị đó khi hàm được gọi lại lần nữa. • Biến tĩnh toàn cục tương đương với biến toàn cục • Khai báo một biến là static bằng cách dùng từ khoá STATIC đặt trước tên biến: Cú pháp: <static> ;

Biến static (tt) • Biến tĩnh cục bộ được lưu trữ trong vùng cấp phát tĩnh, nó tồn tại trong suốt thời gian chương trình hoạt động • Biến tĩnh cục bộ được khởi đầu một lần khi dịch theo giá trị ghi trong khai báo: • static int sothutu=1; • nếu không có giá trị khởi đầu thì giá trị mặc định của biến tĩnh bằng 0 • Biến tĩnh cục bộ chỉ có giá trị trong giới hạn hàm mà nó khai báo. Tuy nhiên giá trị vẫn được giữ khi ra khỏi hàm và giá trị này có thể sử dụng mỗi khi hàm được thực hiện trở lại.

Ví dụ #include <stdio.h> #include void keep_track() { static int count = 0; count++; printf("count= %d\n", count); } int main() { keep_track(); keep_track(); keep_track(); getch(); return 1; }

Related Documents

Chuong 2 - Luu Tru Du Lieu
November 2019 7
Luu Tru
October 2019 12
Luu Tru
November 2019 12
Luu Tru File Tren Internet
November 2019 9
Du Tru Chong Tham
November 2019 7