Konuyu görüntüle
IUCODERS FORUM > Programlama > C / C++ > C Pointer Soru???
Yazar
altuko


avatar

banlandı
Kayıt: 05.02.2006
31.01.2008-03:36 #36604
Arkadaşlar aşağıdaki kodda anlayamadığım nokta şu;sonuçta tanımlanan yapının içerisinde bir pointer var bu pointer nasıl bir işlev görüyo da print ettiğimiz zaman maca as yazısını görüyoruz.net olarak yerleştiremedim kafama mantığını.sonuçta bir adres tutuyo taraf ve takım ifadeleri.a ve m nin adreslerini tutuyosa print edince o adresleri göstermesi lazım..derdimi tam anlatamış olabilirim.programlamadan fazla anlamam:) yardımcı olursanız sevinirim.teşekkürler....



include <stdio.h>

struct kart {
char *taraf;
char *takim;
};


int main()
{
struct kart a;
a.taraf = "as";
a.takim = "maca";

printf("
%s
",a.takim);
printf("
%s
",a.taraf);



return 0;
}





Yazar
clairvoyant


avatar
Antalya
Kayıt: 05.05.2006
31.01.2008-04:02 #36605
silindi: hatalı bilgi (o kadar ilaç alırsam böyle olur tabi :D)

Ama sonuçta şu önemlidir ki bu string'ler için bellekten yer ayırmak gerekir.

dinamik olarak
a.taraf = (char*)malloc(sizeof(char)*10);

statik olarak
struct kart {
char taraf[10];
char takim[10];
};


Ve string atamalarında sprintf fonksiyonunu kullanmanı öneririm.

sprintf(a.taraf, "as");
sprintf(a.takim, "maca");


http://www.cplusplus.com/reference/clibrary/cstdio/sprintf.html





Let`s make this world a better place to live !

Yazar
altuko


avatar

banlandı
Kayıt: 05.02.2006
31.01.2008-04:08 #36606
Deitel C/C++ kitabında bir örneği aynen yazdım.Bir çok üniversite de okutulan kitap(bizim ki de dahil).
Senin anlattığın yöntemleri biliyorum.ben de senin gibi düşünüyorum.Ama kitapta böyle örnekler var.ve ben anlamadım.neyse..benim de kafa bi dünya......anlatamıyorum derdimi...:):)





Yazar
altuko


avatar

banlandı
Kayıt: 05.02.2006
31.01.2008-04:09 #36607
ona benzer bir örnek...umarım daha iyi anlatabilirim bu örnekle derdimi...


#include <stdio.h>


int main()

{

const char *stringPtr = "Bu da bir stringtir";
printf("%s
",stringPtr);



return 0;

}






Yazar
clairvoyant


avatar
Antalya
Kayıt: 05.05.2006
31.01.2008-04:20 #36608
İlk örnek ile ikinci örnek farklı. Bir karakter dizisine tanımlama sırasında bir string atanabilir. Hemen hemen tüm derleyiciler destekler bu tip atamayı. Pointer için bellekte gereken uzunlukta yer ayrılır ve değerler yerleştirilir. Ama ilk örnek bir kitapta geçiyor olsa bile doğru olduğunu kabul etmiyorum. Çünkü karakter dizileri için önceden bellekten alan ayırmak şart.

Şimdi denemeden içim de rahat etmez, illa VS kuracağım bu saatte di mi :))





Let`s make this world a better place to live !

Yazar
altuko


avatar

banlandı
Kayıt: 05.02.2006
31.01.2008-04:26 #36609
peki sen benim anlamadığım noktayı anladın mı?stringPtr nin değerini yazdırınca "bu da bir stringtir" yazısı çıkıyo,ve bu olay benim kafama yatmadı.stringPtr bir adresi tutuyo dimi.neyin adresini tutuyo.ama yazdırınca adresini tuttuğu string i döndürüyo.ben bu işi anlamadım valla...





Yazar
clairvoyant


avatar
Antalya
Kayıt: 05.05.2006
31.01.2008-04:29 #36610
altuko yazdi
 
peki sen benim anlamadığım noktayı anladın mı?stringPtr nin değerini yazdırınca "bu da bir stringtir" yazısı çıkıyo,ve bu olay benim kafama yatmadı.stringPtr bir adresi tutuyo dimi.neyin adresini tutuyo.ama yazdırınca adresini tuttuğu string i döndürüyo.ben bu işi anlamadım valla...

O printf'in özelliğidir. "%s" yerine "%d" yazarsan stringPtr'nin adresini görürsün (öyle olması lazım :D).





Let`s make this world a better place to live !

Yazar
altuko


avatar

banlandı
Kayıt: 05.02.2006
31.01.2008-04:34 #36611
ben denedim.dediğin doğru.ama yine bir sorun var,diyelim ki %s dediğimiz de o adreste tutulan değeri döndürsün.o adreste string in tümü tutulmaz ki.en fazla ilk harfi tutulur.o adresten başlayıp,null gördüğü yere kadar mı okuyo acaba.öyleyse helal olsun C diline yani:)





Yazar
barbi


avatar
istanbul
Kayıt: 24.01.2006
31.01.2008-04:35 #36612
C dilinde string ifadeleri derleyici tarafından char türden bir adres olarak ele alınır. Yani derleyici kodu okurken bir string ile karşılaşınca onu belleğe yerleştirir ve string yerinede o adresi koyar. Bu nedenle bir stringi char türden bir pointera atamanda bir sorun yok.
Sanırım senin takıldığın yer bir adresteki veriyi yazdırma kısmı. Printf in formatlama karakterlerinden %s ile bir adres verisini yazdırmaya çalışırsan, standart çıktıya o adresteki karakterleri yazar. string ifade daha önceden belleğe yerleştirildiği için ve boyutu da bilindiği için o karakter stringi yazdırabilirsin. O adresi yazdırmak istiyorsan %p ile yazdırabilirsin.
Ama stringlerle işlem yaparken dikkat et. C de stringler global nesneler gibi yer kaplarlar ve stringlerin değiştirilmesi tanımsız davranıştır.





people pray for strength, and guidance; they should pray for the mercy of a swift death...


Yazar
altuko


avatar

banlandı
Kayıt: 05.02.2006
31.01.2008-04:50 #36613
programlama bilgimin yetersizliğinden olsa gerek,hala olayı tam kavramış değilim.şöyle anlatsam daha mantıklı..

int *ptr;
ptr = 4;

yukarıdaki atama hata veriyo.bu mantığa göre verdiğim örneğinde hata vermesi lazım.


verdiğim örnekte ise char * türden bir stringPtr ye bir string atanmış. sonuçta stringPtr bir karakterin adresini tutabilir durumda.ama printf le yazdırdığımızda string in tamamını döndürüyo.stringptr neyin adresini tutuyo???nasıl oluyo halen anlamadım.ve halen anlatamıyorum..





Yazar
altuko


avatar

banlandı
Kayıt: 05.02.2006
31.01.2008-04:55 #36614
barbi aslında güzel bir açıklama yaptın.hafiften anladım sanki tekrar okuyunca....string konusuna bi bakmam lazım...Ben stringlerin bir adres gibi algılandığından habersizdim.





Yazar
clairvoyant


avatar
Antalya
Kayıt: 05.05.2006
31.01.2008-05:05 #36615
altuko yazdi
 
.....o adresten başlayıp,null gördüğü yere kadar mı okuyo acaba.öyleyse helal olsun C diline yani:)

Hakkaten helal olsun C diline, kim bulduysa Allah razı olsun, Allah tuttuğunu altın etsin icad edenin.biggrin





Let`s make this world a better place to live !

Yazar
nipci


avatar

Kayıt: 26.09.2007
31.01.2008-09:05 #36618
altuko yazdi
 
programlama bilgimin yetersizliğinden olsa gerek,hala olayı tam kavramış değilim.şöyle anlatsam daha mantıklı..

int *ptr;
ptr = 4;

yukarıdaki atama hata veriyo.bu mantığa göre verdiğim örneğinde hata vermesi lazım.


verdiğim örnekte ise char * türden bir stringPtr ye bir string atanmış. sonuçta stringPtr bir karakterin adresini tutabilir durumda.ama printf le yazdırdığımızda string in tamamını döndürüyo.stringptr neyin adresini tutuyo???nasıl oluyo halen anlamadım.ve halen anlatamıyorum..


"Bu da bir stringtir" ;bu ve benzeri tüm string ifadeleri char türden adreslerdir.
Dolayısıyla char * türünden bir pointer a string ifadelerini atayabilirsin.
Peki neyin adresi?İfadenin ilk başladığı karekterin adresini tutar.

%s ise paremetre olarak adres alır.O adresten başlayarak NULL görene kadar yazdırır.










Yazar
cantur


avatar
Rize
admin
Kayıt: 16.01.2006
31.01.2008-11:11 #36619
string dediğiniz yapının char dizisi olduğunu aklınızda bulundurursanız integerlarla karşılaştırırken daha kolay düşünebilirsiniz. Ve c deki bir çok sitring fonksiyonu dizi içinde karşılaşacağı ilk null karakterine göre işlem yapmaktadır.






Yazar
tuuba


avatar
Bursa
Kayıt: 22.01.2007
31.01.2008-12:26 #36623
Benim arkadaşın sorduğuyla alakasız bi sorum var(yeni bir başlık açmayayım dedim deblushing)

Visual studio 2005'te çalışırken farkında olmadan bi yerlere tıkladım ve arkada bişey çalışmaya başladı,kod yazarken benim boşluk yaptığım yere . (nokta) koyuyor(tokenizer gibi bişey bu............) satır başlarına da ->ok işareti yapıyor...Restart falan hepsini denedim ama hiç bi gelişme yok....d oh





1 2
Del.icio.us
Digg
Facebook
Furl
Google
Blink
Simpy
Spurl
Y! MyWeb