Aynen oyle. Ama (her fonksiyon gibi, her parametre gibi) fonksiyon cagrilmak uzereyken, fonksiyonun o kopyasina ozel bir deger olarak dusunmek daha mantikli olabilir:
void hede(int foo) { ... }
int main(void) {
hede(3);
hede(4);
int x = 5;
hede(x);
}
Birinin basinda foo = 3;
, digerinin basinda foo = 4;
, digerinin basinda foo = 5;
denmiscesine uc tane deger ataniyor.
Dedigim gibi, dilden de bagimsiz bir sey bu. Programlama dillerinin tamamina yakininda bu semantik var.
char x[10];
char y[10] = "hede";
char z[10]; z[0] = 'h'; z[1] = 'e'; z[2] = 'd'; z[3] = 'e';
Bunlardan herhangi biri kullanilabilir; hepsi 10’luk birer karakter array’ine isaret ediyor. Ikincisinin ilk 5, ucuncusunun ilk 4 elemani tanimli, gerisi tanimsiz.
char *foo = x;
char *bar = "hede";
char *baz = "hede";
Bunlar da kullanilabilir. Ilki yukaridaki 10’luk array’lerden ilkine isaret ediyor; x
ile ayni. Ikincisi hic bir yerde karakter array’i olarak tanimlanmamis, fakat yine de 5’lik bir karakter array’i olan seye isaret ediyor.
Bu array’e yazmak undefined behavior (Turkcesi: yanlis); const char*
turunde olmasi lazim ama bir takim tarihsel sebeplerden oturu char*
turunde. (const char*
olsaydi elemanlari const char
olurdu. const
degiskenlere yazmak compile time’da hata verecegi icin bu yanlisligi onceden yakalardik.)
Ucuncu de ikincisiyle ayni yere isaret ediyor da olabilir, ayni tanimin gecerli oldugu baska bir 4’lik karakter array’ine isaret ediyor da olabilir.
char *nono;
Bu kullanilamaz, cunku kendisine bir deger atanmamis. Okumak veya yazmak dogrudan undefined behavior. Pratikte, rastgele bir hafiza alanina isaret eder ve okumak/yazmak rastgele bir hafiza alaninda okuma/yazma yapilmasini saglar. En iyi ihtimalle isletim sisteminin korudugu bir yere denk gelir ve segfault aliriz.