Bài 6: Biến Static, Biến Extern, Biến Register và Biến Volatile

Trong lập trình C, có một số loại biến đặc biệt gồm Biến Static, Biến Extern, Biến Register và Biến Volatile. Những loại biến này là kiến thức nâng cao và sẽ giúp chúng ta sử dụng biến một cách linh hoạt và hiệu quả trong các chương trình C. Hãy cùng tìm hiểu về cú pháp và cách sử dụng của từng loại biến này.

Biến Static

Biến Static, hay còn gọi là biến tĩnh, được khai báo bên trong một khối lệnh và có khả năng lưu giữ giá trị của nó cho dù chương trình đã chạy ra khỏi khối lệnh đó. Khi một biến cục bộ được khai báo với từ khóa static, biến đó sẽ chỉ được khởi tạo một lần duy nhất và tồn tại suốt thời gian chạy chương trình. Thậm chí khi kết thúc hàm, giá trị của biến static vẫn không bị mất đi.

Tuy nhiên, khác với biến toàn cục có thể gọi trong tất cả mọi nơi trong chương trình, biến cục bộ static chỉ có thể được gọi trong nội bộ hàm khởi tạo ra nó. Mỗi lần hàm được gọi, giá trị của biến chính bằng giá trị tại lần gần nhất hàm được gọi.

Ví dụ, khi không sử dụng static, ta có:

#include 

void incrementAndPrint() {
    int value = 1; // biến cục bộ bình thường
    ++value;
    printf("Giá trị của biến: %d n", value);
}

int main() {
    incrementAndPrint();
    incrementAndPrint();
    incrementAndPrint();
    return 0;
}

Kết quả:

Giá trị của biến: 2
Giá trị của biến: 2
Giá trị của biến: 2

Tuy nhiên, nếu sử dụng static:

#include 

void incrementAndPrint() {
    static int value = 1; // biến cục bộ static
    ++value;
    printf("Giá trị của biến: %d n", value);
}

int main() {
    incrementAndPrint();
    incrementAndPrint();
    incrementAndPrint();
    return 0;
}

Kết quả:

Giá trị của biến: 2
Giá trị của biến: 3
Giá trị của biến: 4

Biến Extern

Trong C, từ khóa extern được sử dụng để khai báo một biến là một tham chiếu đến một biến hoặc một hàm đã được định nghĩa bên ngoài. Từ khóa extern chỉ khai báo biến, không cấp phát bộ nhớ cho biến đó.

Trong C, một chương trình lớn có thể được chia thành các module nhỏ hơn, và mỗi module này có thể được biên dịch và liên kết riêng lẻ. Khi liên kết các module lại với nhau, thông tin về các biến toàn cục được yêu cầu. Một biến toàn cục chỉ có thể được khai báo một lần. Nếu hai biến toàn cục có cùng tên được khai báo trong cùng một tập tin, có thể hiển thị một thông báo lỗi “duplicate variable name” hoặc trình biên dịch C có thể chọn một biến khác.

Để sử dụng biến toàn cục trong một tập tin khác, ta phải khai báo lại biến đó và thêm từ khóa extern phía trước, để thông báo rằng biến này đã được khai báo trong một tập tin khác.

Ví dụ, trong File 1, ta khai báo:

int GlobalVariable = 0; // khai báo biến toàn cục
void SomeFunction(); // khai báo hàm
int main() {
    GlobalVariable = 1;
    SomeFunction();
    return 0;
}

Trong File 2, ta extern biến đó để sử dụng:

extern int GlobalVariable; // khai báo lại biến toàn cục
void SomeFunction(); // khai báo hàm
int main() {
    GlobalVariable = 1;
    SomeFunction();
    return 0;
}

Biến Register

Từ khóa register được sử dụng để tăng hiệu năng của chương trình. Khi khai báo biến với từ khóa register, nghĩa là ta yêu cầu trình biên dịch dành một vùng nhớ đặc biệt trong thanh ghi (register) để lưu trữ biến đó. Việc này giảm bớt các bước nạp và lưu trữ dữ liệu từ bộ nhớ chính vào thanh ghi, làm tăng hiệu năng của chương trình.

Ví dụ:

#include 

void incrementAndPrint() {
    register int value = 1; // khai báo biến register
    ++value;
    printf("Giá trị của biến: %d n", value);
}

int main() {
    incrementAndPrint();
    incrementAndPrint();
    incrementAndPrint();
    return 0;
}

Kết quả:

Giá trị của biến: 2
Giá trị của biến: 2
Giá trị của biến: 2

Biến Volatile

Từ khóa volatile được sử dụng để khai báo biến có thể thay đổi bất kỳ lúc nào. Khi một biến được khai báo dưới dạng biến volatile, ta thông báo cho trình biên dịch rằng biến này có thể bị thay đổi ngẫu nhiên mà không được thông báo trước. Việc sử dụng từ khóa volatile là cần thiết để tránh những lỗi sai khó phát hiện do tính tối ưu hóa của trình biên dịch.

Cú pháp:

volatile  ;

Biến volatile thường được sử dụng trong lập trình nhúng, nơi mà các tác vụ như ngắt có thể ảnh hưởng đến giá trị của biến. Trong lập trình C cơ bản, ta hiếm khi gặp trường hợp sử dụng biến volatile.

Kết

Sau khi học bài viết này, hy vọng bạn đã hiểu và biết cách sử dụng các loại biến như Biến Static, Biến Extern, Biến Register và Biến Volatile. Tiếp tục đón đọc bài tiếp theo trong seri “Học lập trình C từ A tới Z”.

Nếu bài viết có ích, hãy chia sẻ và tham gia nhóm “Nghiện Lập Trình” để giao lưu và học hỏi thêm nhiều kiến thức mới.

FEATURED TOPIC