Ana içeriğe geç

İşaretçi

İngilizcesi
Pointer
Türkçe karşılığı
gösterici
Okunuşu
poyntır

Günlük kullanımda iki ad da yaygın.

Güncellendi 2 dk okuma

Bu sayfayı paylaşın

Bağlantıyı gönderin, tanımı bağlantısıyla birlikte alıntılayın ya da kendi sitenizde bir kart olarak gösterin.

https://softwaredictionary.org/tr/terimler/pointer

Kısaca

İşaretçi, başka bir değerin kendisi yerine bellek adresini saklayan bir değişkendir; kodun o veriyi dolaylı yoldan okumasına ya da değiştirmesine imkân tanır.

İşaretçi (pointer) nedir?

İşaretçi, değeri bir bellek adresi olan, yani başka bir verinin bulunduğu konum olan bir değişkendir. 42 sayısını tutmak yerine, “0x7ffd1234 adresinde saklanan sayı” gibi bir şey tutar. İşaretçi aracılığıyla o adresteki değeri okumaya ya da yazmaya işaretçiyi çözme (dereferencing) denir.

İşaretçiler en çok C, C++, Zig ve Go dillerinde görünür. C'de &x, x'in adresini verir ve *p, p işaretçisini izleyerek işaret ettiği değere ulaşır. İşaretçiler büyük yapıları kopyalamadan fonksiyonlara aktarmayı, bağlı listeler ve ağaçlar gibi bağlı veri yapıları kurmayı ve öbekten (heap) istenen bellekle çalışmayı mümkün kılar. C ayrıca işaretçi aritmetiğine de izin verir: bir işaretçiye 1 eklemek onu dizinin sonraki öğesine taşır.

İşaretçi, bir kâğıt parçasına yazılmış sokak adresi gibidir: kâğıt küçüktür, kopyalaması ucuzdur ve onu elinde tutan herkes evi bulabilir. Tehlike, adresin yanlış olabilmesidir. Null işaretçi hiçbir yeri göstermez; sarkan işaretçi (dangling pointer) ise zaten serbest bırakılmış belleğin adresini tutmaya devam eder, dolayısıyla ikisini de izlemek programı çökertebilir veya bir güvenlik açığı açabilir. Java, Python ve JavaScript gibi diller ham adresleri çalışma zamanının yönettiği referansların arkasına gizler, Rust ise referanslarının her zaman geçerli veriyi göstermesini derleme zamanında denetler.

İşaretçi sıklıkla referansla karıştırılır. İkisi de kodun bir değere dolaylı olarak ulaşmasını sağlar, ancak işaretçi inceleyebileceğiniz, yeniden atayabileceğiniz, null yapabileceğiniz ve bazen üzerinde aritmetik yapabileceğiniz açık bir adrestir; referans ise dilin yönettiği daha kısıtlı bir takma addır. C++'ta bir referans oluşturulurken bir nesneye bağlanmalıdır ve daha sonra başka bir yeri gösterecek biçimde değiştirilemez; Java'da her nesne değişkeni bir referanstır, ancak adresin kendisini görmenin ya da değiştirmenin bir yolu yoktur.

Önemli noktalar

  • İşaretçi, verinin kendisi yerine bir bellek adresini saklar.
  • İşaretçiyi çözmek (dereferencing), o adresteki değeri okur veya yazar.
  • İşaretçiler büyük verinin kopyalanmasını önler ve bağlı veri yapılarını mümkün kılar.
  • Null ve sarkan işaretçiler, çökmelerin ve güvenlik hatalarının yaygın kaynağıdır.
  • Birçok dil ham işaretçilerin yerine daha güvenli, çalışma zamanı tarafından yönetilen referanslar koyar.

Örnek

C'de bir işaretçi aracılığıyla değeri değiştirmekc
#include <stdio.h>

void double_it(int *n) {   // receives an address, not a copy
    *n = *n * 2;           // follow the pointer and change the original
}

int main(void) {
    int score = 21;
    int *p = &score;       // & takes the address of score
    double_it(p);
    printf("%d\n", score); // prints 42
    return 0;
}

Sık sorulan sorular

Null işaretçi nedir?

Null işaretçi, C'de genellikle NULL, C++'ta nullptr olarak yazılan ve bilerek geçerli hiçbir belleği göstermeyen bir işaretçidir. Onu çözmek genellikle programı çökerten bir hatadır, bu yüzden kod boş olabilecek bir işaretçiyi kullanmadan önce null olup olmadığını denetlemelidir.

Python ve Java'da işaretçiler var mı?

C anlamında yok. Python ve Java'da nesne tutan değişkenler referanstır: çalışma zamanı her nesnenin nerede yaşadığını takip eder, ancak ham adresi okuyamaz, işaretçi aritmetiği yapamaz ya da belleği kendiniz serbest bırakamazsınız.

İşaretçi ile referans arasındaki fark nedir?

İşaretçi, değiştirilebilen, karşılaştırılabilen ve null yapılabilen açık bir bellek adresidir. Referans ise dilin sizin için yönettiği, bir değere başvurmanın daha güvenli ve sınırlı bir yoludur.

İlgili sayfalar

Bu sayfada bir hata ya da eksik mi gördünüz?Düzeltme önerin

Daha fazla

Ayarlar