PDA

Tam Sürümünü Görmek İçin : pointer hakkında


yenicheri
16/02/2006, 10:13
arkadaşlar

int sayi1 = 0;
int *ptr = &sayi ;

böyle bir kodla sayi değişkeninin adresine ve bu adresteki bilgiye ulaşabiliyoruz.

peki sayi değişkeninin adresini değiştirebilir miyiz.

örn:
ptr=&sayi; // değer 123546 çıktı
&sayi=2533666;// sayi inin yeni adresi 2533666 diyebilirmiyiz.

yada nasıl yapabilirim?


Revne
17/02/2006, 01:02
arkadaşlar

int sayi1 = 0;
int *ptr = &sayi ;

böyle bir kodla sayi değişkeninin adresine ve bu adresteki bilgiye ulaşabiliyoruz.

peki sayi değişkeninin adresini değiştirebilir miyiz.

örn:
ptr=&sayi; // değer 123546 çıktı
&sayi=2533666;// sayi inin yeni adresi 2533666 diyebilirmiyiz.

yada nasıl yapabilirim?

Sayi degiskeninin adresini degistiremezsin...

yenicheri
17/02/2006, 09:48
Sayi degiskeninin adresini değiştirmenin bir yolu yok mu?

Euclides
17/02/2006, 10:42
Sayi degiskeninin adresini degistiremezsin...
Değiştirebilirsin...

Revne
17/02/2006, 12:44
Değiştirebilirsin...

Nasil degistirebildigimizide soylersen daha net olur???

Euclides
17/02/2006, 12:59
Forum->Ara->Benim daha önceki mesajlarım

acehreli
17/02/2006, 20:18
Euclides, baska bir sey mi dusunuyorsun acaba? Cunku sayi adli degisken nerede oturuyorsa orada durur.

Aklima sayi'nin kopyasini almak geliyor; o zaman baska bir adrese o degeri koymus oluruz; ama yine 'sayi'nin adresinin degistiginden bahsedemeyiz...

Ali

Sabahi
19/02/2006, 09:29
Dusunmeden yazmisim vazcaydim.

yenicheri
20/02/2006, 11:40
çözümü bulamadım

ayrıca string ifadeler için neden pointerları int lerde olduğu gibi kullanamıyoruz?

acehreli
20/02/2006, 19:33
yenicheri, daha once de soylenmeye calisildigi gibi, bir nesnenin adresini degistiremezsin, cunku nesnenin bellekte oturdugu bir yer vardir ve orada oturmaktadir. Her bellek bolgesinin de degismez bir adresi oldugu icin bir nesnenin adresini degistiremezsin.

Istedigin sey programcilikta hic karsilasilan bir sey degil. Belki de soruyu yanlis soruyorsun... (?) Tam olarak ne yapmak istiyorsun?

Gostergelerin (pointer) string'lerle olan kisitlamalari su anda aklima gelmiyor. Biraz acar misin...

Ali

mekya
21/02/2006, 09:14
Pointer larla hafizadaki alanlara isaret edersin
sen &sayi=235466 yaparak pointerin isaret etttigi adresi degistiriyorsun
ama ilk yerde hafiza kaydettigin bilgi oldugu yerde kaliyor

hem &sayi ya rastgele sayilar mesela &sayi=12345 atamak hata almana neden olabilir bu yuzden yeni adresi malloc ve new kullanarak almalisin...

mekya
21/02/2006, 09:16
Pointer larla hafizadaki alanlara isaret edersin
sen &sayi=235466 yaparak pointerin isaret etttigi adresi degistiriyorsun
ama ilk yerde hafiza da kaydettigin bilgi oldugu yerde kaliyor

hem &sayi ya rastgele sayilar mesela &sayi=12345 atamak hata almana neden olabilir bu yuzden yeni adresi malloc ve new kullanarak almalisin...

Volkan Uzun
21/02/2006, 09:18
mekya sen hic
&sayi = 3333 gbi bisi deneyip calistirabildin mi?

yenicheri
21/02/2006, 09:37
mekya sen hic
&sayi = 3333 gbi bisi deneyip calistirabildin mi?

