Yazar |
|
encin
Kayıt: 30.11.2007 |
|
bir dizinin ismi, ilk elemanının adresini tutan bir göstericidir
bu tanım sadece tek boyutlu dizilerde geçerli oluyor
ama kitaplarda böyle bir bilgiye rastlamadım
bir yerde hata mı yapıyorum acaba??
|
|
Yazar |
|
clairvoyant
Antalya
Kayıt: 05.05.2006 |
|
Bu tanım çok boyutlu diziler için de geçerlidir. İsterseniz çok boyutlu bir dizi üzerinde test edebilirsiniz.
#include <stdio.h>
int main(void) {
int i,j,k;
char A[3][4][5];
printf("dizi adinin gosterdigi adres: %X\n", A);
for(i=0; i<3; i++){
for(j=0;j<4;j++){
for(k=0; k<5; k++)
printf("%8X",&A[i][j][k]);
printf("\n");
}
printf("\n");
}
return 0;
}
Bu kod aşağıdaki gibi bir çıktı üretir.
dizi adinin gosterdigi adres: 12FF38
12FF38 12FF39 12FF3A 12FF3B 12FF3C
12FF3D 12FF3E 12FF3F 12FF40 12FF41
12FF42 12FF43 12FF44 12FF45 12FF46
12FF47 12FF48 12FF49 12FF4A 12FF4B
12FF4C 12FF4D 12FF4E 12FF4F 12FF50
12FF51 12FF52 12FF53 12FF54 12FF55
12FF56 12FF57 12FF58 12FF59 12FF5A
12FF5B 12FF5C 12FF5D 12FF5E 12FF5F
12FF60 12FF61 12FF62 12FF63 12FF64
12FF65 12FF66 12FF67 12FF68 12FF69
12FF6A 12FF6B 12FF6C 12FF6D 12FF6E
12FF6F 12FF70 12FF71 12FF72 12FF73
buradaki sayaçlar şu şekildedir;
i -> paragraf
j -> satır
k -> sütun
Let`s make this world a better place to live !
|
|
Yazar |
|
encin
Kayıt: 30.11.2007 |
|
teşekkür ederim cevap için
yalnız
o zaman çok boyutlu dizilerde dizi ismi gösterici aritmetiğinde mi kullanılamıyor acaba ??
#include< stdio.h >
#include< conio.h >
void main( )
{
int d[ 2 ] ;
for( int i = 0 ; i < 2 ; i++ )
{
*(d + i) = 0 ;
printf( "%d ", *(d + i) ) ;
}
getch( ) ;
}
mesela yukarıdakinde sorun çıkmıyor ama aşağıdakinde hata veriyor
#include< stdio.h >
#include< conio.h >
void main( )
{
int d[ 2 ][ 2 ][ 2 ] ;
for( int i = 0 ; i < 8 ; i++ )
{
*(d + i) = 0 ;
printf( "%d ", *(d + i) ) ;
}
getch( ) ;
}
|
|
Yazar |
|
clairvoyant
Antalya
Kayıt: 05.05.2006 |
|
çok boyutlu bir d dizisi için *(d + i) ifadesi de bir işaretçidir. Değere ulaşabilmek için dizinin boyutu kadar * kullanmak gerekir.
3 boyutlu dizi için: ***(d+i)
Fakat şöyle bir durum da söz konusu:
d + i değeri, i bir bir artsa bile aynı şekilde artmaz. Yani integer'ın 4 byte olduğunu varsayarsak d+1 değerini d'nin 4 fazlaso olmaz. Tek boyutlu dizilerde her artış adres değerini 4 byte arttırır (integer 4 byte ise). Fakat çok boyutlu dzilerde bu değerin ne kadar artacağı dizinin tipine, uzunluğuna ve boyutuna göre değişir. Yani çok boyutlu dizi hiyerarşisine göre o seviyenin altındaki seviyelerde depolanan toplam byte sayısı kadar artış olur.
Örnegin bendeki derleyici int tipindeki bir A[i][j][k] dizisi için A+1 işleminde artış miktarı olarak şu değeri kullanıyor:
j * k * 4
Çünkü i değeri 1 arttığında j*k kadar elemanın üzerinden atlanmış olunuyor. Her eleman da 4 byte uzunluğunda ise j*k*4 kadar byte üzerinden atlanmış demektir.
Aynı durum içteki işaretçiler içinde geçerlidir:
*A+1 işleminden sonra k*4 byte ileriye gidilmiş olunur.
**A+1 işleminden sonra 4 byte ileriye gidilmiş olunur.
Bu arada, eğer dizi elemanlarına tek döngü içinde ulaşmak istersen şöyle birşey deneyebilirsin;
int d[ 2 ][ 2 ][ 2 ] ;
int *p;
p = (int*)d;
for( int i = 0 ; i < 8 ; i++ )
{
*(p + i) = 0 ;
printf( "%d ", *(p + i) ) ;
}
Let`s make this world a better place to live !
|
|
Yazar |
|
ali
istanbul
admin
Kayıt: 04.01.2006 |
|
encin yazdi | bir dizinin ismi, ilk elemanının adresini tutan bir göstericidir
bu tanım sadece tek boyutlu dizilerde geçerli oluyor
ama kitaplarda böyle bir bilgiye rastlamadım
bir yerde hata mı yapıyorum acaba?? |
bu işler çok karışık.
bakınız
The difference between pointers and arrays -> http://www.cplusplus.com/articles/Arrptr.html
Array is not pointer -> http://www.cplusplus.com/articles/siavoshkc1.html
free software is a matter of liberty, not price. to understand the concept, you should think of free speech, not free beer.
|
|
Yazar |
|
encin
Kayıt: 30.11.2007 |
|
bu tanım pek doğru değil sanırım
dizinin ismi ile, dizinin ilk elemanının adresinin atandığı bir göstericiyi kıyaslarsak ;
ikisi de adres tutyolar ve aynı adresi tutuyolar ama çok boyutlu dizilerdeki aritmetik gösterici işlemlerinde farklı davranıyolar galiba, başka farklı davrandıkları yerler var mı ki
bu yüzden ekrana adres yazarken hangisini kullandığımız veya dizinin boyutu sorun çıkarmıyor ama içeriğe erişmek ya da gösterici aritmetiğini kullanmak istediğimizde özelliklerini iyi bilmek gerek
yarrınki derste tam da bu anlatılacak galiba ama gidemeyeceğim için epey araştırmam gerekecek
bu konuda neleri bilmediğimi öğrendim sanırım, makaleleri incelicem, teşekkürler katkılarınız için
|
|
Yazar |
|
clairvoyant
Antalya
Kayıt: 05.05.2006 |
|
Evet aslında karışık, ama bellek yönetimine iyi hakim olabildikten sonra çok basit ve zevkli :))
Let`s make this world a better place to live !
|
|
Yazar |
|
ali
istanbul
admin
Kayıt: 04.01.2006 |
|
bellek yönetimine gerek yok kanımca
dilin yapısı gereği herşey bellekte point edilebilir, dizide bellekte tutulur, e ozaman dizide pointer ile erişilmezmi? erişilir.
peki bu diziyi pointer yaparmı? hayır. aslında temel fark üretilen makina kodunda.
dizilerde herhangi bir structure yada class gibi değerlendirliyor
int arr[3]={3,4,5};
cout<<"First element of the array: "<<arr[0]+1 <<endl;
cout<<"Address of the first element: "<<&arr[0]+1 <<endl;
cout<<"Address of the array: "<<arr +1<<endl;
cout<<"So what is this? "<<&arr +1<<endl;
bu kod yeterince açık. ilk eleman ile dizinin adresi aynı, ama ikinci elemana dizinin adresi ile erişriseniz işler değişir.
tabi bu işi dinamik olarak yaparsanız (malloc) işler daha başka hallere bürünür.
sözün özü ; diziler pointer değildir, ama pointer ile erişilir. ayrıntını bilinmesi faydalı ama kullanırken pointermış gibi kullancaz
memory e çok dalmamak gerekir
free software is a matter of liberty, not price. to understand the concept, you should think of free speech, not free beer.
|
|
|
|
-
Del.icio.us
-
Digg
-
Facebook
-
Furl
-
Google
-
Blink
-
Simpy
-
Spurl
-
Y! MyWeb
|
|
| | | | |