Biến toàn cục và biến cục bộ là gì

Trong bài này chúng ta sẽ tìm hiểu khái niệm về biến toàn cục và biến cục bộ trong C++, qua bài này sẽ giúp bạn hiểu rõ phạm vi của hai loại biến này.

Biến toàn cục và biến cục bộ là gì

Biến toàn cục và biến cục bộ là gì

Bài viết này được đăng tại freetuts.net, không được copy dưới mọi hình thức.

Trong C++ cũng như các ngôn ngữ lập trình khác, biến có thể khai báo ở 3 nơi như sau:

  • Biến được khai báo bên trong một hàm hoặc block, ta gọi nó là biến cục bộ (local variable)
  • Biến được sử dụng như là tham số của hàm, ta gọi nó là tham số hình thức (formal parameter)
  • Biến được khai báo ở bên ngoài tất cả các hàm, ta gọi nó là biến toàn cục (global variable)

Trong bài học hôm nay chúng ta sẽ tìm hiểu về biến cục bộ (local variable) và biến toàn cục (global variable). Còn phần tham số hình thức (formal parameter) chúng ta sẽ tìm hiểu trong một bài khác.

1. Biến cục bộ trong C++

Biến cục bộ (Local variable) là biến được khai báo bên trong một hàm hoặc một block. (Tất cả những gì ở giữa dấu "{" và "}" chúng ta gọi là block).

Bài viết này được đăng tại [free tuts .net]

Biến cục bộ chỉ có phạm vi sử dụng bên trong một hàm hoặc một block. Chúng ta không thể truy cập và sử dụng biến cục bộ ở bên ngoài hàm hoặc block.

Ví dụ 1: Chúng ta khai báo biến cục bộ c bên trong 1 hàm, và biến cục bộ d bên trong 1 block.

Ví dụ

#include using namespace std; int Tong(int a, int b) { int c = 0; // c la bien cuc bo c = a + b; { cout << "Gia tri bien c ben trong block: " << c << "\n"; int d = 40; // d la bien cuc bo khai bao ben trong mot block cout << "Gia tri bien d ben trong block: " << d << "\n"; } cout << "Gia tri bien c ben trong ham: " << c << "\n"; return c; } int main () { Tong(1,2); return 0; }

Và kết quả sau khi thực thi đoạn code trên:

Biến toàn cục và biến cục bộ là gì

Ví dụ 2: Chúng ta thử truy cập biến cục bộ bên ngoài một hàm, block

Ví dụ

#include using namespace std; int Tong(int a, int b) { int c = 0; // c la bien cuc bo c = a + b; { cout << "Gia tri bien c ben trong block: " << c << "\n"; int d = 40; // d la bien cuc bo khai bao ben trong mot block cout << "Gia tri bien d ben trong block: " << d << "\n"; } cout << "Gia tri bien d ben trong ham: " << d << "\n"; cout << "Gia tri bien c ben trong ham: " << c << "\n"; return c; } void In() { cout << "Gia tri cua bien c: " << c << "\n"; cout << "Gia tri cua bien d: " << d << "\n"; } int main () { Tong(1,2); In(); return 0; }

Và kết quả sau khi thực thi đoạn code trên:

Biến toàn cục và biến cục bộ là gì

2. Biến toàn cục trong C++

Biến toàn cục (global variable) là biến được khai báo bên ngoài tất cả các hàm. Chúng ta có thể truy cập và sử dụng biến toàn cục ở bất kỳ đâu của chương trình. Thường thì chúng ta nên khai báo biến toàn cục trên đầu của chương trình.

Ví dụ: Chúng ta cùng xem ví dụ đơn giản có sử dụng biến toàn cục như sau:

Ví dụ

#include using namespace std; int g; //g la bien toan cuc int Tong (int a, int b) { { g = 100; cout << "Gia tri cua bien g ben trong block: " << g << "\n"; } g = a + b; cout << "Gia tri cua bien g ben trong ham: " << g << "\n"; } int main () { Tong(10, 11); return 0; }

Và kết quả sau khi thực thi đoạn code trên như sau:

Biến toàn cục và biến cục bộ là gì

3. Giá trị mặc định của biến toàn cục và biến cục bộ trong C++

Khi biến cục bộ được khởi tạo thì nó không được khởi tạo giá trị bởi hệ thống, chúng ta phải tự khởi tạo giá trị cho biến cục bộ.

Khi biến toàn cục được khởi tạo thì nó được hệ thống khởi tạo giá trị một cách tự động. Giá trị khởi tạo cho biến toàn cục bởi hệ thống như sau:

Kiểu dữ liệu Giá trị
int 0
char '\0'
float 0
double 0
pointer NULL

4. Biến toàn cục và biến cục bộ cùng tên.

Giả sử chúng ta có trường hợp biến cục bộ và biến toàn cục cùng tên, bên trong một hàm chúng ta muốn sử dụng biến cùng tên đó, thì giá trị của biến cục bộ hay biến toàn cục được sử dụng, chúng ta cùng tìm hiểu qua ví dụ sau:

Ví dụ

#include using namespace std; int g = 10; //bien toan cuc int main() { int g = 5; //bien cuc bo cout << "Gia tri cua bien g: " << g << "\n"; }

Và kết quả sau thực thi của đoạn code trên:

Biến toàn cục và biến cục bộ là gì

Như vậy nếu biến cục bộ và biến toàn cục cùng tên, thì hàm sẽ lấy giá trị của biến cục bộ. Vậy chúng ta muốn lấy giá trị của biến toàn cục mà trùng tên với biến cục bộ thì như thế nào?

