Jump to content
Forumu Destekleyenlere Katılın ×
Paticik Forumları
2000 lerden beri faal olan, çok şukela bir paylaşım platformuyuz. Hoşgeldiniz.

c dili hakkında birkaç soru


Mithr

Öne çıkan mesajlar

geçen derse gidemedim ve hoca birkaç şey üzerine değinmiş.internette araştırdım fakat anlayamadım tam olarak ne anlama geldiklerini.
call by value ile call by reference birde pass by value ile pass by reference kavramları anlamadığım şeyler.malum final haftasına gireceğiz vesaire.
kısaca anlatabilecek arkadaşlar varmı acaba?
teşekkürler.
Link to comment
Sosyal ağlarda paylaş

Öncelikle pointer nedir biliyor olman lazım. Pointer biliyorsan http://www.cs.princeton.edu/~lworthin/126/precepts/pass_val_ref.html adresinde pass by value ile pass by reference farkını gayet iyi özetlemişler.

Call ile pass eşanlamlı kullanılıyor bildiğim kadarıyla.
Link to comment
Sosyal ağlarda paylaş


void swap ( int *px, int *py) {

int t = *px;

*px = *py;

*py = t;

}

int main(void)
{
int a = 5;

int b = 7;

swap( &a, &b );

printf("a is %d and b is %dn", a, b);

}

mesela burada pointerlara a ve b değerini gönderiyoruz.*px ve *py sırayla a nın ve b nin yerini alıyor ve daha sonra değerlerini değiştiriyorlar kendi aralarında.ama main'de printfde biz a ve b yi yazdırıyoruz.pointerları yazdırmamız gerekmiyormu :P
Link to comment
Sosyal ağlarda paylaş

Öncelikle call by value ve call by reference'i anlaman için pointer'ları öğrenmen şart. http://www.cs.cf.ac.uk/Dave/C/node10.html iyi bir kaynağa benziyor. Ama tonlarca kaynak var pointer'lar hakkında.

Mithr said:
mesela burada pointerlara a ve b değerini gönderiyoruz.


Hayır. Tam aksine fonksiyona a ve b değişkenlerinin adresini gönderiyorsun. Buna da call by reference deniyor.

& operatörü bir değişkenin adresini verir.
* operatörü bir adreste bulunan değeri verir.


void swap ( int *px, int *py) {
int t = *px;
*px = *py;
*py = t;
}


Burda swap fonksiyonun beklediği argümanlar int değeri değil, int türüne pointer.

px dediği int türüne pointer
*px ise o pointer'ın gösterdiği int değeri

Yani fonksiyon şunu yapıyor:


void swap ( int *px, int *py) {
int t = *px; // px'in gösterdiği int değerini t'ye ata
*px = *py; // px'in gösterdiği yere py'nin gösterdiği int değerini ata
*py = t; // px'in gösterdiği int değerine t'yi ata
}


Burda px pointer'ı a değişkeninin adresi olduğu için, px'in gösterdiği int değeri ilk başta a'nın değeri. Yani fonksiyona a ve be'nin adresinlerini yolladın. Bu adresleri pointer olarak kullanarak a ve b'nin değerlerini değiştirmiş oldun.

Pointer yerine a ve b'nin değerini bekleyen bir fonksiyon kullanarak (yani call by value ile) bu yaptığın şeyi yapmanın bir yolu yok. O yüzden swap fonksiyonu tipik örnek olarak verilir.
Link to comment
Sosyal ağlarda paylaş

c++'da reference deniyor ona.

edit: ahmet'in kendisi demişsin, biraz kafa karıştırabilir. Pointer ile aynı işlevi görüyor aslında. Reference kullanırken yine adresler ile çalışıyorsun. Yani fonksiyonu reference ile çağırırsan değişkenin değerini değil adresini veriyorsun (call by reference). Ama reference kullanımı pointer'lara göre daha basit. * ve & işaretleriyle uğraşmadığın için adres kullanımını gizlemiş oluyorsun.
Link to comment
Sosyal ağlarda paylaş

Mirage said:


void swap ( int *px, int *py) {
int t = *px;
*px = *py;
*py = t;
}



pointer kullanmanın mantığı nedir ya da avantajları diyim.

void swap ( int px, int py) {
int t = px;
px = py;
py = t;
}


aynı işi görmezmi ?

Not:pek bilgim yok sadece pointer mantığını anlamaya çalışıyorum.
Link to comment
Sosyal ağlarda paylaş

Hayır görmez. Bir dene istersen. ;)

a = 1;
b = 2;
swap(a, b);

Swap fonksiyonunu bahsettiğin şekilde tanımlarsan ve yukardaki şekilde kullanırsan, fonksiyonu a ve b değişkenlerinin değerlerinin kopyası ile çağırırsın (call by value).

Yani fonksiyon gövdesine girdiğinde px 1, py ise 2 oluyor. Ama px ve py değişkenlerinin ömrü fonksiyon sonunda bitiyor. Fonksiyon sonunda py'yi 1, px'yi ise 2 olarak değiştirmiş oluyorsun. Ama fonksiyon bitince py de px de çöpe atılıyor. a ve b ile ilgili hiç bir değişiklik yapmamış oluyorsun.

İnternette yüzlerce kaynak varken baştan pointer anlatmak istemiyorum açıkcası. Özel bir soru varsa yardımcı olmaya çalışırız.
Link to comment
Sosyal ağlarda paylaş

×
×
  • Yeni Oluştur...