Hem işaretçiler hem de referanslar, programcıların bellek adresini doğrudan etkin bellek yönetimi için değiştirmesine izin veren C ve C ++ 'daki en güçlü özelliklerdir..
Her ikisi de dolaylı olarak diğer nesnelere başvurmak için kullanılan değişkenlerdir ve yüzeydeki bazı ortak özellikleri paylaşırlar. Çok sayıda ortak özelliği paylaşsalar da, anlamak çok karmaşıktır.
İşaretçi, başka bir değişkenin bellek adresini tutan bir değişkendir, referans ise dolaylı olarak başka bir değişkeni ifade etmek için kullanılabilen bir işaretçi gibidir..
Çoğu programcı işaretçileri ne zaman kullanacakları ve ne zaman referans kullanacakları konusunda biraz anlayış geliştiriyor gibi görünmektedir, ancak çoğu zaman çözümü belirsiz görünen sorunlarla karşılaşmaktadır..
Felsefeyi daha iyi anlamak için, ikisi arasındaki farkı anlayalım.
Her değişken, adresiyle tanımlanan ve bir program sırasında değiştirilebilecek bir değer içeren bir tanımlayıcı ile eşlenen bir bellek konumudur. Basit bir ifadeyle değişken, bir miktarı temsil eden bir semboldür.
İşaretçi, başka bir değişkenin bellek adresini içeren bir değişkendir. İşaretçi, adres dışında bir şey değildir ve işaretçiyi depolayan değişkene işaretçi değişkeni denir.
Fikir, programlama yükünü hafifletmek ve böylece programların karmaşıklığını azaltmak için sayısal adresler yerine tanımlayıcılar (veya adlar) kullanmaktır. Bu adresler bilgisayar belleğindeki gerçek konumlara atıfta bulunduğundan, bellekte depolanan içeriğe erişmek ve bunları değiştirmek için işaretçiler kullanılabilir.
Herhangi bir değişken veya sabit gibi, işaretçiler türleri için bildirilmelidir. İşaretçiler ayrı bir veri türüne ait bellek adresleri içerdiğinden, onlarla çalışabilmeniz için önce işaretçiler kullanılarak bildirilmeleri gerekir. İşaretçi bildiriminin genel biçimi:
Veri_türü * var-name;
Burada “Data_type”, işaretçinin temel türüdür ve “var-name” işaretçi değişkenidir. Buradaki yıldız işareti (*), "var-name" değişkenini bir işaretçi değişkeni olarak belirten işaretçiyi bildirmek için kullanılır.
int * p; // tamsayı işaretçisi
şamandıra * x; // şamandıra işaretçisi
Burada, "p" değişkeni, değişkenin veri tipini ifade eden "int" olarak bildirilen bir tamsayı veri türünü gösterir. Benzer şekilde, ikinci örnekte, "kayan nokta" aslında bir kayan nokta değişkenine işaretçi olarak gösterilen "x" değişkeninin veri tipini ifade eder.
Bir başvuru, bir değişkene dolaylı erişimi olan bir işaretçi gibidir. Başka bir değişkenin takma adı gibi, yani zaten var olan bir değişken için başka bir ad.
Programcıların bu değişkente depolanan içeriği işlemek için kullanabilecekleri değişken için ikinci bir ad oluşturmasına izin verir. Başka bir değişkenin takma adı olan bir varlıktır ve orijinal değişkenle aynı adrese sahiptir. Fonksiyonel resmi parametreler olarak işlev gören pass-by-pass'ı destekler ve bir değişkeni belirtmek için tanımlandıktan sonra, tekrar edilemez, yani başka bir değişkene yönlendirilemez.
İşaretçilerin aksine, değere erişmek için kayıttan çıkarma operatörüne ihtiyaç duymazlar; aslında normal değişkenler gibi kullanılabilirler.
int i;
int & ri = i;
Burada “ri”, “i” olarak başlatılmış bir tamsayı referansıdır. “Ri” yi “int'e gönderme” tipinde bir nesne olarak ilan eder. Bir referans, adres değerleri oluşturulduktan sonra yeniden atanamayan bağımsız bir değişken olan bir göstergeyle kolayca karıştırılabilir..
- Her ikisi de kullanılabilirlik açısından neredeyse benzer yetenekler sağlar ve ayrım zor olabilir. İşaretçi yalnızca başka bir değişkenin bellek adresini depolayan bir değişkendir, buna karşılık bir referans zaten var olan bir değişkenin takma adı gibidir. Bir değişkende depolanan içeriği değiştirmek için kullanılabilecek bir değişken için ikinci bir ad oluşturur.
- İşaretçi, bir veri parçasını depolayan diğer değişkenlere benzer. Diğer değişkenlerin aksine, işaretçi değişkenleri değerler yerine bellek adreslerini saklar. İşaretçi, işaret ettiği değişkenin bellek konumuna erişmek için dolaylı işleç * kullanılarak kayıttan çıkarılır. Diğer taraftan, bir referansın değere erişmek için herhangi bir kayıt silme operatörüne ihtiyacı yoktur.
- Herhangi bir zamanda başlatılabilen işaretçilerin aksine, başlangıçta referanslar atanmalıdır. İşaretçilere doğrudan erişilebilirken referanslara doğrudan erişilemez.
- İşaretçi değişkeninin bellekte kendi konumu vardır, yani bir işaretçi bildirdiğinizde, her bir bellek birimine atanmış bir bellek adresi olan bir konum belirtirsiniz. İşaretçi değişkeni, belleğe kaydedildiği adresle aynı adrese sahiptir. Diğer taraftan bir referans değişkeni, başka bir değişken için bir takma addır, böylece referans değişkeninin adresini alır.
- NULL, listenin sonunu temsil eder, bu da değerin bilinmediğini ve değişkenin geçerli bir adres alanına sahip olmadığını belirtir. NULL değeri, herhangi bir yere işaret etmediğini gösteren bir işaretçi değişkenine doğrudan atanabilirken NULL, bir referans değişkenine atanamaz.
İşaretçiler, resme referans gelene kadar C / C ++ programcılarının en sevdiği tartışma konuları arasındaydı. Referanslar işaretçilere biraz benzer, ancak karşılaştırmalı olarak artıları ve eksileri arasında adil bir payları vardır. Her ikisi de bir işlevin yerel değişkenlerini başka bir işlev içinde değiştirmek için kullanılabilirken, farklılıkları vardır. Her ikisi de C ve C ++ 'da hafızayı doğrudan değiştirmenize izin veren güçlü özelliklerdir, ancak birkaç istisna dışında. İşaretçi bir değişkenin bellek adresini tutarken, referans sadece başka bir değişken için bir takma addır.