Tablica jednowymiarowa a wskaznik

0

Witam, staram sie zglebic wiedze na temat wskaznikow i napotkalem dziewna sytuacje ktora chcialbym zrozumiec zeby isc dalej.
Na poczatek czytalem ze : nazwa tablicy jest wskaźnikiem na jej pierwszy element:
Wiec pytanie jest nastepujace dlaczego w jednowymarowej tablicy przy wczytywaniu nie moge sie posluzyc wskaznikiem a gdy jest 2wymiarowa to juz tak?

int  tab[3][4] ;
	scanf( "%d" , *(tab) );                                                                    
	printf( "%d" , tab[0][0]);

tu dziala okej

int  tab[3] ;
	scanf( "%d" , *(tab) );                                                                    
	printf( "%d" , tab[0]);

w tym kodzie wywala blad po skompilowaniu

int  tab[3]={3,5,6} ;
printf( "%d" , *tab);

przy drukowaniu nie ma klopotu

0

Nazwa tablicy NIE JEST wskaźnikiem, ale może być do niego zrzutowana.
Przykłady które podałeś są błędne, bo scanf oczekuje jako parametru ADRESU a nie obiektu. W związku z tym to:

int  tab[3] ;
scanf( "%d" , *(tab) );   

jest zwyczajnie błędne, bo *tab oznacza tyle co tab[0] więc odnosi się do elementu a nie jego adresu. Poprawnie byłoby

scanf( "%d" , tab);   

albo

scanf( "%d" , &(tab[0]));   
0

OKEJ. Ale dlaczego dziala w dwuwymiarowej dobrze?

0

Bo jak już pisałem wyżej zapis *tab oznacza tyle co tab[0] a skoro tablica jest dwuwymiarowa to tab[0] wcale nie pokazuje na konkretny element tablicy bo brakuje drugiego indeksu. W efekcie *tab oraz tab[0] dla tablicy dwuwymiarowej zwracają adres pierwszego elementu tablicy.
Uruchom sobie

int tab[10][10];
cout<< tab[0]<<" "<<*tab<<" "<<&(tab[0][0]);
0

twoj kod wyswietla adresy

0

I chwała mu za to! Istotne jest że wyświetla TE SAME adresy, co znaczy że podane przeze mnie zapisy są równoważne. Co odpowiada na twoje pytanie "czemu dla dwuwymiarowej tablicy działa". Bo podanie *tab jako argumentu jest równoważne z podaniem &(tab[0][0]) czyli scanf wczyta dane do pierwszej komórki tablicy.

0

musze to jeszcze przeanalizowac :P

0

@wlodek14a :

http://pl.wikibooks.org/wiki/C/Wska%C5%BAniki_-_wi%C4%99cej
http://pl.wikibooks.org/wiki/C/Wska%C5%BAniki

polecam Ci Eclipse CDT i włączyć ostrzeżenia od GCC.
sama mam problemy ze wskaźnikami, ale w praktyce Eclipse zaznacza i trochę podpowiada czy np. st.field vs st->field . Wydaje mi się, że jest to ułatwienie przy pracy ze wskaźnikami.

0

dzieki, przyda sie :D

0

Jeżeli tab jest adresem tablicy, a &tab[0] adresem elementu o indeksie [0], a tablica jest indeksowana od zera, to jest jasne, że te dwa adresy (całej tablicy i pierwszego elementu tablicy) są sobie równe.

0

Jeszcze jakby ktos chcial podyskutowac to wrzucam takii program z ktorego wzialem sobie wgl to wczytywanie przez wskaznik

 
int  tab[ 3 ][ 5 ] ;
int  i, j ;
for( i=0 ; i<3 ; i++ )
for( j=0 ; j<5 ; j++ )
{
printf( " TAB[ %d , %d ]= ", i, j );
 scanf( "%d" , *(tab + i) + j  );
}

jakies komentarze do kodu? :D

1 użytkowników online, w tym zalogowanych: 0, gości: 1