[C] Pojasnjenje pokazivaca-pitalica.

nisam bas upoznat sa C/C++ ali vidim od prilike šta se ovde dešava ..


Kod:
#include <stdio.h>

void main() { 

int i; // initalizacija i integera

int a[3][3] = { {7,8,9}, {6,5,4}, {3,2,1} }; // initalizacija trodimenzijalnog array-a


for (i=2;i>=0;i--) //for loop koji pocinje sa brojem 2, traje dok je i vece ili jednako od nule ..


printf("%d %d %d\n", a[2-i][i], *(a[2-i]+1), *(*(a+i)+2-i));
}

ovo "%d" u stringu će se zameniti sa integerom koji je naveden posle stringa

3 integera sa kojima će biti zamenjeni ovi operatori se uzimaju iz onog gore navedenog
trodimenzijalnog arraya ( a )

znači u celom kodu imaćemo tri slučaja vrednosti integera i , kada je on 0, 1 i 2

dakle za prvi slučaj kada je i 2 kod će izgledati ovako nešto

a[2-2][2] odnosno 2[0][2] sto znači da se broj uzima iz prvog arraya (redni broj 0) , broj koji će se uzeti će biti na trećem mestu (redni broj dva) , što znači da je prvi broj 9 ..

evo da ti bude malo jasnije to se radi na ovu foru ..
Kod:
{7,8,9}, {6,5,4}, {3,2,1}
   0         1        2

nama treba arraya na nultom mestu dakle uzimamo sledeći..

{7,8,9}
0  1  2

i treba nam broj na drugom mestu tako da uzimamo broj 9..
na ovom istom principu se dobijaju i ostali brojevi u sva 3 slučaja ( za i = 0, 1 i 2)

znam da nisam baš najbolje objasnio ali verovatno će ti biti dosta da sam nešto skontaš :confused:
 
Jel ima neko voljan da mi pojasni malo kako se dobija tačno rešenje u ovoj pitalici.

Ја ћу пробати, па шта буде...

Kod:
int a[3][3] = { {7,8,9}, {6,5,4}, {3,2,1} };

Ово значи да низ a изгледа овако:

a[0][0]==7; a[0][1]==8; a[0][2]==9;
a[1][0]==6; a[1][1]==5; a[1][2]==4;
a[2][0]==3; a[2][1]==2; a[2][2]==1;

Показивачи су мало запетљани... ако ову матрицу схватимо као низ показивача, то ће бити низ три показивача, од којих први показује на први члан низа {7, 8, 9}, други на {6,5,4}, а трећи на {3,2,1}. То у C-у одговара оваквом запису:

*a[0] == 7; *(a[0] +1) == 8; *(a[0] +2) == 9;
*a[1] == 6; *(a[1] +1) == 5; *(a[1] +2) == 4;
*a[2] == 3; *(a[2] +1) == 2; *(a[2] +2) == 1;

односно:

*(a[0] +0) == 7; *(a[0] +1) == 8; *(a[0] +2) == 9;
*(a[1] +0) == 6; *(a[1] +1) == 5; *(a[1] +2) == 4;
*(a[2] +0) == 3; *(a[2] +1) == 2; *(a[2] +2) == 1;

А најзапетљанији део је ако се матрица схвати као показивач на показивач. У овом случају, матрица a је показивач на a[0][0], односно **a. Тада је *a показивач на први члан у {7, 8, 9}, *(a+1) на {6,5,4}, а *(a+2) на {3,2,1}, па је почетна матрица, ако је гледамо као показивач на показивач, дефинисана овако:

**a == 7; *(*a+1) == 8; *(*a+2) == 9;
*(*(a+1)) == 6; *(*(a+1) +1) == 5; *(*(a+1) +2) == 4;
*(*(a+2)) == 3; *(*(a+2) +1) == 2; *(*(a+2) +2) == 1;

односно:

*(*(a+0) +0) == 7; *(*(a+0) +1) == 8; *(*(a+0) +2) == 9;
*(*(a+1) +0) == 6; *(*(a+1) +1) == 5; *(*(a+1) +2) == 4;
*(*(a+2) +0) == 3; *(*(a+2) +1) == 2; *(*(a+2) +2) == 1;

Не знам колико сам ово појаснио... ваљда нисам још више закомпликовао. Рад са динамичким променљивама представља најтежу област у програмирању у оквиру средњошколског курса, обично је доста тежак за интуитивно разумевање.

Затим следи петља:

Kod:
for (i=2;i>=0;i--)
printf("%d %d %d\n", a[2-i][i], *(a[2-i]+1), *(*(a+i)+2-i));

Значи, i узима вредности: 2, 1, 0. Идемо редом:

i=2

Наредба гласи:
printf("%d %d %d\n", a[0][2], *(a[0]+1), *(*(a+2)));

Штампају се бројеви: a[0][2], *(a[0]+1), *(*(a+2)). Из горњих таблица видимо да је реч о бројевима: 9, 8, 3.

i=1

Штампају се бројеви: a[1][1], *(a[1]+1), *(*(a+1)+1), то јест: 5, 5, 5.

i=0

Штампају се бројеви: a[2][0], *(a[2]+1), *(*a+2), то јест: 3, 2, 9.

Дакле, одговор је под B).

Е сад, ваљда ће бити јасно... Сећам се да су ми својевремено рекурзија и динамичке променљиве биле највећа главоломка да их "сконтам". Али кад сам их сконтао, радио сам са њима без проблема.
 

Back
Top