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

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

secretagent

#include <stdio.h>

int main()
{
   int *ptam, tam = 33;

   ptam = &tam;    /* ptam -> tam */

   printf("&tam  = %p\n",&tam);
   printf("ptam  = %p\n",ptam);
   printf("\n");

   printf("tam   = %d\n",tam);
   printf("*ptam = %d\n",*ptam);
   printf("\n");

   *ptam = 44;     /* tam = 44 anlamında */

   printf("tam   = %d\n",tam);
   printf("*ptam = %d\n",*ptam);

 return 0;
}


EKRAN ÇIKTISI

&tam  = 0x3fffd14
ptam  = 0x3fffd14

tam   = 33
*ptam = 33

tam   = 44
*ptam = 44


umarım aradığın budur...

JKramer

Alıntı yapılan: Klein - 08 Şubat 2012, 00:09:07
"%ld" ile dener misin?
Yok, aynı sonuç. Gcc (Mingw32) ile derliyorum, siz hangi derleyicide denediniz?

Klein

#17
keil

@secretagent  aradığım o değildi. 
Şöyle bir soru sorayım. çözüm ararken ne aradığımızı daha iyi kavrarsın:
int a;
int b;
int *p;
p = &a;
p'nin gösterdiği adres 5 ise  b'nin 5. bitini set et.  p'nin gösterdiği adres 15 ise,  b'nin 15. bitini set et.

Not:
Sorun çözüldü. Kasıt operatörü ile.  Şu an alternatif önerileri konuşuyoruz.

justice_for_all

Deneyip de başaramayanları değil, yalnızca denemeye bile kalkışmayanları yargıla.   Gökhan Arslanbay

Klein

b=b&(1<<p);   error:  #847: expression must have integral or enum type

doğrusu

b= b &(1 << (int)p);

justice_for_all

Alıntı yapılan: Klein - 08 Şubat 2012, 11:32:39
b=b&(1<<p);   error:  #847: expression must have integral or enum type

b=b&(1<<(int)p);


bide boyle denermisiniz bu arada hangi derleyicide derliyosunuz?
Deneyip de başaramayanları değil, yalnızca denemeye bile kalkışmayanları yargıla.   Gökhan Arslanbay

Klein

Alıntı yapılan: Klein - 08 Şubat 2012, 11:32:39
b=b&(1<<p);   error:  #847: expression must have integral or enum type

doğrusu

b= b &(1 << (int)p);

Sanırım mesajın tamamını okumadan yazdınız. Typecasting ile oluyor. Zaten öyle de olması gerek.

justice_for_all

simdi bir program denedim ccsde calısıyor sizin derleyicide calısırmı bilemem.

typedef union{
	unsigned char structbyte;
	struct{
    	unsigned  bit_1 : 1;
    	unsigned  bit_2 : 1;
    	unsigned  bit_3 : 1;
    	unsigned  bit_4 : 1;
    	unsigned  bit_5 : 1;
    	unsigned  bit_6 : 1;
    	unsigned  bit_7 : 1;
    	unsigned  bit_8 : 1;
  }bits;
} test;



test *p,a1,b1;


 p.structbyte= &a1.structbyte;
 b1.structbyte=p.structbyte;
Deneyip de başaramayanları değil, yalnızca denemeye bile kalkışmayanları yargıla.   Gökhan Arslanbay

yamak

Alıntı yapılan: Klein - 08 Şubat 2012, 11:32:39
b=b&(1<<p);   error:  #847: expression must have integral or enum type

doğrusu

b= b &(1 << (int)p);
Hocam aradaki işlemin & değil de | olması gerekmiyo mu? Sizin yazdığınız gibi olursa örneğin b'nin sadece 5. biti 1 ise sadece 5. bit '1' olur geri kalan tüm bitler '0' olur eğer 5.bit '0' ise yine 0 olarak kalmaz mı? Yoksa yanlış mı düşünüyorum?

Klein

@justice_for_all  bu kodla adresi elde etmiş olmadık ki.  a1'in bir baytını b1'in bir baytına attık.

