Tìm hiểu về phạm vi và thời gian tồn tại của các biến cục bộ và toàn cục

Lớp lưu trữ C

Trong hướng dẫn này, bạn sẽ tìm hiểu về phạm vi và thời gian tồn tại của các biến cục bộ và toàn cục. Ngoài ra, bạn sẽ tìm hiểu về các biến tĩnh và đăng ký.

Mọi biến trong lập trình C đều có hai thuộc tính: kiểu và lớp lưu trữ.

Kiểu đề cập đến kiểu dữ liệu của một biến. Và, lớp lưu trữ xác định phạm vi, khả năng hiển thị và thời gian tồn tại của một biến.

Có 4 loại lớp lưu trữ:

  1. tự động
  2. bên ngoài
  3. tĩnh
  4. Đăng ký

Biến cục bộ

Các biến được khai báo bên trong một khối là biến tự động hoặc biến cục bộ. Các biến cục bộ chỉ tồn tại bên trong khối mà nó được khai báo.

Hãy lấy một ví dụ.

#include <stdio.h>

int main(void) {
  
  for (int i = 0; i < 5; ++i) {
     printf("C programming");
  }
  
 // Error: i is not declared at this point
  printf("%d", i);  
  return 0;
}

Khi bạn chạy chương trình trên, bạn sẽ gặp lỗi số nhận dạng không được khai báo i. Đó là vì tôi được khai báo bên trong forkhối vòng lặp. Bên ngoài khối, nó không được khai báo.

Hãy lấy một ví dụ khác.


int main() {
    int n1; // n1 is a local variable to main()
}

void func() {
   int n2;  // n2 is a local variable to func()
}

Trong ví dụ trên, n1 là cục bộ cho main()và n2 là cục bộ cho func().

Điều này có nghĩa là bạn không thể truy cập vào  biến n1 bên trong  func()vì nó chỉ tồn tại bên trong main(). Tương tự, bạn không thể truy cập   biến n2 bên trong main()vì nó chỉ tồn tại bên trong func().


Biến toàn cầu

Các biến được khai báo bên ngoài tất cả các hàm được gọi là biến bên ngoài hoặc biến toàn cục. Chúng có thể truy cập từ bất kỳ chức năng nào bên trong chương trình.

Ví dụ 1: Biến toàn cục

#include <stdio.h>
void display();

int n = 5;  // global variable

int main()
{
    ++n;     
    display();
    return 0;
}

void display()
{
    ++n;   
    printf("n = %d", n);
}

Đầu ra

n = 7

Giả sử, một biến toàn cục được khai báo trong file1. Nếu bạn cố gắng sử dụng biến đó trong một tệp khác file2, trình biên dịch sẽ phàn nàn. Để giải quyết vấn đề này, từ khóa externđược sử dụng file2để chỉ ra rằng biến bên ngoài được khai báo trong một tệp khác.

Đăng ký biến

Các registertừ khóa được sử dụng để khai báo các biến đăng ký. Các biến thanh ghi được cho là nhanh hơn các biến cục bộ.

Tuy nhiên, các trình biên dịch hiện đại rất giỏi trong việc tối ưu hóa mã, và hiếm có cơ hội là việc sử dụng các biến đăng ký sẽ làm cho chương trình của bạn nhanh hơn.

Trừ khi bạn đang làm việc trên các hệ thống nhúng, nơi bạn biết cách tối ưu hóa mã cho ứng dụng nhất định, thì không có việc sử dụng các biến đăng ký.

Biến tĩnh

Một biến tĩnh được khai báo bằng cách sử dụng statictừ khóa. Ví dụ;

static int i;

Giá trị của một biến tĩnh vẫn tồn tại cho đến khi kết thúc chương trình.

Ví dụ 2: Biến tĩnh

#include <stdio.h>
void display();

int main()
{
    display();
    display();
}
void display()
{
    static int c = 1;
    c += 5;
    printf("%d  ",c);
}

Đầu ra

6 11

Trong lần gọi hàm đầu tiên, giá trị của c được khởi tạo bằng 1. Giá trị của nó được tăng lên 5. Bây giờ, giá trị của c là 6, được in trên màn hình.

Trong lần gọi hàm thứ hai, c không được khởi tạo lại thành 1. Đó là bởi vì c là một biến tĩnh. Giá trị c tăng lên 5. Bây giờ, giá trị của nó sẽ là 11, được in trên màn hình.









Gõ tìm kiếm nhanh...