ben denedim çalışmadı.
asıl öğrenmek istediğim şuydu.

iki değişkenimiz var
int a;
int b;
ve ben bunların adreslerini birbiri ile eşitlersem
&a=&b
bunlar tek bir değer oldu anlamına mı gelir?
yada böyle bir şey olmaz mı?

string ifadeler ile ilgili sorum ise
string a="abc";
string* p;
p=&a;
yukarıdaki kodun çalışması gerekmez mi?

atg
21/02/2006, 13:03
ben denedim çalışmadı.
asıl öğrenmek istediğim şuydu.

iki değişkenimiz var
int a;
int b;
ve ben bunların adreslerini birbiri ile eşitlersem
&a=&b
bunlar tek bir değer oldu anlamına mı gelir?
yada böyle bir şey olmaz mı?

int a; şeklinde bir ifade yazarsan hafızadaki bir noktaya 16/32 bitlik bir değişken açılır. bu değişkene a yerine başka şekillerdede ulaşmak istiyorsan, o zaman pointer kullanırsın. mesele int *b = &a; yazarsan b değişkeni a değişkenini gösterir, hemen ardından *b = 4; yazarsan a değişkeninin değeri 4 olur ama b değişkeninin değeri hala a değişkeninin adresine eşittir. yani -senin tabirinle- 132646 gibi bir rakam.


string ifadeler ile ilgili sorum ise
string a="abc";
string* p;
p=&a;
yukarıdaki kodun çalışması gerekmez mi?
denemedim ama kodda bir yanlışlık sezemiyorum ben, çalışması gerekir, ancak şuda var sen *p = "abcxyz"; gibi bir ifade girdiğinde a isimli string in hala hafızada olması gerekir. bunlar stack-heap konularıyla ilgili meseleler.

mekya
21/02/2006, 18:44
mekya sen hic
&sayi = 3333 gbi bisi deneyip calistirabildin mi?


Ben boyle bir seyin calisacagini soylemedim...
Demek istedigim &sayi'ya hafizadaki herhangi bir adresin alaninini da atasan bu hata olmana neden olabilir yoksa &sayi=13546 ile bunu demek istedim ama &sayi=0x0012FF88 gibi bir sey desem daha dogru olurdu...

Yanlıs anlasima icin kusura bakmayin

Volkan Uzun
21/02/2006, 18:53
&sayi = readonly dir 12345, 0x0012FF88 gibi rakamlar atayamazsin

mekya
21/02/2006, 18:59
Eyvallah...

mazbil
22/02/2006, 10:57
Pointer'lar stringlerle de kullanılabilir. C'de string diye bir veri tipi yoktur. Bunun (string) yerine karakter pointer (char *) veya karakter dizisi (char arr[]) kullanılabilir. (char *) ve (char arr[])'nin ikisini de pointer'larla birlikte kullanmakta herhangi bir sıkıntı yoktur. Zaten pointer'ların kullanım amaçlarından biri de budur. Pointer kavramı oturunca hafızadaki string ile oynamak çocuk oyuncağı olur.

ben denedim çalışmadı.
asıl öğrenmek istediğim şuydu.

iki değişkenimiz var
int a;
int b;
ve ben bunların adreslerini birbiri ile eşitlersem
&a=&b
bunlar tek bir değer oldu anlamına mı gelir?
yada böyle bir şey olmaz mı?

string ifadeler ile ilgili sorum ise
string a="abc";
string* p;
p=&a;
yukarıdaki kodun çalışması gerekmez mi?

Birinci sorun cevabı: olmaz. İki değişkeni aynı adreste tutamazsın. Bu fiziksel olarak mümkün değil zaten. Buna da niçin ihtiyaç duyuyorsun?

İkinci sorun ise kullandığın dilde (C değil) string varsa -mantık olarak- doğrudur.

"Call By Value" ve "Call By Reference" konularını internetten bulup incelersen biraz daha olaylar netleşir gibi. Sorduğun konuda biraz kavramsal sıkıntın var gibi.