Trong C++ cho phép chúng ta lấy giá trị của biến toàn cục trùng tên với biến cục bộ đó là sử dụng toán tử :: (scope resolution operator). Chúng ta cùng xem ví dụ sau:

Ví dụ

#include using namespace std; int g = 10; //bien toan cuc int main() { int g = 5; //bien cuc bo cout << "Gia tri cua bien g toan cuc: " << ::g << "\n"; cout << "Gia tri cua bien g: " << g << "\n"; }

Và kết quả thực thi đoạn code trên:

Biến toàn cục và biến cục bộ là gì

5. Kết luận

Như vậy chúng ta đã cùng tìm hiểu xong phạm vi biến toàn cục và biến cục bộ trong C++.

Trong bài này chúng ta cần nhớ phạm vi sử dụng của biến toàn cục và biến cục bộ đó là biến cục bộ chỉ có phạm vi sử dụng trong một hàm hoặc một block mà biến đó khai báo, biến toàn cục có phạm vi sử dụng trong một chương trình, bất cứ hàm hoặc block nào điều có thể truy cập biến toàn cục.

Một điều cần lưu ý ở đây là dù là biến toàn cục hay cục bộ thì chúng ta cần phải khai báo nó trước khi sử dụng.

Trong bài tiếp theo chúng ta sẽ tìm hiểu về lớp lưu trữ trong C++. Các bạn nhớ theo dõi nhé.

Các biến được sử dụng trong một chương trình có thể có những phạm vi hoạt động khác nhau, tùy thuộc vào từng loại. Ta có hai loại biến cơ bản như sau:

1. Biến tổng thể (biến toàn cục)

+ Có phạm vi hoạt động trong tất cả các hàm được định nghĩa hoặc khai báo sau nó.

+ Được khai báo ở ngoài tất cả các hàm, kể cả hàm main().

+ Ở mọi vị trí của chương trình biến này đều có thể được sử dụng, được gọi đến.

+ Tất cả các hàm của chương trình đều có quyền sử dụng biến tổng thể này.

+ Biến tổng thể thường được khai báo sau các #include .

+ Ví dụ: Viết chương trình giải phương trình bậc nhất ax + b = 0.

--> Khai báo 2 biến a, b (là 2 hệ số của phương trình) là 2 biến tổng thể.

--> Viết 2 hàm, một hàm dùng để nhập hai hệ số a và b, hàm kia dùng để hiển thị kết quả nghiệm của phương trình ứng với 2 giá trị a và b.

--> Chương trình được viết như sau:

#include<iostream> using namespace std; float a, b; //Khai báo 2 biến tổng thể a và b //Sau khi hàm này được gọi xong a và b sẽ nhận các giá trị nhập vào từ bàn phím void nhapHeSo() { cout<<"Nhap he so a: "; cin>>a; cout<<"Nhap he so b: "; cin>>b; } void xacDinhNghiem() { if(a==0){ if(b==0){ cout<<"Phuong trinh co vo so nghiem!"; }else{ cout<<"Phuong trinh vo nghiem!"; } }else{ cout<<"Phuong trinh co nghiem x = "<<-b/a; } } main() { nhapHeSo(); xacDinhNghiem(); return 0; }

Kết quả:

Biến toàn cục và biến cục bộ là gì
 

Biến toàn cục và biến cục bộ là gì

Biến toàn cục và biến cục bộ là gì

2. Biến cục bộ (địa phương)

+ Được khai báo bên trong các hàm.

+ Đối số của hàm cũng là biến cục bộ của hàm. Vì vậy, biến cục bộ và đối số của một hàm không được trùng tên nhau.

+ Có phạm vi hoạt động chỉ trong hàm khai báo chúng.

+ Các hàm khác không có khả năng sử dụng chúng (kể cả hàm main()).

+ Sau khi hàm chứa nó thực hiện xong, giá trị của các biến này sẽ bị hủy đi.

Tính giai thừa : S = n! (=1*2*3*4*…*n). Chương trình được viết như sau:

#include<iostream> using namespace std; float giaiThua(int n) { //n: tham số có phạm vi hoạt động chỉ trong hàm giaiThua int i; //i: biến cục bộ chỉ hoạt động được trong hàm giaiThua float KQ=1.0; //KQ: cũng là biến cục bộ của giaiThua for(i=1; i<=n ; i++) KQ = KQ * i; return KQ; } main() { int n; //n là biến cục bộ chỉ hoạt động được trong hàm main() cout<<"Nhap n: "; cin>>n; cout<<"Giai thua cua "<" bang "<return 0; }

Viết lại chương trình giải phương trình bậc nhất, trong đó các hệ số a, b của phương trình phải là các biến cục bộ trong hàm (nghĩa là không được khai báo a, b là các biến tổng thể).

Sau đây là đoạn code demo chương trình:

#include<iostream> using namespace std; //Sau khi hàm này được gọi xong a và b ở hàm main() sẽ nhận các giá trị nhập vào từ bàn phím void nhapHeSo(float *pa, float *pb) { cout<<"Nhap he so a: "; cin>>*pa; cout<<"Nhap he so b: "; cin>>*pb; } void xacDinhNghiem(float a, float b) { if(a==0){ if(b==0){ cout<<"Phuong trinh co vo so nghiem!"; }else{ cout<<"Phuong trinh vo nghiem!"; } }else{ cout<<"Phuong trinh co nghiem x = "<<-b/a; } } main() { float a, b, *pa, *pb; //Khai báo 2 hệ số a, b là các biến cục bộ của hàm main() pa=&a; //*pa và *pb là 2 con trỏ của 2 biến a và b nhằm mục đích pb=&b; //truyền đối số cho các hàm theo tham chiếu nhapHeSo(pa, pb); xacDinhNghiem(a,b); return 0; }