C'deki Depolama Sınıfları: Otomatik, Harici, Statik, Kayıt (Örnekler)

⚡ Akıllı Özet

C dilindeki depolama sınıfları, her değişkenin kapsamını, ömrünü, varsayılan değerini ve bellek konumunu tanımlar; bu tanımlamalar için auto, register, static ve extern olmak üzere dört belirleyici kullanılır ve bu belirleyiciler verilerin nerede yaşayacağını ve yürütme sırasında ne kadar süreyle varlığını sürdüreceğini kontrol eder.

  • 🗂️ Dört depolama sınıfı: C dili, her değişkeni tanımlamak için auto, register, static ve extern belirleyicilerini sunar.
  • ???? Oto: Varsayılan yerel sınıf, kendi bloğuyla sınırlıdır ve atanana kadar rastgele bir değer tutar.
  • Kayıt olmak: Sayaçlar gibi sık kullanılan değişkenlere daha hızlı erişim için CPU kayıt defterinde yer açılmasını talep eder.
  • ♻️ Statik: Fonksiyon çağrıları arasında bir değişkenin değerini korur ve ilk kullanımda varsayılan olarak sıfır değerini alır.
  • 🌐 Harici: Bir global değişkeni veya fonksiyonu yeniden tanımlamadan birden fazla kaynak dosyasında paylaşır.
  • 📊 Kapsam ve kullanım ömrü: Her sınıf, bir değişkenin nerede görünür olacağını ve ne kadar süreyle geçerli olacağını belirler.

C'deki Depolama Sınıfları

C'de Depolama Sınıfı Nedir?

Bir depolama sınıfı, bir değişkenin görünürlüğünü ve konumunu temsil eder. Bir değişkene kodun hangi kısmından erişebileceğimizi söyler. C'de bir depolama sınıfı, aşağıdaki şeyleri tanımlamak için kullanılır:

  • Değişken kapsamı.
  • Değişkenin depolanacağı konum.
  • Bir değişkenin başlatılmış değeri.
  • Bir değişkenin ömrü.
  • Bir değişkene kimler erişebilir?

Bu nedenle bir değişken hakkındaki bilgileri temsil etmek için bir depolama sınıfı kullanılır.

NOT: Bir değişken yalnızca bir ile ilişkilendirilmez. veri tipi, değeri ama aynı zamanda bir depolama sınıfı.

C'deki Depolama Sınıfı Türleri Nelerdir?

Toplam dört tür standart depolama sınıfı vardır. Aşağıdaki tablo C'deki depolama sınıflarını göstermektedir.

Depolama sınıfı Amaç
Oto Varsayılan bir depolama sınıfıdır.
stajyer doktor Global bir değişkendir.
statik Kontrol fonksiyon çağrısına aktarıldığında bile değer döndürebilen yerel bir değişkendir.
kayıt olmak Bir Register'ın içinde saklanan bir değişkendir.

C'de Otomatik Depolama Sınıfı

Otomatik depolama sınıfı kullanılarak tanımlanan değişkenlere yerel değişkenler adı verilir. Otomatik, otomatik depolama sınıfı anlamına gelir. Bir değişken, açıkça belirtilmediği takdirde varsayılan olarak otomatik depolama sınıfındadır.

Bir otomatik değişkenin kapsamı yalnızca belirli blokla sınırlıdır. Kontrol bloğun dışına çıktığında erişim yok edilir. Bu, yalnızca otomatik değişkenin bildirildiği bloğun ona erişebileceği anlamına gelir.

Bir otomatik depolama sınıfını tanımlamak için auto anahtar sözcüğü kullanılır. Varsayılan olarak, bir otomatik değişken bir çöp değeri içerir.

Example, auto int age;

Aşağıdaki program iki yerel değişkene sahip bir fonksiyonu tanımlar.

int add(void) {
   int a=13;
   auto int b=48;
return a+b;}

Birbirinden bağımsız olan her blok kodundaki otomatik değişkenler için kapsam seviyesi “görünürlük seviyesini” gösteren başka bir program alıyoruz:

#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);}

Çıktı:

 3 2 1

C'de Harici Depolama Sınıfı

Extern, harici depolama sınıfı anlamına gelir. Extern depolama sınıfı, iki veya daha fazla dosya arasında paylaşılan global işlevlere veya değişkenlere sahip olduğumuzda kullanılır.

`extern` anahtar kelimesi, başka bir dosyada global bir değişken veya fonksiyon bildirmek için kullanılır; bu sayede orijinal dosyada önceden tanımlanmış olan değişken veya fonksiyona referans sağlanır.

Bir extern anahtar sözcüğü kullanılarak tanımlanan değişkenlere global değişkenler adı verilir. Bu değişkenlere program boyunca erişilebilir. Harici değişkenin başlatılamayacağına, orijinal dosyada zaten tanımlandığına dikkat edin.

Example, extern void display();

İlk Dosya: main.c

#include <stdio.h>
extern i;
main() {
   printf("value of the external integer is = %d\n", i);
   return 0;}

İkinci Dosya: orijinal.c

#include <stdio.h>
i=48;

Sonuç:

 value of the external integer is = 48

Yukarıdaki kodu derlemek ve çalıştırmak için aşağıdaki adımları izleyin.

Adım 1) Yeni bir proje oluşturun,

  • Konsol Uygulamasını Seçin
  • Git'i tıklayın

Yeni proje oluştur Code Blokları

Adım 2) C'yi seçin ve İleri'ye tıklayın.

C dilini seçin

Adım 3) İleri'ye tıklayın

İleri'yi tıklayın

Adım 4) Bilgileri girin ve İleri'ye tıklayın.

Proje detaylarını girin

Adım 5) Bitir'e tıklayın.

Son'u tıklayın

Adım 6) Önceki programda gösterildiği gibi ana kodu main.c dosyasına yazın ve kaydedin.

main.c dosyasına kod ekleyin.

Adım 7) Yeni bir C dosyası oluşturun [Dosya -> Yeni -> Boş Dosya], kaydedin (orijinal.c olarak) ve iletişim kutusundaki "Tamam" düğmesine tıklayarak mevcut projeye ekleyin.

original.c dosyasını oluşturun.

Adım 8) Önceki örnekte gösterilen original.c dosyasındaki C kodunu, main() fonksiyonu hariç, olduğu gibi kopyalayıp kaydedin.

original.c dosyasına kod ekleyin.

Adım 9) Projenizi derleyin ve çalıştırın. Sonuç aşağıdaki şekilde gösterilmiştir.

Program çıktısı

C'de Statik Depolama Sınıfı

Statik değişkenler, işlev/dosya içinde yerel statik değişkenler olarak kullanılır. Ayrıca bir araç olarak da kullanılabilirler. küresel değişken

  • Statik yerel değişken, değerini işlev çağrıları veya blok arasında tutan ve saklayan ve yalnızca tanımlandığı işlev veya blok tarafından görülebilen yerel bir değişkendir.
  • Statik global değişkenler, yalnızca tanımlandıkları dosyada görülebilen global değişkenlerdir.
Example: static int count = 10;

Statik değişkenin varsayılan başlangıç ​​değerinin sıfır olduğunu ve ömrü boyunca yalnızca bir kez başlatıldığını unutmayı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);}

Sonuç:

iteration=14 and counter= 7
iteration=15 and counter= 8
iteration=16 and counter= 9

Global değişkenlere dosyanın her yerinden erişilebilirken, statik değişkenlere yalnızca kodun belirli bir kısmı için erişilebilir.

Statik bir değişkenin ömrü program kodunun tamamındadır. Statik anahtar kelime kullanılarak bildirilen veya başlatılan bir değişken, her zaman varsayılan değer olarak sıfır içerir.

Depolama Sınıfını C'ye Kaydetme

Yerel değişkenleri, CPU yazmaçlarındaki işlevler veya bloklar içinde saklamak istediğinizde, yazmaç depolama sınıfını kullanabilirsiniz. RAM Bu değişkenlere hızlı erişim sağlamak için. Örneğin, "sayaçlar" kayıt defterinde saklanmak için iyi bir adaydır.

Example: register int age;

