September 26, 2011

http://ddili.org/ders/d/deger_referans.html adresindeki konuya bakıyorum.

Bu referans tipi biraz kafamı karıştırdı. Önce göstericilere benzettim ama göstericilerinde bellekte bulundukları bir yer var diye biliyorum oysa referans tipleri değişken ile aynı adresi gösteriyor biraz karıştı galiba bu arada referans türü sanırım göstericiler gibi birşey bu konularda biraz daha bilgi almam mümkün mü?

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

September 26, 2011

Alıntı (zafer):

>

Bu referans tipi biraz kafamı karıştırdı. Önce göstericilere benzettim

Doğru. Şöyle söyleyebiliriz: C ve C++'ta referans türü kavramı göstericilerle gerçekleştirilir. (İşin garibi, C++'ta & karakteri ile tanımlanan referanslar referans türü kavramından çok takma isim anlamına gelirler.)

Ben atama işlecinin davranışına bakarak anlıyorum: Eğer atama işlemi veri kopyalıyorsa değer türüdür, eğer varolan bir veriye erişim sağlıyorsa referans türüdür.

Alıntı:

>

ama göstericilerinde bellekte bulundukları bir yer var diye biliyorum oysa referans tipleri değişken ile aynı adresi gösteriyor

Aslında değişkenden farklılar. Sınıflarda görmek için en iyisi sınıfın bir üyesinin adresini yazdırmak:

import std.stdio;

class C
{
   int i;
}

void main()
{
   auto r = new C();
   writeln("referans: ", &r);
   writeln("değişken: ", &r.i);
}

İlgisiz adresteler:

'referans: 7FFFA6901EB8
değişken: 2B707F089F90'

Dilimler de bir çeşit referans türü kabul ediliyorlar. Onların da kendi adresleriyle elemanlarının adresini yazdırabiliriz. .ptr niteliği de ilk elemanın adresidir:

import std.stdio;

void main()
{
   auto r = [ 0, 42 ];
   writeln("referans: ", &r);
   writeln("eleman  : ", &r[0]);
   writeln(".ptr    : ", r.ptr);
}

Çıktısı:

'
referans: 7FFF0A2930F0
eleman : 2AF5A76B0FD0
ptr : 2AF5A76B0FD0'

Alıntı:

>

referans türü sanırım göstericiler gibi birşey

Doğru. Değer türlerinin referans türlerini elde etmek için yine C ve C++'ta olması gerektiği gibi göstericilerden yararlanmak zorundayız. Bu durumda int* ve Y* referans türü oluyorlar:

import std.stdio;

struct Y
{}

void main()
{
   auto y = Y();

   Y * r0 = &y;
   Y * r1 = r0; // <-- referans türü çünkü r0'ın eriştirdiğine eriştiriyor

   int i;
   int * r2 = &i;
   int * r3 = r2; // <-- aynı şekilde
}

Ali

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]