İşaretçinin gösterdiği adresi elde etmek

Başlatan Klein, 07 Şubat 2012, 19:23:18

Klein

int x;
int *y;

y =  &x

y?

y nin gösterdiği adresi bir değişkene atmayı başaramadım. Gösterilen adresin içeriğini değil. Adresin kendisini. yani y nin içeriğini.
Bütün kitaplar ve örnekler adresi göstermek için printf("%p",...) kullanmış.

mcn

Serdar Çiçek in CCS C kitabında da bu şekilde anlatılıyor ama?

char k;   / / char tipinde k isminde degisken tanimlaniyor.
char *x;  / / x adinda gösterici tanimlaniyor.
k = 'a';   / / k degiskeninin içine a karakteri ataniyor.
x = &k;  / / k degiskenin adresi x isaretçisine ataniyor.



www.teknikyazi.com --üşenme,erteleme,vazgeçme...

fryrmnd


Klein

olsa iyi olur. ama derleyici çok kızıyor böyle yapınca :)

Klein

Alıntı yapılan: mcn - 07 Şubat 2012, 19:54:10
Serdar Çiçek in CCS C kitabında da bu şekilde anlatılıyor ama?

char k;   / / char tipinde k isminde degisken tanimlaniyor.
char *x;  / / x adinda gösterici tanimlaniyor.
k = 'a';   / / k degiskeninin içine a karakteri ataniyor.
x = &k;  / / k degiskenin adresi x isaretçisine ataniyor.

aradığım şey işaretçiye adres atamak değil. işaretçiye atanan adresin ne olduğunu öğrenmek.

fryrmnd

vallahi  genelde bana  hiç yüz vermiyor bu derleyiciler zaten. yada ben gönüllerini alamıyom  :)

JKramer

char z[8];
sprintf(z,"%p",y);

Böyle oluyor ama başka bir yolu vardır herhalde :).

Klein

"%p" ile adresi string olarak alıp sonra  sayıya çevirmeyi de düşünmedim değil :) 
eğer bilen biri çıkmazsa printf fonksiyonunun deklarasyonuna kadar gideceğim. eğer oradan da çözemezsem,
son çözüm  bu şekilde komik bir çözüm. 

Tagli

Alıntı yapılan: fryrmnd - 07 Şubat 2012, 19:56:21
int x;
int *y;
int z;,
z=y;

değil mi hocam?

int *z; olarak tanımlanırsa olur sanırım.

Denemedim ama casting ile de olacağını sanıyorum:
int z;
z = (int)y;
Gökçe Tağlıoğlu

Klein

#9
iki veri tipi de aynı olduğu için casting kullanmayı düşünmemiştim. :)
evet casting ile oluyor.  :)


üzerine biraz düşününce,  neden casting gerektiğini çözdüm.
pointer ve değişken tipleri aynı gibi görünse de aynı değil aslında. birisi int tipinde diğeri ise  adres tipinde bir değişken.
pointerin int pointer olması int tipinde olduğu anlamına gelmiyor.

JKramer

#10
z = (int)y; şeklinde en başta denemiştim ama bende olmadı, enteresan :).

Ekleme:
   
int x,z;
//	char z[8];
	int *y;

	x=0x12345678;
	y =  &x;
	z=(int)y;

	printf("\n Value z=%d",z);

%d yerine %p yazarsak oluyor ama derleyici doğal olarak "warning: format '%p' expects type 'void *', but argument 2 has type 'int'|" uyarısı veriyor.

elektronikhobi

Alıntı yapılan: Klein - 07 Şubat 2012, 19:23:18
int x;
int *y;

y =  &x

y?

y nin gösterdiği adresi bir değişkene atmayı başaramadım. Gösterilen adresin içeriğini değil. Adresin kendisini. yani y nin içeriğini.

Tam cevap yazmıştım. Baktım soruyu yanlış anlamışım gibi geldi. y'nin gösterdiği adresi başka bir değişkene atmak istiyorsan basitçe başka bir int* türünde gösterge tanımlayıp y'ye atama yaparsın.

int *a = y;

gibi.. Sorunu yanlış anladığımı düşünerek ilk yazdığım cevabı da gönderiyorum.

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char **argv)
{
    char harf = 'H';
    char *p = &harf;
    char **a = &p;

    printf("a'nin adresi: %p\n", a);
    printf("a'nin gosterdigi p'nin adresi: %p\n", *a);

}

Klein

@JKramer  atamaya hata vermiyor  "%d" ile görüntülemeye mi hata veriyor?

@elektronikhobi
iki durumda da yanlış anlaşılma var.
1. cevap  int *a = y; yine işaretçi tanımlamış oluyoruz. bizim istediğimiz adresi  sıradan bir int değişkene almaktı.

2. cevapta da yine adresi  elde edemiyoruz. printf("%p",...) fonksiyonu ile adresi gösteriyoruz. ama biz o adresi alıp bir yerde kullanmak istiyoruz
örneğin   x sayısını a'nın adresi kadar kaydırmak istiyoruz.  ya da  for(i=0,i< a'nın adresi, i++) gibi.



JKramer

%p ile görüntülemeye uyarı veriyor ama adresi doğru gösteriyor. %d ile uyarı vermiyor ama adres hatalı. Zaten adresi z'ye atadıktan sonra artık %d ile görmemiz lazım sanırım.

Klein