Các lớp lưu trữ trong C: Auto, Extern, Static, Register (Ví dụ)

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 bên ngoài đượ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 của biến hoặc hàm đã được xác định 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,

  1. Chọn ứng dụng Console
  2. Nhấp vào Đi

Lớp lưu trữ bên ngoài trong C

Bước 2) Chọn C và nhấp vào Tiếp theo

Lớp lưu trữ bên ngoài trong C

Bước 3) Nhấp vào Tiếp theo

Lớp lưu trữ bên ngoài trong C

Bước 4) Nhập thông tin chi tiết và nhấp vào Tiếp theo

Lớp lưu trữ bên ngoài trong C

Bước 5) Nhấp vào Kết thúc

Lớp lưu trữ bên ngoài trong C

Bước 6) Đặt mã chính như trong chương trình trước vào tệp main.c và lưu nó

Lớp lưu trữ bên ngoài trong C

Bước 7) Tạo một tệp C mới [File -> new -> Empty File, lưu (dưới dạng 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.

Lớp lưu trữ bên ngoài trong C

Bước 8) Đặt và lưu mã C của tệp original.c được hiển thị trong ví dụ trước mà không cần hàm main().

Lớp lưu trữ bên ngoài trong C

Bước 9) Xây dựng và chạy dự án của bạn. Kết quả được thể hiện trong hình tiếp theo

Lớp lưu trữ bên ngoài trong C

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à biến toàn cục hiển thị chỉ vào tập tin mà nó đượ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 ghi danh được sử dụng để khai báo một lớp lưu trữ đăng ký. Các biến được khai báo bằng lớp lưu trữ thanh ghi có thời gian tồn tạ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 Kho lưu trữ 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

Tổng kết

Trong hướng dẫn này, chúng ta đã thảo luận về các lớp lưu trữ trong C, tóm lại:

  • Lớp lưu trữ trong C được sử dụng để thể hiện thông tin bổ sung về một biến.
  • Lớp lưu trữ đại diện cho phạm vi và tuổi thọ của một biến.
  • Nó cũng cho biết ai có thể truy cập một biến và từ đâu?
  • Auto, extern, register, static là bốn lớp lưu trữ khác nhau trong chương trình C.
  • Trình xác định lớp lưu trữ trong ngôn ngữ C được sử dụng để xác định các biến, hàm và tham số.
  • auto được sử dụng cho một biến cục bộ được xác định trong một khối hoặc hàm
  • thanh ghi được sử dụng để lưu trữ biến trong các thanh ghi CPU thay vì vị trí bộ nhớ để truy cập nhanh.
  • Tĩnh được sử dụng cho cả biến toàn cục và biến cục bộ. Mỗi cái đều có trường hợp sử dụng của nó trong một chương trình C.
  • Extern được sử dụng để chia sẻ dữ liệu giữa các tệp dự án C.