Lớp lưu trữ (Storage Class) trong C – biến local global static

Lớp lưu trữ trong C [Storage Class]

Mỗi một biến trong C đều bao gồm 2 thuộc tính: kiểu và lớp lưu trữ.

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

Có 4 loại lớp lưu trữ:
1. automatic
2. external
3. static
4. register


Biến cục bộ (local)

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

Ví dụ

#include <stdio.h>

int main(void) {

  for (int i = 0; i < 5; ++i) {
     printf("C programming");
  }

 // Lỗi: i chưa được khai báo ở đây
  printf("%d", i);  
  return 0;
}

Nếu chạy chương trình chúng ta sẽ gặp lỗi undeclared identifier i. Bởi i chỉ tồn tại bên trong block của lệnh for. Ở bên ngoài block, i chưa được khai báo.

Một ví dụ khác:

int main() {
    int n1; // n1 là biến cục bộ của hàm main()
}

void func() {
   int n2;  // n2 là biến cục bộ của hàm func()
}

n1 là biến cục bộ của main(), n2 là biến cục bộ của func().

Vậy nên, chúng ta không thể sử dụng n1 bên trong func() hay n2 bên trong main().


Biến toàn cục (Global)

Biến toàn cục được khai báo bên ngoài tất cả các hàm. Chúng có thể được sử dụng ở bất kỳ đâu trong chương trình.

Ví dụ 1

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

int n = 5;  // global variable

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

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

Kết quả

n = 7

Giả sử biến toàn phần được khai báo trong tập tin 1, nếu bạn muốn sử dụng biến này trong tập tin 2 thì chương trình sẽ không tìm được. Để có thể truy cập được biến trong tập tin 1, chúng ta cần dùng từ khóa extern để chỉ ra rằng biến này được nhập từ một tập tin bên ngoài.


Biến register

Từ khóa register được dùng khi khai báo một biến đăng ký. Thông thường các biến đăng ký sẽ nhanh hơn biến cục bộ.

Tuy nhiên, các compilers hiện đại tối ưu rất tốt thuật toán, vậy nên sẽ khó có cơ hội các biến register sẽ khiến chương trình nhanh hơn.

Biến tĩnh (static)

static int i;

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

Ví dụ 2

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

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

Kết quả

6 11

Trong lần gọi display() đầu tiên, biến c được khởi tạo với giá trị là 1. Sau đó nó được cộng thêm 5, vậy nên sẽ hiển thị ra màn hình là 6.

Trong lần gọi thứ 2, biến c không được khởi tạo lại vì nó là biến tĩnh (static), lúc này c có giá trị là 6 và chương trình sẽ hiển thị 6+5=11.

Series Navigation<< Hàm đệ quy trong CArray trong C >>

Trả lời

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *