Konuyu görüntüle
IUCODERS FORUM > Programlama > C / C++ > gösterici dizi ilişkisi
Yazar
encin


avatar

Kayıt: 30.11.2007
26.12.2007-16:19 #33226
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


avatar
Antalya
Kayıt: 05.05.2006
26.12.2007-17:56 #33239
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


avatar

Kayıt: 30.11.2007
26.12.2007-18:41 #33243
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


avatar
Antalya
Kayıt: 05.05.2006
26.12.2007-19:41 #33247
ç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


avatar
istanbul
admin
Kayıt: 04.01.2006
26.12.2007-20:33 #33249
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.biggrin

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


avatar

Kayıt: 30.11.2007
26.12.2007-22:18 #33257
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 dancing
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

applause












Yazar
clairvoyant


avatar
Antalya
Kayıt: 05.05.2006
27.12.2007-00:11 #33261
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


avatar
istanbul
admin
Kayıt: 04.01.2006
27.12.2007-00:42 #33263
bellek yönetimine gerek yok kanımca biggrin

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 biggrin

memory e çok dalmamak gerekirbeat up beat upbeat up







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