- Katılım
- 5 Haz 2025
- Mesajlar
- 21
- Tepkime puanı
- 10
- Puanları
- 3
Pointer Mantığı Rehberi
Pointer, özellikle C ve C++ öğrenen kişilerin ilk başta en çok zorlandığı konulardan biridir. Bunun temel nedeni pointer'ın yalnızca bir değişken değil, aynı zamanda bellekteki adreslerle çalışmayı sağlayan bir yapı olmasıdır.Pointer konusunu anlamak için önce şu mantığı oturtmak gerekir:
Değişken = Değer tutar
Pointer = Bir değişkenin bellekteki adresini tutar
Pointer mantığını anladıktan sonra:
- Diziler
- Fonksiyonlar
- Dinamik bellek
- Struct
- Class
- Veri yapıları
Pointer Nedir?
Pointer, başka bir değişkenin bellekte bulunduğu adresi saklayan değişkendir.Örneğin:
int sayi = 10;
Burada sayi değişkeninin değeri:
10
olur.
Ancak bu değişken bilgisayarın belleğinde belirli bir adreste tutulur.
Örneğin temsili olarak:
0x7FFE1234
gibi bir adresi olabilir.
Pointer ise bu adresi saklayabilir.
Basit Pointer Örneği
int sayi = 10;int *ptr = &sayi;
Burada:
sayi
10 değerini tutar.
&sayi
sayi değişkeninin bellekteki adresini verir.
ptr
bu adresi saklar.
& İşareti Ne Demektir?
Pointer konusunda en önemli işaretlerden biri:&
işaretidir.
Bir değişkenin önünde kullanıldığında onun bellek adresini verir.
Örneğin:
int sayi = 10;
printf("%p\n", (void *)&sayi);
ekrana değişkenin bellek adresini yazdırır.
Adres her çalıştırmada farklı olabilir.
Bu nedenle belirli bir adresi ezberlemeye gerek yoktur.
* İşareti Ne Demektir?
Pointer konusunda ikinci önemli işaret:*
işaretidir.
İki farklı kullanım şekli vardır.
Pointer Tanımlarken
int *ptr;burada ptr değişkeninin int türünde bir değerin adresini tutan pointer olduğunu belirtir.
Pointer'ın Gösterdiği Değere Ulaşırken
*ptrpointer'ın gösterdiği adresteki değeri verir.
Bu işleme:
Dereference
denir.
Örnek Üzerinden Anlayalım
int sayi = 10;int *ptr = &sayi;
Şimdi:
sayi
değeri:
10
olur.
ptr
sayi değişkeninin adresini tutar.
*ptr
ise o adresteki değeri verir.
Yani:
printf("%d\n", *ptr);
çıktısı:
10
olur.
Pointer Mantığını Ev Adresiyle Düşünelim
Pointer'ı anlamanın en kolay yollarından biri adres örneğidir.Diyelim ki bir evin içinde:
100 TL
var.
Evin kendisi:
Değişken
olsun.
Evin adresi:
Pointer'ın tuttuğu adres
olsun.
Adres üzerinden eve gittiğinizde içerideki:
100 TL
değerine ulaşırsınız.
Programlamada da benzer mantık vardır.
Bellek Adresi Nedir?
Bilgisayarın RAM belleği çok sayıda küçük alanlardan oluşur.Her alanın bir adresi vardır.
Programınız çalışırken değişkenler bu adreslerde tutulur.
Örneğin temsili olarak:
Adres Değer
0x1000 10
0x1004 25
0x1008 50
şeklinde düşünebilirsiniz.
Pointer:
0x1000
adresini tutabilir.
Bu adresin içindeki değer ise:
10
olabilir.
Pointer'ın Kendisi de Değişkendir
Bu önemli bir konudur.Pointer sadece adres değildir.
Pointer'ın kendisi de bellekte tutulan bir değişkendir.
Örneğin:
int sayi = 10;
int *ptr = &sayi;
temsili olarak:
sayi adresi: 0x1000
sayi değeri: 10
ptr adresi: 0x2000
ptr değeri: 0x1000
olabilir.
Yani pointer'ın kendi adresi de vardır.
Pointer ile Değer Değiştirme
Pointer üzerinden bir değişkenin değeri değiştirilebilir.Örneğin:
int sayi = 10;
int *ptr = &sayi;
*ptr = 50;
Artık:
sayi = 50
olur.
Çünkü ptr, sayi değişkenini göstermektedir.
Tam Örnek
#include <stdio.h>int main(void)
{
int sayi = 10;
int *ptr = &sayi;
printf("Sayi: %d\n", sayi);
*ptr = 50;
printf("Yeni sayi: %d\n", sayi);
return 0;
}
Çıktı:
Sayi: 10
Yeni sayi: 50
olur.
Pointer Neden Kullanılır?
Pointer kullanımının birçok nedeni vardır.En önemli kullanım alanları:
- Fonksiyon içerisinde değişken değiştirmek
- Dizilerle çalışmak
- Dinamik bellek kullanmak
- Büyük verileri kopyalamadan aktarmak
- Veri yapıları oluşturmak
- Sistem programlama
- Donanım erişimi
Fonksiyonlarda Pointer Kullanımı
C dilinde fonksiyona bir değişken gönderildiğinde genellikle değerin kopyası gönderilir.Örneğin:
void degistir(int sayi)
{
sayi = 100;
}
Kullanım:
int x = 10;
degistir(x);
Fonksiyon içerisindeki değişiklik dışarıdaki x değişkenini değiştirmez.
Çünkü fonksiyon kopya değer üzerinde çalışır.
Pointer ile Fonksiyon İçinden Değer Değiştirme
void degistir(int *sayi){
*sayi = 100;
}
Kullanımı:
int x = 10;
degistir(&x);
Artık:
x = 100
olur.
Çünkü fonksiyona x değişkeninin adresi gönderilmiştir.
Neden &x Gönderiyoruz?
Fonksiyon:void degistir(int *sayi)
bir adres bekler.
Bu nedenle:
degistir(&x);
kullanılır.
&x
x'in adresidir.
Fonksiyon bu adres üzerinden gerçek değişkene ulaşabilir.
scanf İçinde Pointer Mantığı
C öğrenirken pointer'ı aslında çok erken kullanırsınız.Örneğin:
int yas;
scanf("%d", &yas);
Burada scanf() fonksiyonu kullanıcının girdiği değeri yas değişkeninin içerisine yazmak zorundadır.
Bu nedenle ona:
yas'ın adresi
gönderilir.
Yani:
&yas
kullanılır.
Bu da pointer mantığının günlük kullanımına güzel bir örnektir.
Pointer Türü Neden Önemlidir?
Pointer tanımlanırken hangi veri tipini göstereceği belirtilir.Örneğin:
int *intPtr;
float *floatPtr;
char *charPtr;
Bu pointerlar farklı veri tiplerini gösterir.
Bunun nedeni pointer arithmetic ve dereference işlemlerinde compiler'ın verinin boyutunu bilmesi gerektiğidir.
int Pointer Örneği
int sayi = 20;int *ptr = &sayi;
ptr
bir int değişkenin adresini tutar.
char Pointer Örneği
char harf = 'A';char *ptr = &harf;
Bu pointer ise char türünde bir değişkeni gösterir.
Pointer ve Dizi İlişkisi
Pointer konusunun en önemli bölümlerinden biridir.C dilinde dizi adı birçok ifadede dizinin ilk elemanının adresine dönüşür.
Örneğin:
int sayilar[3] = {10, 20, 30};
şu kullanım:
sayilar
çoğu bağlamda:
&sayilar[0]
ile aynı adresi ifade eder.
Dizi Pointer Örneği
int sayilar[3] = {10, 20, 30};int *ptr = sayilar;
Artık:
*ptr
ilk elemanı verir.
Sonuç:
10
olur.
Pointer Arithmetic Nedir?
Pointer üzerinde toplama ve çıkarma işlemleri yapılabilir.Örneğin:
int sayilar[3] = {10, 20, 30};
int *ptr = sayilar;
şu ifade:
*(ptr + 1)
ikinci elemanı verir.
Sonuç:
20
olur.
ptr + 1 Gerçekten Bir Byte mı İlerler?
Hayır.Bu çok önemli bir noktadır.
Eğer:
int *ptr;
ise:
ptr + 1
bir sonraki int elemanına geçer.
Yani compiler sizeof(int) kadar ilerler.
Eğer int 4 byte ise pointer adresi 4 byte ilerleyebilir.
Bu nedenle pointer türü önemlidir.
Dizi Elemanlarına Pointer ile Ulaşma
int sayilar[3] = {10, 20, 30};printf("%d\n", *(sayilar + 0));
printf("%d\n", *(sayilar + 1));
printf("%d\n", *(sayilar + 2));
çıktı:
10
20
30
olur.
Bu nedenle şu iki kullanım birbiriyle yakından ilişkilidir:
sayilar[1]
ve:
*(sayilar + 1)
String ile Pointer İlişkisi
C'de stringler karakter dizileridir.Örneğin:
char isim[] = "Ahmet";
Pointer üzerinden de karakterlere ulaşabilirsiniz.
char *ptr = isim;
Şimdi:
*ptr
ilk karakteri verir:
A
String Literal Pointer
Şu kullanım da görülebilir:const char *mesaj = "Merhaba";
Burada pointer bir string literal'i gösterir.
String literal üzerinde doğrudan değişiklik yapmaya çalışmak güvenli değildir.
Bu nedenle const kullanımı önemlidir.
NULL Pointer Nedir?
Henüz geçerli bir adres göstermeyen pointer için NULL kullanılabilir.C:
int *ptr = NULL;
C++ tarafında modern kullanım:
int *ptr = nullptr;
şeklindedir.
NULL Pointer Neden Kullanılır?
Pointer'ın henüz bir nesneyi veya değişkeni göstermediğini belirtir.Örneğin:
if (ptr != NULL)
{
printf("%d\n", *ptr);
}
şeklinde kontrol yapılabilir.
NULL Pointer Dereference Edilirse Ne Olur?
Şu kod tehlikelidir:int *ptr = NULL;
printf("%d\n", *ptr);
Çünkü pointer geçerli bir adres göstermemektedir.
Program:
- Çökebilir
- Segmentation Fault verebilir
- Access Violation oluşturabilir
Wild Pointer Nedir?
Başlangıç değeri verilmemiş pointer'a bazen wild pointer denir.Örneğin:
int *ptr;
Bu pointer belirsiz bir adres değeri taşıyabilir.
Sonra:
*ptr = 10;
yapmak ciddi hatalara neden olabilir.
Bu nedenle pointer başlangıçta:
int *ptr = NULL;
veya geçerli bir adresle başlatılmalıdır.
Dangling Pointer Nedir?
Artık geçerli olmayan bir bellek alanını gösteren pointer'dır.Örneğin dinamik bellek serbest bırakıldıktan sonra pointer hâlâ eski adresi tutabilir.
int *ptr = malloc(sizeof(int));
free(ptr);
Buradan sonra ptr artık geçerli belleği göstermeyebilir.
Daha güvenli kullanım:
free(ptr);
ptr = NULL;
şeklinde olabilir.
Dinamik Bellek Nedir?
Program çalışırken ihtiyaç kadar bellek ayırma işlemidir.C dilinde:
- malloc
- calloc
- realloc
- free
Pointerlar dinamik bellek yönetiminin temelidir.
malloc Örneği
#include <stdlib.h>int *ptr = malloc(sizeof(int));
Bu kod bir int için bellekte alan ayırır.
Daha sonra:
*ptr = 25;
değeri yazılabilir.
İş bitince:
free(ptr);
kullanılmalıdır.
malloc Sonucu Kontrol Edilmeli mi?
Evet.Bellek ayırma başarısız olabilir.
Örneğin:
int *ptr = malloc(sizeof(int));
if (ptr == NULL)
{
return 1;
}
şeklinde kontrol yapılabilir.
Birden Fazla Eleman İçin Bellek Ayırma
Örneğin 10 adet int:int *sayilar = malloc(10 * sizeof(int));
Bu alan dizi gibi kullanılabilir.
sayilar[0] = 10;
sayilar[1] = 20;
İşiniz bitince:
free(sayilar);
kullanılmalıdır.
Memory Leak Nedir?
Dinamik olarak ayrılan belleğin serbest bırakılmamasıdır.Örneğin:
int *ptr = malloc(1000 * sizeof(int));
ancak:
free(ptr);
kullanılmazsa program belleği gereksiz yere tutabilir.
Bu durum sürekli tekrarlandığında:
Memory Leak
oluşur.
Pointer to Pointer Nedir?
Bir pointer'ın adresini tutan pointer'dır.Örneğin:
int sayi = 10;
int *ptr = &sayi;
int **ptr2 = &ptr;
Burada:
ptr
sayi'nın adresini tutar.
ptr2
ise ptr'nin adresini tutar.
Pointer to Pointer Nasıl Okunur?
int **ptr2;ifadesi:
int pointer'ını gösteren pointer
olarak düşünülebilir.
Şu kullanım:
**ptr2
son değere ulaşır.
Bu örnekte:
10
sonucunu verir.
Pointer to Pointer Nerede Kullanılır?
Örneğin:- Dinamik iki boyutlu diziler
- Fonksiyon içinde pointer değiştirmek
- Argüman listeleri
- Bazı veri yapıları
Başlangıçta yalnızca mantığını anlamak yeterlidir.
void Pointer Nedir?
void *belirli bir veri tipine bağlı olmayan genel pointer türüdür.
Örneğin:
void *ptr;
farklı türde adresleri tutabilir.
malloc() fonksiyonunun dönüş değeri de C'de void * türündedir.
Ancak kullanmadan önce doğru tipe göre işlem yapılmalıdır.
C++'ta Pointer Mantığı Aynı mı?
Temel pointer mantığı büyük ölçüde aynıdır.Örneğin:
int sayi = 10;
int *ptr = &sayi;
C++'ta da çalışır.
Ancak modern C++ ek olarak:
- Reference
- std::unique_ptr
- std::shared_ptr
- std::vector
- std::string
C++ Reference ile Pointer Farkı
Reference örneği:int sayi = 10;
int &ref = sayi;
Pointer:
int *ptr = &sayi;
Reference genellikle mevcut bir nesneye alternatif isim gibi davranır.
Pointer ise adres tutar ve:
- nullptr olabilir.
- Başka bir adresi gösterebilir.
- Pointer arithmetic yapılabilir.
Smart Pointer Nedir?
Modern C++ içerisinde dinamik belleği daha güvenli yönetmek için smart pointerlar bulunur.Örneğin:
#include <memory>
auto sayi = std::make_unique<int>(10);
İş bittiğinde bellek otomatik olarak temizlenir.
Özellikle modern C++ projelerinde manuel:
new
delete
kullanımını azaltmaya yardımcı olur.
Pointer ile Struct Kullanımı
C'de çok sık görülür.Örneğin:
struct Oyuncu
{
int can;
int seviye;
};
Pointer:
struct Oyuncu oyuncu;
struct Oyuncu *ptr = &oyuncu;
Değere ulaşmak için:
(*ptr).can = 100;
yazılabilir.
Ancak daha kısa kullanım:
ptr->can = 100;
şeklindedir.
-> Operatörü Nedir?
Pointer üzerinden struct veya C++ object üyesine erişmek için kullanılır.Örneğin:
ptr->can
şunun kısa halidir:
(*ptr).can
Özellikle veri yapılarında çok sık karşınıza çıkar.
Linked List ve Pointer
Pointer mantığını öğrendikten sonra linked list gibi veri yapıları daha anlaşılır hale gelir.Örneğin:
struct Node
{
int veri;
struct Node *sonraki;
};
Her node:
- Bir veri
- Sonraki node'un adresi
Bu yapı tamamen pointer mantığı üzerine kuruludur.
Pointer Boyutu Ne Kadardır?
Pointer'ın boyutu gösterdiği veri tipinden bağımsız olarak büyük ölçüde sistem mimarisine bağlıdır.Örneğin 64 bit sistemde çoğu pointer:
8 byte
olabilir.
Şu pointerların boyutu çoğu platformda aynı olabilir:
int *a;
char *b;
double *c;
Ancak gösterdikleri veri türleri farklıdır.
Kesin boyut için:
sizeof(ptr)
kullanılmalıdır.
Pointer ile Adres Yazdırma
C'de adres yazdırırken:printf("%p\n", (void *)ptr);
kullanılabilir.
%p
pointer adreslerini yazdırmak için kullanılır.
&ptr Ne Demektir?
Şunu düşünelim:int sayi = 10;
int *ptr = &sayi;
Burada:
ptr
sayi'nın adresini tutar.
&ptr
ise pointer değişkeninin kendi adresini verir.
Bu ikisini karıştırmamak önemlidir.
ptr ile *ptr Farkı
Çok önemlidir.ptr
adres değeridir.
*ptr
o adresteki gerçek değerdir.
Örneğin temsili:
ptr = 0x1000
*ptr = 10
şeklinde düşünülebilir.
&sayi ile ptr Farkı
Şu kod varsa:int sayi = 10;
int *ptr = &sayi;
şu iki değer aynıdır:
&sayi
ve:
ptr
Çünkü ptr zaten sayi'nın adresini tutmaktadır.
*ptr ile sayi Farkı
Aynı örnekte:*ptr
ve:
sayi
aynı değeri verir.
İkisi de:
10
olur.
Pointer Kullanırken En Tehlikeli Hatalar
Pointerlar güçlüdür ancak yanlış kullanıldığında ciddi hatalara neden olabilir.En yaygın sorunlar:
- NULL pointer
- Dangling pointer
- Wild pointer
- Dizi sınırını aşmak
- free sonrası pointer kullanmak
- Aynı belleği iki kez free etmek
- Yanlış pointer arithmetic
Double Free Nedir?
Aynı dinamik belleği iki kez serbest bırakmaya çalışmaktır.Yanlış:
free(ptr);
free(ptr);
Bu tanımsız davranışa neden olabilir.
Daha güvenli yaklaşım:
free(ptr);
ptr = NULL;
şeklindedir.
free(NULL) güvenlidir.
Use After Free Nedir?
Bellek serbest bırakıldıktan sonra tekrar kullanılmasıdır.Yanlış:
int *ptr = malloc(sizeof(int));
*ptr = 10;
free(ptr);
printf("%d\n", *ptr);
Son satır artık güvenli değildir.
Bu tür hatalar özellikle büyük C/C++ projelerinde ciddi problemlere yol açabilir.
Pointer ile Dizi Sınırını Aşmak
Örneğin:int sayilar[3] = {10, 20, 30};
int *ptr = sayilar;
şu erişimler geçerlidir:
*(ptr + 0)
*(ptr + 1)
*(ptr + 2)
Ancak:
*(ptr + 10)
geçerli dizi alanının dışına çıkabilir.
C sizi her zaman otomatik olarak durdurmaz.
Segmentation Fault Nedir?
Programın erişmemesi gereken bir bellek alanına erişmesi sonucunda ortaya çıkabilir.Örneğin:
- NULL pointer dereference
- Geçersiz pointer
- Dizi sınırı dışına çıkma
- Serbest bırakılmış belleği kullanma
Windows tarafında benzer hata:
Access Violation
olarak görülebilir.
Pointer Öğrenirken Ezber Yapmayın
Pointer'ı şu şekilde ezberlemeye çalışmak:& = şu
* = bu
tek başına yeterli değildir.
Her kodu şu sorularla okuyun:
- Hangi değişken değer tutuyor?
- Hangi pointer adres tutuyor?
- Pointer nereyi gösteriyor?
- Dereference edilince hangi değere ulaşılıyor?
Pointer Öğrenmek İçin Basit Egzersiz
Önce şu kodu yazın:int sayi = 25;
int *ptr = &sayi;
Daha sonra şunları ekrana yazdırın:
- sayi
- &sayi
- ptr
- *ptr
- &ptr
İkinci Egzersiz
Pointer kullanarak iki sayının değerini değiştiren bir fonksiyon yazın.Örneğin:
void swap(int *a, int *b)
{
int gecici = *a;
*a = *b;
*b = gecici;
}
Kullanımı:
int x = 10;
int y = 20;
swap(&x, &y);
Sonuç:
x = 20
y = 10
olur.
Bu pointer öğrenmek için en iyi başlangıç egzersizlerinden biridir.
Üçüncü Egzersiz
Bir diziyi pointer ile dolaşın.int sayilar[] = {10, 20, 30, 40, 50};
int *ptr = sayilar;
for (int i = 0; i < 5; i++)
{
printf("%d\n", *(ptr + i));
}
Bu örnek pointer ve dizi ilişkisini anlamanızı sağlar.
Pointer Öğrenme Sırası
Pointer konusunu şu sırayla çalışabilirsiniz:- Bellek adresi nedir?
- & operatörü
- Pointer değişkeni
- * dereference
- Pointer ile değer değiştirme
- Fonksiyona pointer gönderme
- Dizi ve pointer
- Pointer arithmetic
- NULL pointer
- Struct pointer
- Dinamik bellek
- Pointer to pointer
Yeni Başlayanların Yaptığı Yaygın Hatalar
& ve * İşaretlerini Karıştırmak
&adres alır.
*
pointer'ın gösterdiği değere erişebilir.
Pointer'a Normal Değer Atamak
Yanlış:int *ptr = 10;
Bu 10 sayısını normal değişken gibi pointer'a vermek anlamına gelmez.
Pointer geçerli bir adres göstermelidir.
Pointer Başlatmadan Kullanmak
int *ptr;*ptr = 50;
tehlikelidir.
NULL Pointer Dereference Etmek
int *ptr = NULL;*ptr = 10;
hatalıdır.
free Sonrası Kullanmaya Devam Etmek
Serbest bırakılan bellek tekrar kullanılmamalıdır.Dizi Sınırını Aşmak
Pointer kullanıyor olmak sınırları ortadan kaldırmaz.Pointer Kullanmak Her Zaman Gerekli mi?
Hayır.Özellikle modern C++ içerisinde birçok işlem:
- std::vector
- std::string
- Reference
- Smart Pointer
Ancak pointer mantığını anlamak yine de çok önemlidir.
Çünkü altında yatan bellek ve adres mantığını anlamanızı sağlar.
C#'ta Pointer Var mı?
C# içerisinde pointer desteği vardır ancak normal uygulamalarda genellikle kullanılmaz.Pointer kullanımı için çoğu durumda:
unsafe
kod gerekir.
C# otomatik bellek yönetimi yaptığı için günlük C# geliştirmenin büyük bölümünde klasik pointer kullanmanız gerekmez.
Ancak C ve C++ için pointer temel konulardan biridir.
Pointer Öğrenmek Neden Önemli?
Pointer öğrenmek yalnızca * ve & yazmayı öğrenmek değildir.Aynı zamanda şu soruları anlamanıza yardımcı olur:
- Değişken RAM'de nasıl tutulur?
- Fonksiyonlar veriyi nasıl alır?
- Diziler bellekte nasıl yerleşir?
- Dinamik bellek nasıl çalışır?
- Veri yapıları nasıl birbirine bağlanır?
Pointer Kontrol Listesi
- Bellek adresinin ne olduğunu biliyor muyum?
- & operatörünün ne yaptığını biliyor muyum?
- Pointer değişkeni oluşturabiliyor muyum?
- *ptr ifadesini anlayabiliyor muyum?
- ptr ile *ptr farkını biliyor muyum?
- ptr ile &ptr farkını biliyor muyum?
- Fonksiyona adres gönderebiliyor muyum?
- Pointer ile değişken değerini değiştirebiliyor muyum?
- Dizi ile pointer ilişkisini biliyor muyum?
- Pointer arithmetic mantığını biliyor muyum?
- NULL pointer nedir biliyor muyum?
- Dangling pointer nedir biliyor muyum?
- malloc ve free mantığını biliyor muyum?
- Struct pointer ile -> kullanabiliyor muyum?
- Pointer to pointer mantığını anlayabiliyor muyum?
Sonuç
Pointer, başka bir değişkenin bellek adresini tutan değişkendir.En temel pointer örneği:
int sayi = 10;
int *ptr = &sayi;
şeklindedir.
Burada:
sayi
değeri tutar.
&sayi
değişkenin adresidir.
ptr
bu adresi tutar.
*ptr
ise o adresteki gerçek değere ulaşır.
Pointer konusunu öğrenirken en önemli üç kavram:
Adres → Pointer → Dereference
şeklindedir.
Öncelikle normal değişken ve bellek adresini anlayın. Daha sonra pointer ile değişkene erişmeyi, fonksiyonlara adres göndermeyi ve dizilerle pointer kullanımını öğrenin.
Ardından:
NULL pointer → Struct pointer → Dinamik bellek → Pointer to pointer
konularına geçebilirsiniz.
Pointer ilk bakışta karmaşık görünebilir ancak adres ve değer farkı anlaşıldığında konu büyük ölçüde çözülür.
Kısacası:
Değişken değeri saklar, pointer ise o değerin bellekte nerede bulunduğunu saklar.



