Hur gör man en pekare till tvådimensionell array?

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
Användarvisningsbild
strombom
Inlägg: 3305
Blev medlem: 27 maj 2003, 10:50:20
Ort: Västra Götaland
Kontakt:

Inlägg av strombom »

Jag vet tyvärr inte, men det här funkar också 8)

Kod: Markera allt

#define x 3
#define y 2

	char varden1[y][x];
	char varden2[y][x];
	char varden3[y][x];
	char varden4[y][x];
	char (*varde)[x];

	//Spara lite data i varden1
	varde = varden1;
	for (int i=0; i<y; i++)
	{
		for (int j=0; j<x; j++)
			(*varde)[j] = i*x + j;
		varde++;

	//Skriv ut värden1
	varde = varden1;
	printf("\n\nvarden1\n---------------\n");  
	for (int i=0; i<y; i++) 
	{
		for (int j=0; j<x; j++)
			printf("  %d ", (*varde)[j]); 
		printf("\n");
		varde++;
	}

Kod: Markera allt

#define x 3
#define y 2

	char varden1[y][x];
	char varden2[y][x];
	char varden3[y][x];
	char varden4[y][x];
	char (*varde)[x];

	//Spara lite data i varden2
	varde = varden2;
	for (int i=0; i<y; i++)
	{
		for (int j=0; j<x; j++)
			(*varde + i*x)[j] = i*x + j;
	}

	//Skriv ut värden2
	varde = varden2;
	printf("\n\nvarden2\n---------------\n");  
	for (int i=0; i<y; i++) 
	{
		for (int j=0; j<x; j++)
			printf("  %d ", (*varde + i*x)[j]); 
		printf("\n");
	}

Kod: Markera allt

#define x 3
#define y 2

	char varden1[y][x];
	char varden2[y][x];
	char varden3[y][x];
	char varden4[y][x];
	char (*varde)[x];

   //Spara lite data i varden3
   varde = varden3;
   for (int i=0; i<y; i++)
   {
      for (int j=0; j<x; j++)
         *(*varde + i*x + j) = 100 + i*x + j;
   } 
   
   //Skriv ut värden3
   varde = varden3;
   printf("\n\nvarden3\n---------------\n");   
   for (int i=0; i<y; i++)
   {
      for (int j=0; j<x; j++)
         printf("%d ", *(*varde + i*x + j));
      printf("\n");
   }

Kod: Markera allt

#define x 3
#define y 2

	char varden1[y][x];
	char varden2[y][x];
	char varden3[y][x];
	char varden4[y][x];
	char (*varde)[x];

   //Spara lite data i varden4
   varde = varden4;
   for (int i=0; i<y; i++)
   {
      for (int j=0; j<x; j++)
         varde[i][j] = 100 + i*x + j;
   } 
   
   //Skriv ut värden4
   varde = varden4;
   printf("\n\nvarden4\n---------------\n");   
   for (int i=0; i<y; i++)
   {
      for (int j=0; j<x; j++)
         printf("%d ", varde[i][j]);
      printf("\n");
   }
Vågar man dra slutsatsen att varde[j] är ekvivalent med (*varde+i*x)[j] som är ekvivalent med *(*varde + i*x + j) eftersom alla fungerar ?
bearing
Inlägg: 11677
Blev medlem: 2 mars 2006, 01:01:45
Ort: Ängelholm

Inlägg av bearing »

Om arrayen sparas linjärt borde det ju betyda samma, om man anger radlängden som i ditt sista exempel.

När det gäller dynamisk allokering vet jag inte om det alltid spara linjärt. Fast det använder jag ändå inte på en uC.
Arrayer som initeras från början borde ju sparas linjärt. Men jag vet inte.
varden1[x][y]={{..},{..}...};

Ditt sista exempel testade jag i min applikation och det funkade fint. Tackar!
Hur det funkar förstår jag dock inte, dvs vad char(*varden)[x] egentligen betyder.
Användarvisningsbild
strombom
Inlägg: 3305
Blev medlem: 27 maj 2003, 10:50:20
Ort: Västra Götaland
Kontakt:

Inlägg av strombom »

Vad jag tror:

*varden[x] <- här är varden en fast matris av längden x där varje element x är en pekare. kan skrivas som *(varden[x])

(*varden)[x] <- här är varden en pekare som pekar på en godtycklig matris med x element
Användarvisningsbild
Icecap
Inlägg: 26662
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Inlägg av Icecap »

'char(*varden)[x]' tror jag att kompilern uppfattar som 'char * varden[x]' och då är det ju ganska mycket tydligare, det är alltså ett array med x medlemmer av char-pekare.

Jag misstänkar dock att deklarationen egentligen borde vara:
'char * varden'
vilket är en pekare på char. Vill man indexera enklare kan man kanske deklarera den som:
'char[x][y] * varden'

Men för att göra det hela tydligare hade jag vald att använda en typedef:
typedef char[x][y] T_VALUES;
T_VALUES * varden;
T_VALUES varden1;
T_VALUES varden2;
T_VALUES varden3;
T_VALUES varden4;
bearing
Inlägg: 11677
Blev medlem: 2 mars 2006, 01:01:45
Ort: Ängelholm

Inlägg av bearing »

Strombom, ja, så måste det ju vara. D.v.s har man en pekare som deklarerats: char (*pekare)[radlangd]; och kör: pekare++; kommer kommer adressen öka med radlangd*sizeof(char).

Icecap, nej jag har testat och det blir skillnad.
I min komplator gick det inte att skriva arraystorleken innan variabelnamnet.
Skriv svar