@yamak  oraya takılma. konu başka bir konu olduğu için o önemli değil. bu başlığı ilgilendiren kısım (int)a kısmı. 

muhittin_kaplan

Aslında benim aklıma konuyla alakalı başka bir soru geldi.
şimdi Sayi adında bir int değişkenimiz olsun
int Sayi;

Bu değişkenin Adresini Almak İçinde Pointer Tanımlayalım
int *P;

bunların gerçekte uzunlukları Aynımıdır ?

Adres ve Data Uzunlukları Farklı olan İşlemcilerde Durum Dahada iyi anlaşılır (örn 16f piclerde) 

z

Bu adres bus genişliği ile alakalı.

Örneğin 16 bit işlemcinizde inteğer değerler 16 bit ile ifade ediliyor fakat bu işlemci 1Mb alanı adresleyebiliyorsa

int pointer 20 bit değer alacak demektir.

Bana e^st de diyebilirsiniz.   www.cncdesigner.com

muhittin_kaplan

Bu Açıdan Neden int tanımladığımız değişkenin adresinide int, short tanımladığımızı short yapıyoruz ?
Bu tanımladığımız Pointer RAM bölgede yer kaplıyor değil mi ? ozaman 16bit gereken bir yerde biz 32bit yer ayırmış olmuyormuyuz ? yada long tanımlı bir pointerde tam tersi olmuyor mu ? (32 bit gerekirken değişkenimiz 64 diye pointeri de 64 tanımlamak durumundayız )

justice_for_all

Alıntı yapılan: Klein - 08 Şubat 2012, 14:52:00
@justice_for_all  bu kodla adresi elde etmiş olmadık ki.  a1'in bir baytını b1'in bir baytına attık.

p.structbyte= &a1.structbyte;
bu adres atamak değilmi ben mi yalnıs biliyorum ? hadi ben yalnıs biliyorum diyelim mplab sim dem yalnıs simule ediyor?

mplabda simule ettigimde a1in adresi 0x1c olarak gordum sonra bu adresi p pointerine attım sonrada pointer degerini b değişkenine atadım donusum yapmadan.ve b1 in byte degişkeninde 0x1c degerini ve buna baglı olarakda 0x1c nin bitlerine ayrılmıs seklini gordum

sonuc olarak

b= (int)p);

bu veya
b= p);


derkeyiciye gore değistigine kanaat getirdim.(sizin derleyicinizde olmadığını varsayarak..)
Deneyip de başaramayanları değil, yalnızca denemeye bile kalkışmayanları yargıla.   Gökhan Arslanbay

z

Alıntı yapılan: muhittin_kaplan - 09 Şubat 2012, 00:07:05
Bu Açıdan Neden int tanımladığımız değişkenin adresinide int, short tanımladığımızı short yapıyoruz ?
Bu tanımladığımız Pointer RAM bölgede yer kaplıyor değil mi ? ozaman 16bit gereken bir yerde biz 32bit yer ayırmış olmuyormuyuz ? yada long tanımlı bir pointerde tam tersi olmuyor mu ? (32 bit gerekirken değişkenimiz 64 diye pointeri de 64 tanımlamak durumundayız )

Degiskenin ne olursa olsun buna erisecek pointer hep adres saklar. Ornegin 32bit islemcinin adres busi da 32 bit ise bu durumda pointerlerin tamami 32 bit demektir.
Sen istersen 64 hatta 128 bit veri sakla buna erisecek pointer gene 32 bit olacaktir.

Alıntı Yap
Bu Açıdan Neden int tanımladığımız değişkenin adresinide int, short tanımladığımızı short yapıyoruz ?


Burda nuans farki var.

Short tanimli degiskenlere erisecek pointeri short tanimlamiyoruz. Diyoruz ki, sen short degiskenlere ulasacak bir pointersin. Burada adi gecen short, daha acik ifadeyle short*, short degiskenlerin pointeri demek.

Bana e^st de diyebilirsiniz.   www.cncdesigner.com