Các lớp lưu trữ trong C: Auto, Extern, Static, Register (Ví dụ)
⚡ Tóm tắt thông minh
Các lớp lưu trữ trong C định nghĩa phạm vi, thời gian tồn tại, giá trị mặc định và vị trí bộ nhớ của mỗi biến, sử dụng bốn từ khóa chỉ định — auto, register, static và extern — để kiểm soát nơi dữ liệu được lưu trữ và thời gian tồn tại của nó trong quá trình thực thi.

Lớp lưu trữ trong C là gì?
Lớp lưu trữ biểu diễn khả năng hiển thị và vị trí của một biến. Nó cho biết chúng ta có thể truy cập một biến từ phần nào của mã. Lớp lưu trữ trong C được sử dụng để mô tả những điều sau:
- Phạm vi biến đổi.
- Vị trí nơi biến sẽ được lưu trữ.
- Giá trị khởi tạo của một biến.
- Một đời của một biến.
- Ai có thể truy cập một biến?
Do đó, lớp lưu trữ được sử dụng để thể hiện thông tin về một biến.
LƯU Ý: Một biến không chỉ liên quan đến một loại dữ liệu, giá trị của nó nhưng cũng là một lớp lưu trữ.
Các loại lớp lưu trữ trong C là gì?
Có tổng cộng bốn loại lớp lưu trữ tiêu chuẩn. Bảng dưới đây thể hiện các lớp lưu trữ trong C.
| Lớp lưu trữ | Mục đích |
| tự động | Đây là lớp lưu trữ mặc định. |
| bên ngoài | Nó là một biến toàn cục. |
| tĩnh | Nó là một biến cục bộ có khả năng trả về một giá trị ngay cả khi điều khiển được chuyển sang lệnh gọi hàm. |
| ghi danh | Nó là một biến được lưu trữ bên trong Sổ đăng ký. |
Lớp lưu trữ tự động trong C
Các biến được xác định bằng lớp lưu trữ tự động được gọi là biến cục bộ. Auto là viết tắt của lớp lưu trữ tự động. Theo mặc định, một biến nằm trong lớp lưu trữ tự động nếu nó không được chỉ định rõ ràng.
Phạm vi của biến tự động chỉ bị giới hạn trong một khối cụ thể. Khi điều khiển đi ra khỏi khối, quyền truy cập sẽ bị hủy. Điều này có nghĩa là chỉ khối trong đó biến tự động được khai báo mới có thể truy cập vào nó.
Từ khóa auto được sử dụng để định nghĩa lớp lưu trữ auto. Theo mặc định, biến tự động chứa giá trị rác.
Example, auto int age;
Chương trình dưới đây định nghĩa một hàm có hai biến cục bộ
int add(void) { int a=13; auto int b=48; return a+b;}
Chúng tôi lấy một chương trình khác hiển thị “mức độ hiển thị” cấp phạm vi cho các biến tự động trong mỗi mã khối độc lập với nhau:
#include <stdio.h> int main( ) { auto int j = 1; { auto int j= 2; { auto int j = 3; printf ( " %d ", j); } printf ( "\t %d ",j); } printf( "%d\n", j);}
Đầu ra:
3 2 1
Lớp lưu trữ bên ngoài trong C
Extern là viết tắt của lớp lưu trữ bên ngoài. Lớp lưu trữ bên ngoài được sử dụng khi chúng ta có các hàm hoặc biến toàn cục được chia sẻ giữa hai hoặc nhiều tệp.
Từ khóa `extern` được sử dụng để khai báo một biến hoặc hàm toàn cục trong một tệp khác nhằm cung cấp tham chiếu đến biến hoặc hàm đã được định nghĩa trong tệp gốc.
Các biến được xác định bằng từ khóa extern được gọi là biến toàn cục. Các biến này có thể truy cập được trong suốt chương trình. Lưu ý rằng biến bên ngoài không thể được khởi tạo vì nó đã được xác định trong tệp gốc.
Example, extern void display();
Tệp đầu tiên: main.c
#include <stdio.h> extern i; main() { printf("value of the external integer is = %d\n", i); return 0;}
Tệp thứ hai: original.c
#include <stdio.h>
i=48;
Kết quả:
value of the external integer is = 48
Để biên dịch và chạy đoạn mã trên, hãy làm theo các bước dưới đây
Bước 1) Tạo dự án mới,
- Chọn ứng dụng Console
- Nhấp vào Đi
Bước 2) Chọn C và nhấn Tiếp theo
Bước 3) Nhấp vào Tiếp theo
Bước 4) Nhập thông tin chi tiết và nhấn Tiếp theo
Bước 5) Nhấp vào Hoàn tất
Bước 6) Đặt đoạn mã chính như trong chương trình trước vào tệp main.c và lưu lại.
Bước 7) Tạo một tệp C mới [Tệp -> Mới -> Tệp trống], lưu lại (với tên original.c) và thêm nó vào dự án hiện tại bằng cách nhấp vào “OK” trong hộp thoại.
Bước 8) Sao chép và lưu mã C của tệp original.c được hiển thị trong ví dụ trước mà không có hàm main().
Bước 9) Xây dựng và chạy dự án của bạn. Kết quả được hiển thị trong hình tiếp theo.
Lớp lưu trữ tĩnh trong C
Các biến tĩnh được sử dụng trong hàm/tệp dưới dạng biến tĩnh cục bộ. Chúng cũng có thể được sử dụng như một biến toàn cục
- Biến cục bộ tĩnh là biến cục bộ giữ lại và lưu trữ giá trị của nó giữa các lệnh gọi hàm hoặc khối và chỉ hiển thị đối với hàm hoặc khối mà nó được xác định.
- Biến toàn cục tĩnh là các biến toàn cục chỉ hiển thị trong tệp mà chúng được khai báo.
Example: static int count = 10;
Hãy nhớ rằng biến tĩnh có giá trị ban đầu mặc định là 0 và chỉ được khởi tạo một lần trong vòng đời của nó.
#include <stdio.h> /* function declaration */ void next(void); static int counter = 7; /* global variable */ main() { while(counter<10) { next(); counter++; } return 0;} void next( void ) { /* function definition */ static int iteration = 13; /* local static variable */ iteration ++; printf("iteration=%d and counter= %d\n", iteration, counter);}
Kết quả:
iteration=14 and counter= 7 iteration=15 and counter= 8 iteration=16 and counter= 9
Các biến toàn cục có thể truy cập được trong toàn bộ tệp trong khi các biến tĩnh chỉ có thể truy cập được đối với một phần cụ thể của mã.
Tuổi thọ của biến tĩnh nằm trong toàn bộ mã chương trình. Một biến được khai báo hoặc khởi tạo bằng từ khóa tĩnh luôn chứa giá trị 0 làm giá trị mặc định.
Đăng ký lớp lưu trữ trong C
Bạn có thể sử dụng lớp lưu trữ thanh ghi khi bạn muốn lưu trữ các biến cục bộ trong các hàm hoặc khối trong thanh ghi CPU thay vì RAM để có thể truy cập nhanh vào các biến này. Ví dụ: “bộ đếm” là một ứng cử viên tốt để được lưu trữ trong sổ đăng ký.
Example: register int age;
Từ khóa `register` được sử dụng để khai báo một lớp lưu trữ thanh ghi. Các biến được khai báo bằng lớp lưu trữ thanh ghi có vòng đời trong suốt chương trình.
Nó tương tự như lớp lưu trữ tự động. Biến được giới hạn trong khối cụ thể. Sự khác biệt duy nhất là các biến được khai báo bằng lớp lưu trữ thanh ghi được lưu trữ bên trong các thanh ghi CPU thay vì bộ nhớ. Thanh ghi có khả năng truy cập nhanh hơn bộ nhớ chính.
Các biến được khai báo bằng lớp lưu trữ thanh ghi không có giá trị mặc định. Các biến này thường được khai báo ở đầu chương trình.
#include <stdio.h> /* function declaration */ main() { {register int weight; int *ptr=&weight ;/*it produces an error when the compilation occurs ,we cannot get a memory location when dealing with CPU register*/} }
Đầu ra:
error: address of register variable 'weight' requested
Bảng tiếp theo tóm tắt các tính năng chính của từng lớp lưu trữ thường được sử dụng trong lập trình C
| Lớp lưu trữ | Tờ khai | Bảo quản | Giá trị ban đầu mặc định | Phạm vi | Lifetime |
| tự động | Bên trong một hàm/khối | Bộ nhớ | Không thể đoán trước | Trong chức năng/khối | Trong chức năng/khối |
| ghi danh | Bên trong một hàm/khối | Thanh ghi CPU | Rác | Trong chức năng/khối | Trong chức năng/khối |
| bên ngoài | Ngoài mọi chức năng | Bộ nhớ | nhận được gì | Toàn bộ tệp và các tệp khác trong đó biến được khai báo là extern | thời gian chạy chương trình |
| Tĩnh (cục bộ) | Bên trong một hàm/khối | Bộ nhớ | nhận được gì | Trong chức năng/khối | thời gian chạy chương trình |
| Tĩnh (toàn cầu) | Ngoài mọi chức năng | Bộ nhớ | nhận được gì | Toàn cầu | thời gian chạy chương trình |








