PDA

Tam Sürümünü Görmek İçin : pointera referanslar


Darkstar
18/11/2004, 19:24
Geçenlerde karşılaştığım ve C++ kitaplarında pek üzerinde durulmayan önemli bir konu üzerindeki bilgilerimi sizlerle paylaşmak istedim:

Bildiğiniz gibi bir pointer'ı herhangi bir fonksiyona parametre olarak tanımlarsanız aslında o pointer için fonksiyon içinde bir kopya oluşturmuş oluyorsunuz.

//global bir pointerımız olsun...
int *ptrglob;

void func(int* p)
{
p = ptrglob;
}

main()
{
ptrglob = new int(66);
int *x;
int y = 33;
x = &y;
func(x);
cout<<*x; // Çıktı: 33 !
}

Bunun nedeni parametre olarak gönderdiğiniz pointerın fonks. içinde lokal bir kopyasının oluşturulmuş olmasıdır. Eğer fonksiyon içinde pointerı değiştirmek istiyorsanız aşağıdaki gibi pointera referans olarak tanımlamalısınız:


void func(int* &p)
{
p = ptrglob;
}


main()
{
ptrglob = new int(66);
int *x;
int y = 33;
x = &y;
func(x);
cout<<*x; // Çıktı: 66...
}


Bu bir çözüm, bir başka çözüm de fonksiyona parametre olarak pointera pointer kullanmanız:


void func(int** p)
{
*p = ptrglob;
}


main()
{
ptrglob = new int(66);
int *x;
int y = 33;
x = &y;
func(x);
cout<<*x; // Çıktı: 66...
}


neolion
19/11/2004, 05:17
Bir yanlisin var Arkadasim. Bu 3 programindada x in degeri degismiyor

acehreli
19/11/2004, 06:23
Ben Darkstar'in mektubunu cok aciklayici buldum. Evet, programlarinda birkac tane hata var ama onlari giderirsek son iki program x'in degerini degistiriyor:

1) main'in donus turu 'int' olarak acikca belirtilmemis (bazi derleyiciler bunu onemsemezler)

2) Su satirlar belki de mektubu kisa tutmak icin eklenmemis:

#include <iostream>
using namespace std;

3) Son programda func(x) degil func(&x) olacak

Ali

neolion
19/11/2004, 07:57
Ozur dilerim !!! calisti ok.