`register` anahtar kelimesi, bir kayıt depolama sınıfı tanımlamak için kullanılır. Kayıt depolama sınıfı kullanılarak tanımlanan değişkenler, program boyunca bir ömre sahiptir.

Otomatik depolama sınıfına benzer. Değişken belirli blokla sınırlıdır. Tek fark, yazmaç depolama sınıfı kullanılarak bildirilen değişkenlerin bellek yerine CPU yazmaçlarının içinde saklanmasıdır. Kayıt ana hafızaya göre daha hızlı erişime sahiptir.

Kayıt depolama sınıfı kullanılarak bildirilen değişkenlerin varsayılan değeri yoktur. Bu değişkenler genellikle programın başında bildirilir.

#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*/}
}

Çıktı:

error: address of register variable 'weight' requested

Sonraki tablo, C programlamada yaygın olarak kullanılan her bir depolama sınıfının temel özelliklerini özetlemektedir.

Depolama sınıfı Beyan Depolama Varsayılan Başlangıç ​​Değeri kapsam Ömür
Oto Bir fonksiyonun/bloğun içinde Bellek Öngörülemeyen Fonksiyon/blok içinde Fonksiyon/blok içinde
kayıt olmak Bir fonksiyonun/bloğun içinde CPU Kayıtları Çöp Fonksiyon/blok içinde Fonksiyon/blok içinde
stajyer doktor Tüm fonksiyonların dışında Bellek Sıfır Değişkenin extern olarak bildirildiği dosyanın tamamı ve diğer dosyalar programın çalışma zamanı
Statik (yerel) Bir fonksiyonun/bloğun içinde Bellek Sıfır Fonksiyon/blok içinde programın çalışma zamanı
Statik (küresel) Tüm fonksiyonların dışında Bellek Sıfır Küresel programın çalışma zamanı

SSS

Kapsam, bir değişkenin kodda nerede görünür olacağını belirlerken, ömür ise bellekte ne kadar süre kalacağını belirler. Bir değişken blok kapsamına sahip olabilir ancak program boyunca geçerli bir ömre sahip olabilir.

Her ikisi de blok kapsamlı yerel değişkenler oluşturur, ancak otomatik seçenek bunları varsayılan olarak çöp değerlerle bellekte tutarken, kayıt seçeneği daha hızlı CPU kayıt depolaması talep eder ve değişken adresinin alınmasını yasaklar.

Hayır. `register` yalnızca bir istektir; derleyici, boş bir `register` olmadığında bunu göz ardı edebilir. Modern derleyiciler `register` kullanımını otomatik olarak optimize eder, bu nedenle bu anahtar kelimeye artık nadiren ihtiyaç duyulur.

Statik ve harici değişkenler, tüm program boyunca sıfırla başlatılan bir bellek bölümünde yaşarlar, bu nedenle sıfırdan başlarlar. Otomatik değişkenler yığın belleğini yeniden kullanır, bu nedenle sıfırdan başlarlar.ping Geride kalan değer ne olursa olsun.

`extern` bildirimi yalnızca başka bir yerde tanımlanmış bir değişkeni duyurur ve başlatılamaz. Gerçek tanım, tek bir dosyada yer alır, depolama alanını tahsis eder ve bağlantı, ona yapılan her referansı birbirine bağlar.

Çoğunlukla öyle, ama tam olarak değil. C++ `register` anahtar kelimesi kullanımdan kaldırıldı ve `auto` tür çıkarımı için yeniden kullanıldı. `static` ve `extern` benzer şekilde davranır. C++ thread_local ve sınıf üyesi depolama kurallarını ekler.

Evet. Yapay zekâ asistanları auto, register, static ve extern kavramlarını açıklıyor, her değişken için doğru belirleyiciyi öneriyor ve register değişkeninin adresini almak gibi yanlış kullanımları işaretliyor.

GitHub Yardımcı Pilotu Statik sayaçları, dosyalar arası harici bildirimleri ve kayıt ipuçlarını otomatik olarak tamamlar, ardından siz yazarken kapsam ve ömrü satır içi olarak açıklar.

Bu yazıyı şu şekilde özetleyin: