Yer belirleyiciler değişkenin depolanma şekillerini belirlerler ve C'de dört tanedirler: extern, static, register ve auto.
Şimdi bunlara tek tek bakalım.
extern
Bu yer belirleyici değişkenin ilk değerinin dışarıda bir yerde atanacağını bildirir. Örnek olarak şu koda bakabiliriz.
#include <stdio.h>
int main(void){
extern const int a;
printf("a=%d\n",a);
return 0;
}
const int a=5;
Bu program fonksiyon içinde a değişkenine ilk değer atanmamış olmasına rağmen 5 çıktısını verecektir. extern yer belirleyicisi ilk değerin dışarıda verileceğini söylemiş ve derleyici bu değeri bulmuştur. Görüldüğü gibi extern yer değiştiricisiyle birlikte const tip niteliyicisi kullanılmasına rağmen aşağıda a'ya değer atarken program hata vermemiştir. Çünkü extern ile ilan edilen a değişkeni ilk değer almamıştır. Dikkat edilmesi gereken bir diğer husus da yer belirleyici ile ilan etme işlemi yapılırken yer belirleyici diğer tüm niteleyicilerin başında yer almaktadır.
static
Bu yer belirleyicinin etkileri global değişkende ve yerel değişkende kullanımına göre farklılık gösterir. Yerel değişkenlerde kullanıldığı zaman değişken sadece içinde bulunduğu blok ilk defa çalıştığında ilk değer alır ve bloğun çalışması bittikten sonra da mevcut değerini muhafaza eder. Daha sonra blok tekrar çalıştırıldığında ilk değer yerine muhafaza ettiği son değer kullanılacaktır. Statik yerel değişkenin global değişkenden farkı değişkenin mevcut değerini korumasına rağmen kodun dışını etkilememesidir.
Bu yer belirleyici ile ilgili örnek kod şu şekilde verilebilir:
#include <stdio.h>
int a=1;
int main(void){
f();
f();
printf("a_global: %d\n",a);
return 0;
}
void f(void){
static int a=3;
a=a+3;
printf("a_static: %d\n",a);
}
Program çalıştığında önce f fonksiyonunu çağıracaktır. f fonksiyonu içinde a değişkeni statik olarak ilan edilmiş ve ilk değer olarak 3 atanmıştır. Sonra a'nın değeri 3 arttırılmıştır. Daha sonra da a'nın değeri yazdırılmıştır. Karşımıza çıkacak ifade "a_static: 6" olmalıdır.
Ardından ana fonksiyon tekrar f fonksiyonunu çağıracaktır. Fakat bu sefer a değişkeni ilk değer almayacak ve şu anki mevcut değeri olan 6 kullanılacaktır. Daha sonra a'nın değeri 3 arttırılacak ve yazdırılacaktır. Bu nedenle ekranda şöyle de bir ifade belirecektir: "a_static: 9"
En son olarak da ana fonksiyon a'nın değerini yazdıracaktır. Statik yerel değişken olan a 9 değerini muhafaza etmektedir. Fakat yerel değişken olduğundan fonksiyonun dışında etkisi yoktur. Bu nedenle global değişken olan a'nın değeri yazdırılacak ve ekranımızda şu ifade görünecektir: "a_global: 1"
Statik yerel değişkenlerle ilgili bilinmesi gereken son şey de bu değişkenlere ilk değer atanmaması durumunda otomatik olarak "0" değerini aldıklarıdır.
static yer belirleyicisinin global değişkende kullanılması ise global değişkenin sadece mevcut dosyada geçerli olacağını belirtir. Bu da demektir ki başka dosyalar statik global değişkeni okuyamaz.
register
register yer belirleyicisi değişkenin bellekte değil işlemcide tutulacağını belirtir. Bu da değişkene daha hızlı ulaşılmasını sağlar. Bununla birlikte işlemcide depolanabilecek değişken sayısı oldukça kısıtlıdır fakat aşırı sayıda register yer belirleyicisi kullanıldığında bazı değişkenler bellekte depolanır. Bu nedenle işlemcinin limitinden daha fazla register yer belirleyicisi kullanmak programda hataya neden olmaz. Yine de en çok kullanılacak değişkenlerin işlemcide tutulacağından emin olabilmek için bu yer belirleyicinin dikkatli kullanılmasında yarar vardır.
register yer belirleyicisi ile ilgili bilinmesi gereken iki önemli nokta bu yer belirleyicinin global değişkenlerde kullanılamayacağı ve register ile ilan edilen değişkenlerin adreslerine ulaşılamayacağıdır (Değişkenlerin adreslerinin kullanılmasına çok daha ileride değinilecektir.).
register yer belirleyicisi her türde değişken için kullanılabilmesine rağmen char ve int dışındaki değişkenlerde pratikte çok fazla yarar sağlamazlar.
register yer belirleyicisinin neden çok fazla kullanılmadığının açıklaması ise günümüzdeki derleyicilerin çalışma mantığı ile verilebilir. Günümüz derleyicileri optimizasyonu kendileri yapma eğiliminde oldukları için register yer belirleyicisini genellikle yok sayarlar.
auto
auto yer belirleyicisinin ise pratikte neredeyse hiç kullanımı yoktur. Bu yer belirleyici değişkenin sadece içinde bulunduğu blok içinde geçerli olduğunu belirtmede kullanılır ve sadece yerel değişkenlerde kullanılabilir. Yerel değişkenler zaten sadece kendi blokları içinde bilindiklerinden bu yer belirleyicinin kullanılmasına gerek yoktur.