Pointer'lar Ne İşe Yarar Ve Ne Gibi Faydalar Sağlar.
-
Forumda arama yaptım çok eski bir konu var ondada çok detaya inilmemiş yüzeysel bilgiler var.Bu pointerların tam olarak kullanım amacı nedir / nasıl kullanılır , efektif olarak nasıl kullanabiliriz.C++ altına açtım konuyu ama ben bunları php'de kullanacağım daha çok.
-
faydası daha az hafıza tüketimi yapar program.
-
pointerlar (turkceye isaretliyici olarak geciyordu sanirim) C# daki referans etme ile ayni sekilde kullaniliyordu C++ da; obje gonderiminde basina * koyuyorduk galba (yoksa delphidemiydi oyle hatirlamiyorum en son lisede kullandim bunlari)
kullanim mantigi bir objenin bir fonksiona yada classa yollanmasi yerine onun bellekte bulundugu yerin yollanmasi sekildedir. bu sayede 2 tane avantaj elde etmis oluruz.
1. avantajimiz fonksiona referans ile yada point ile yolladigimiz nesne de yaptigimiz degisiklikler return aldiktan sonra ki programda devam eden kisimde aynen gecerlidir
turkcem cok iyi olmadigindan biraz devrik oldu ama soyle ornek vereyim bir degiskene elma yazdin bunu pointer ile yolladigin bir fonksionda armut yaptin sonra ana program dondugunde armut kalacaktir; ama direk yollarsan o fonksion icin ramde yeni bir yer acili (elma clonelanir) yeni acilmis yerde islem yapili (clone uzerinde) sonra program kaldigi yerden devam ederken eski (ilk atanmis elma) uzerinden calismaya devam edilir. Paremetreler den return almaya yaramis oldu bu avantajda
2. avantajida ram kullanimi illk avantajin icinde dedigim gibi direk kullanimda Ram de yeni alan acilacaktir; bu alan ram kullanimi artirimi yapacak.
2. olan tabiki avantaj ama 1. her zaman avantaj degildir.
-
fiziksel belleğin isletim sistemi tarafindan referanslanmis hucrelerine direk erisimdir.
Bazen hafizadan kazanmak adina kullanılabilir.
Ornegin c familyasında fonksiyonlara parametre girdiginde aynı parametreler hafızada duplicate olur.
Bunu engellemek icin kullanabilirsin. Bunun dısında "dynamic processing" mutlaka bunların vasıtasıyla olur.
Java'da pointer yerine daha guvenle kullanabilecegin referans kavrami vardir. Perl'de her ikisi birden fln...
-
Pointer diye görünce bende hemen bildiklerimi yazayım dedim ama meğerse benim bildiğim pointer senin bildiğin pointer ile uymuyormuş :))
-
Jubei bunu yazdı:
-----------------------------
Pointer diye görünce bende hemen bildiklerimi yazayım dedim ama meğerse benim bildiğim pointer senin bildiğin pointer ile uymuyormuş :))
-----------------------------Senin pointer'ıda yaz aga bişey olmaz herkese kapımız açık :F
-
sokoban bunu yazdı:
-----------------------------
Jubei bunu yazdı:
-----------------------------
Pointer diye görünce bende hemen bildiklerimi yazayım dedim ama meğerse benim bildiğim pointer senin bildiğin pointer ile uymuyormuş :))
-----------------------------Senin pointer'ıda yaz aga bişey olmaz herkese kapımız açık :F
-----------------------------
Eyvallallh sağolasın,Benim bildiğim ve daha önce kullandığım pointer şudur,doğuda askerlik yapanlar bilir G3 ucuna takılır,çıplak gözle görülmez ve sadece gece görüş ile görünür laser pointer diye geçer nokta göstermek içindir.
Ben demiştim sana benim bildiğim pointer ile senin bildiğin pointer uymuyor diye ama olsun en azından benim bildiğim pointer,i bilmiyenler öğrenmiş oldu :))
(Bu arada çalışmanda allah kolaylık versin) -
biçok yerde kolaylık sağlar
char dizi[200],*p;
p=dizi;
for(int i=0;i<5;++i)
{
strcpy(p,"Merhaba Dunya ");
p+=(strlen(p));
}
printf("%s",dizi); -
Pointerlar yani türkçe olarak göstericiler adres kavramıyla ilgili bir konu.Nesnemizin nasıl değeri,türü,bilinirlik alanı(scope),ömrü varsa adreside vardır.Adres bize nesnenin bellekte bulunduğu yeri gösterir.İçinde adres tutan değişkenlere pointer diyoruz.
Resimde p bir pointer x de bir değişken.p int * türden bir pointer (int yıldız diye okuyabiliriz.) x int türden bir değişken.x double türden olsaydı pointer da double yıldız türünden diyecektim.x in içinde 30 var diyelim.x in sag üstündeki 1FF4 x in adresi olsun diye salladım.simdi ordaki p x in adresini içinde tutuyo.
* içerik operatoru
& adres operatoru
*p dediğim zaman p ye bakıyorum içinde ne var 1FF4 var yani x in adresi yani x in kendisi resme göre *p nin değeri 30 dur.
* görünce içine bak gibi düşünebiliriz.
&x dersemde x in adresini göstermiş olurum &x in degeri = 1FF4
#include
int main()
{
int x; // int türden bir değişken yarattım x in türü int
int *p; // int yıldız türden bir pointer yarattım p nin türü int* (int yıldız)
p = &x; // x in adresini p nin içine koydum
*p = 50; // *p ye 50 atadım p nin içinde x in adresi oldugu için x e atamıs oldum
printf("x = %d\n", x); // ekrana 50 yazıcak
return 0;
}
pointer konusu cok ayrıntılıdır tabikide kısaca ne olduğunu anlatmaya calıstım özetle içinde adres tutan değişken.
-
C++ için basit kısa geçeyim....
Öncelikle pointer değişkenler int değişkenlerde farksızdır. Yani int değişken ne tutar? Tamsayı!!!!
Pointer değişkenlerde tamsayı tutar. Yani int bir değişkendir aslında. Ama farkı şudur. Pointer değişkenlerin tuttuğu sayılar önemlidir. Bu sayılar belleğin hücrelerinden birini temsil eder. (Genel bellek şemasını düşün her bellek hücresi 1 bytedır ve her byte ın kullanımı için o hücrenin sayısal bir adresi vardır.)
int x=1;
int *ptr;diyelim.
normalde x 4 byte bellekte yer kaplayan değişken olduğunu biliyoruz (32 bit bir derleyici ve işletim sisteminde)
Yani x bellekte 4 tane hücre kaplıyor.
00000000 (1. hücre Adresi:2DFFD1)
00000000 (2. hücre Adresi:2DFFD2)
00000000 (3. hücre Adresi:2DFFD3)
00000001 (4. hücre Adresi:2DFFD4)ptr=&x;
dediğimiz zaman derleyici x'in 1. hücresinin adresini ptr değişkenine atıyor.
Yani ptr değişkenin içeriği 2DFFD1 oluyor (Sayıları sallıyorum mantık arama. 16 tabanındaki sayı sistemine göre söylüyorum.)cout << ptr; // dediğin zaman 2DFFD1 sayısını görürsün..
cout << *ptr; // dediğin zaman ekrana x in değeri olan 1 yazdırır.pointer değişkenlerin tek farkı *ptr gibi bir biçimde kullanıyor olmamız
*ptr=3 dediğimiz zaman derleyici şunu yapıyor...
ptr değişkenin içeriğindeki 2DFFD1 (yani x in 1. hücresi) adresinden itibaren toplam 4 byte boyunca (4 hücre boyunca) ki boyuta 3 yaz diyor. (peki neden 4 byte yani ptr sadece adres taşıyor? çünkü her pointer değişkenin hangi tip değişkeni tutacağını zaten başta belirtiyorsun. INT *ptr; dediğinde zaten int bir değişkende işlem yapacağım, 4 byte üzerinde işlem yapacağım diyorsun.)
Yani şu oluyor
00000000 (1. hücre Adresi:2DFFD1)
00000000 (2. hücre Adresi:2DFFD2)
00000000 (3. hücre Adresi:2DFFD3)
00000011 (4. hücre Adresi:2DFFD4)Olay budur. pointer kavramını anlaman için çok örnek çözmen gerekli. pointerın pointer ı pointer referansları, void pointer hepsi ayrı bir örnektir. Hepsini denemen gerek mantığını kavraman için. Ama basit bir konudur.
-
Bir nevi posta kutusudur.. Posta kutusu şeklinde bir değişkendir.. Diğer değişkenlerin bellek adreslerini tutarlar..
örneğin "k " diye tam sayı bir değişkenimiz olsun... derleyici bu "k" için bellekte bir yer ayırır.. fakat bu belleğin adresi nedir?
bunu için bir adres saklayan başka bir değiken tanımlayabiliyoruz bu da "a" olsun..
bunu bildiriken
int *a; // diyoruz.. yani "a bir tam sayı değişkeninin bellek adresini tutar" diyoruz..
sonra "k" nın adresini a ya yüklemek için de
a=&k //deyimini kullanyoruz
cout<
dediğimizde 00ff1212 gibi bir adres çıktısı alaırız [k nın adresi]
ancak
cout<<*a;
dediğimizde a da hengi değişkenin adresi tutuluyorsa onun "değeri" basılır..
örneğimizde k nın değeri 10 olsaydı 10 , 20 olsaydı 20 [k değişkeninin o an taşıdığı , sahip olduğu değer}
eğer
*a=50; dersek adresteki değeri yani bu örneğimizde k yı 50 yapmış oluruz [ hangi değişkenin adresini tutuyorsa direk adrese teslim yükleme ]
edit
şurdaki ördek güzel