Merhaba.
Bu yazı C’de pointerları çalışırken aldığım notlardır.
Bu pointerların vikipediadaki tanımı:
Programlama dillerinde bellek adreslerini saklayan değişkenlere verilen genel isim. Bir programlama dilinde herhangi bir değişkeni tanımladığınızda hafızada ona bir yer ayrılır. İşaretçiler bu hafıza alanlarının adreslerini tutarlar
Bu konuyu anlamamda yardımcı olan şeylerin başında değişkenlerin tanımı geliyor. İşte birbaşka tanım
Değişkenler, bir bilgisayar programında değerleri saklamak için kullanılan, bilgisayar bellek konumlarına verdiğiniz adlardır.
Hepinizin zaten bildiği gibi bir bir programlama dilinde değişken tanımladığımızda değeri memory’e konulur.İsmi ilede Bu değişkenin değerini memory’den alırız.
Basitçe aşağıdaki gibi yazacağımız bir program ile memory’deki yerimizi görelim.
#include <stdio.h>
int main() {
short age = 20;
printf("Address of age variable %p \n", &age);
return 0;
}
Çıktı tabiki her çalıştırdığımızda farklı olucaktır.
Örnek çıktı:
Address of age variable 0x7ffe5886c856
Bu örnekte 0x7ffe5886c856 değeri bizim ram bellek üzerinde short tipindeki age değişkenimiz için işletim sisteminin ayırdığı alan.
Pointer
Pointer, başka bir değişkenin adresini, yani bellek konumunu(az önce ekrana yazdırdık) tutarlar.
Pointerlar değişkenler gibi tanımlanırlar.Sadece başlarında *(asteriks) işareti bulunur.
Hemen bir örnek yapalım.
short *age_p; /* pointer to an short */
printf("Address of age_p variable %p \n", &age_p);
Daha önce üzerinde çalıştığımız programa yukarıdaki satırları ekliyorum.
Address of age variable 0x7ffe1b87255e
Address of age_p variable 0x7ffe1b872560
Gördüğünüz gibi age_b memory’de farklı bir yerde.Aralarındaki fark değişken direk veriyi tutuyor.Pointer ise asıl verinin durduğu değişkenin adresini tutuyor.
Şu ana kadar elimizde short tipinde bir değişken ve onun adresini tuması için tanımladığımız bir pointer var. Aşağıdaki blokta yapacağımız tanımlama ile artık memory’de age_p’nin içerisinde age değişkeninin adresi duruyor. Başına * işareti koayarak değerini yazarsanı veya değiştirirseniz. Aslında age değişkeninin değerini değiştireceksiniz.
age_p = &age; printf("Value of age_p pointer %d \n", *age_p);
Valıe of age_p pointer 20
Programın son halinde ise memory aşağıdaki gibi olucaktır.
Gördüğünüz gibi aslında pointer olarak tanımladığımız değişken asıl değeri tutan değişkenin adresini tutuyor. * işareti ilede eriştiğimizde bu alana gidip buradaki değer ile işlem yapıyor.
Basitçe neden pointler kullanıyoruz.
— Aklımıza gelen ilk madde bellek tasarrufu.Anlaşılır olması açısından bu örneği short gibi küçük bir veri tipi ile yaptık. Peki ya daha büyük veri tipleri ile çalışsaydık.Bunları fonksiyonlara parametre olarak geçtiğimiz zaman compiler bu veriyi memory üzerinde kopyalayacaktır. Buda büyük objelerde bellekteki verimi düşürecektir. Bunu yerine eğer referansını geçerseniz fonksiyonun içerisindeki işlem doğrudan memory’deki yerinde yapılacaktır.Memory’deki tekrarları engellememizi sağlar. Ayrıca bknz( https://metinagaoglu.com/call-by-value-call-by-reference )
İterasyon sırasında hızı artırabilirler: örneğin bir arrayi gezmek isterseniz, indis değerini yinelemek için sadece bir for döngüsü yazarsınız, ancak gerçekte bellek adresini artırmış olursunuz. Dolayısıyla, performansa duyarlı bir kodlama yapıyorsanız, önce indisi artırmak ve ardından bellek adresini güncellemek yerine, pointer ile doğrudan bir sonraki bellek konumuna gidip performans iyileştirmesine erişebilirsiniz.
Yapılan değişiklikler her yerde aynıdır: bağımsız thread’ler ile çalışan bir programınız olduğunu varsayalım.Her biri için aynı verilerin kopyasını oluşturmak yerine, onlara orijinal verilerin adresini sağlarsınız ve böylece değerde herhangi bir değişiklik yapılırsa, her thread en son güncellemeleri alır.
Şimdilik bu kadar.Pointerlar ile ilgili aritmetiği vb. gibi konulardada özet yazılar yazmayı planlıyorum.
Kaynaklar
https://www.tutorialspoint.com/cprogramming/c_pointers.htm
https://www.quora.com/Why-we-use-POINTERS-in-programming-whats-the-practical-use