Wpisanie i wypisywanie danych ze złożonych deklaracji wsaźników

0

Próbuje stworzyć wskaźnik na tablicę 10 elementową w ten sposób:

int (*tab)[10]

Później do niego wpisuje adres tablicy, lecz nie udaję mi się wyświetlić danych, co robię źle ?:

int main()
{
    int tablica[10] = {1,2,3,4,5,6,7,8,9,10};
 
    int (*tab)[10];
    tab = &tablica;
 
    cout << *(tab);
 
    return 0;
}

Dodam, że chodzi mi o taki zapis a nie deklarowanie zwykłego wskaźnika do którego później wpisujemy wartość z tablicy.

1

W dużej ilości kontekstów w C i C++ tablica sama się konwertuje do wskaźnika na jej pierwszy element.

0

Konkretnie dlaczego w tym miejscu:

cout << *(tab);

wypisuje mi adres komórki a nie wartość 1 ? Wydaje mi się, że odwołuje się tutaj do zerowego elementu tablicy, której adres został wpisany do wskaźnika, który pokazuje właśnie na tą tablicę.

1

Bo tablica nie jest jej pierwszym elementem.

0

Ale adres tablicy to zerowy element tablicy, więc powinna pokazać się wartość z zerowego elementu tablicy.

0

Nie. Adres tablicy jest równy adresowi pierwszego elementu tablicy.

0

Tak właśnie o to mi chodziło, tylko źle to ująłem. Wpisując do wskaźnika adres do pierwszego elementu tablicy jednocześnie powinna być w nim zawarta wartość danego elementu tablicy. Dlaczego w tym przykładzie tak nie jest ?

1

Bo adres do elementu to nie element. n-ty element tablicy to (*tab)[n].

0

to za pomocą wskaźnika tab nie wyświetlę danych w żaden sposób ?
Bo w normalnych wskaźnika to adres wypisuje się w ten sposób

cout <<tab

a wartość w ten sposób :

cout <<*tab

Dlaczego to więc w tym przypadku nie działa?

Myślałem, że to:

int *tab[10]

jest 10 elementową tablica wskaźników, a nie to co w pierwszym poście.

2

Dla int tab[10]:
tab jest tablicą int, ale w wielu miejscach automatycznie jest konwertowane do wskaźnika na pierwszy element, np:
int* ptr = tab
W tym momencie ptr to wskaźnik na pierwszy element, a *ptr lub ptr[0] to pierwszy element - int.

Dla int* tab[10]:
tab jest tablicą int*, ale w wielu miejscach automatycznie jest konwertowane do wskaźnika na pierwszy element, np:
int** ptr = tab
W tym momencie ptr to wskaźnik na pierwszy element, a *ptr lub ptr[0] to pierwszy element - int*.

2

@kalosz7347

int (*tab)[10];
tab = &tablica;

tab jest wskaźnikiem na 10-elementową tablicę intów. Teraz pomyśl o tym w ten sposób: *tab jest równoważne tablica, stąd

Wypisywanie adresu tablicy

cout << tablica;
cout << *tab;

Wypisywanie pierwszego elementu tablicy

cout << tablica[0];
cout << *tablica;
cout << (*tab)[0];
cout << **tab;

Wypisywanie drugiego elementu

cout << *(tablica + 1);
cout << *((*tab) + 1);
0

Dlaczego

*tab

jest równoznaczne z tablica

 ?

Tutaj np. za pomocą * i nazwy wskaźnika mogę wypisać wartość, dlaczego to nie działa w przykładzie z pierwszego postu?

```cpp
int tablica[4] = {5,10,15,20};
    int *wsk = &tablica[0];

    cout << *wsk << endl;
0

tab jest wskaźnikiem na tablica, więc *tab to wyłuskanie wskaźnika co daje obiekt czyli tablica
wsk jest wskaźnkiem na element typu int i w tym przypadku wskazuje na pierwszy element tablicy, więc wyłuskanie go daje obiekt typu int

2

chyba dalej tego nie rozumiem, jeśli tab jest wskaźnikiem na tablice tab = &tablica to na początek adres tego wskaźnika powinien być równy komórce pamięci w której znajduje się początek tablicy czyli element tablica[0], a w ten sposób *tab zostaje pokazana wartość, która znajduje się w tej komórce pamięci.

int tablica[10] = {1,2,3,4,5,6,7,8,9,10};
 
int (*tab)[10];
tab = &tablica;
 
cout << "tab: " << tab << endl;
cout << "*tab: " << *tab << endl;
cout << "&tablica: " << &tablica << endl;
cout << "tablica: " << tablica << endl;
    
int* wsk = &tablica[0];
cout << "wsk: " << wsk << endl;

Adres tablicy jest równy adresowi pierwszego elementu, ale to nie znaczy że wsio jedno co się kryje pod tym. Typ ma znaczenie.

cout << *tab;

Mówisz kompilatorowi "wypisz mi obiekt, na który wskazuje tab". Kompilator mówi "spoko loko, pod tym adresem jest obiekt typu tablica to sobie tę tablicę wypisuję". W tym momencie kompilator zamieni tablica na wskaźnik do pierwszego elementu i wypisze ten adres.

cout << *wsk;

Mówisz "wypisz mi obiekt, na który wskazuje wsk". Kompilator "spoko, ten wskaźnik wskazuje na jakąś liczbę typu int no to sobie tę liczbę wypisuję".

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