Pointer Le İlgili Bir Mantık Sorusu Acil
-
char *takim[3]={"armut","ayva","elme"};
Burada anladığım: *takim[1] bellekte armut un bulunduğu yeri yani ilk teriminin adresini gösteriyor. Peki ben ben bu armutun 2. indisine nasıl ulaşacağım ?
*(armut[1]+1) mi yazmam lazım yazınca olmuyor derleyici hata veriyor.
2. sorum bununla paralel.
char *aptr="armut"; // tanımlı olsun.
*(aptr+1)=3;//öğrendiğime göre aptr ilk terimi gösteriyor +1 2. yi yani r yi göstermeli.
Bana göre r yerine 3 yazmalı ama olmuyor atamıyor. Hani diziler pointeri temsil ediyordu ? Diziyle yapınca dizi[2]=3 olsa ve atama yapsam atasam 3 atanıyor ama bu şekilde pointerle atayınca olmuyor. Mantığıma yatmadı bu iş. Neden olmuyor anlamıyorum....
Nerede yanlış düşünüyorum ve gerçek mantığı nedir bunun anlatırsanız sevinirim.
Not: Acil çünkü acilen anlayıp geçmek istiyorum.
-
1. soru
printf("%s", takim[0]); çıktı: armut
printf("%s", takim[0]+2); çıktı: mut
printf("%c", *(takim[0]+2)); çıktı: m -
2.yi ben de anlayamadım tam olarak sorun nerde
-
takim[0]+2); çıktı: mut
neden amr değil son 3 ?? mantığı ne bunun...
2. soru:
char *aptr="armut"; //olsun.
burada r harfi yerine w harfi nasıl yazılır diye sordum bence
*(aptr+1)='w' olarak atanmalı ama atanmıyor ??
zeybekustasi tarafından 01/Nis/13 21:24 tarihinde düzenlenmiştir -
zeybekustasi bunu yazdı
takim[0]+2); çıktı: mut
neden amr değil son 3 ?? mantığı ne bunun...
2. soru:
char *aptr="armut"; //olsun.
burada r harfi yerine w harfi nasıl yazılır diye sordum bence
*(aptr+1)='w' olarak atanmalı ama atanmıyor ??
2.soruda ne sordugunu anladım da sorun nerden kaynaklanıyo onu anlamadım, tamam
1. soruya gelince (takim[0]+2) armut kelimesindeki 'm'nin adresini gösteriyo printf("%s"); komutu da o adresten itibaren okuyarak ekrana yazdırıyo
neden (takim[0]+2) 'm' i gösteriyo dersen
char
*takim[3]={
"armut"
,
"ayva"
,
"elme"
};
bu tanımda *takim[3] bellekte bitişik olarak şu şekilde diziliyor: armutayvaelme
takim[0] (a)rmut burdaki a'nın adresini
takim[1] (a)yva burdaki a'nın adresini
takim[2] (e)lme burdaki e'nin adresini gösterir
o yüzden takim[0]+2 yazarsan işaretçi doğal olarak iki sağa kayar ve ar(m)ut burdaki m'i gösterir sonra da onu printf("%s",takim[0]+2); olarak kullanırsan doğal olarak m harfinden başlar ve takim[0]'ın yani bulunduğu bölmenin sonuna kadar gider.
hatta istersen
printf("%s",takim[0]+6);
printf("%s",takim[1]);yazarsan ikisinin de çıktısı ayva olur çünkü takim[0]+6=takim[1] harfleri yan yana sayarsan
o kadar da anlaşılmayacak bişey yok gibi
-
zeybekustasi bunu yazdı
char *takim[3]={"armut","ayva","elme"};
Burada anladığım: *takim[1] bellekte armut un bulunduğu yeri yani ilk teriminin adresini gösteriyor. Peki ben ben bu armutun 2. indisine nasıl ulaşacağım ?
*(armut[1]+1) mi yazmam lazım yazınca olmuyor derleyici hata veriyor.
2. sorum bununla paralel.
char *aptr="armut"; // tanımlı olsun.
*(aptr+1)=3;//öğrendiğime göre aptr ilk terimi gösteriyor +1 2. yi yani r yi göstermeli.
Bana göre r yerine 3 yazmalı ama olmuyor atamıyor. Hani diziler pointeri temsil ediyordu ? Diziyle yapınca dizi[2]=3 olsa ve atama yapsam atasam 3 atanıyor ama bu şekilde pointerle atayınca olmuyor. Mantığıma yatmadı bu iş. Neden olmuyor anlamıyorum....
Nerede yanlış düşünüyorum ve gerçek mantığı nedir bunun anlatırsanız sevinirim.
Not: Acil çünkü acilen anlayıp geçmek istiyorum.
1.Arraylerde 0dan baslanir sayilmaya.Dolayisiyla takim[1] dersen ayvaya erisirsin.
2.armut[1] yazmissin,armut bir array olarak tanimlanmamis.Hata vermesi normal.Armutun ikinci indisine,yani 'm' harfine ulasmak istiyorsan takim[0][2] yazmalisin.
3.Bilmiyorum.
-
Şöyle ulaşılabilir:
#include <stdio.h> #include <string.h> #define BOYUT 3 char * takim[BOYUT] = {"armut", "ayva", "elma"}; int main() { size_t tmpuzunluk = 0; for (int i = 0; i < BOYUT; ++i) { tmpuzunluk = strlen(takim[i]); for (int j = 0; j < tmpuzunluk; ++j) { printf("%c\n", takim[i][j]); } puts("------------------------"); } return 0; }
//Farklı bir yol#include <stdio.h> #include <string.h> #define BOYUT 4 char *takim[BOYUT] = {"armut", "ayva", "elma", "dana"}; int main() { size_t tmpuzunluk = 0; int i = 0; char * c = NULL; c = &takim[0][0]; tmpuzunluk = strlen(takim[0]); for ( i = 0; i < BOYUT * tmpuzunluk; ++i) { if (c[i] == '\0') {printf("<=><=><=>\n"); continue;} printf("%c\n", *(c + i)); } puts("------------------------"); system("pause"); return 0; }
YeniHarman tarafından 02/Nis/13 01:49 tarihinde düzenlenmiştir -
İki boyutlu arraylere yani matrislere giriyo ondan dolayı. Sebebi c dilinde string diye birşey yoktur. C aşıkları istediği kadar bi taraflarını yırtsın var işte string "sdfa" bu diye ama değil arkadaşım. Bu bir array ve içerisinde 1 byte lık sayılar tutar ekrana bastırma sırasında bu 1 byte lık sayılar ascii karşılıklarına çevirilir ve basılır.