Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Wskaźniki do tablicy dwuwymiarowej - posługiwanie się nimi

Ostatnio zmodyfikowano 2016-12-08 13:23
Autor Wiadomość
latajacaryba
Temat założony przez niniejszego użytkownika
Wskaźniki do tablicy dwuwymiarowej - posługiwanie się nimi
» 2016-12-04 13:28:26
Witam. Mam funkcję, w której muszę użyć tablicy dwuwymiarowej(jednej z wielu), dlatego chciałbym użyć do tego wskaźnika. Widziałem wiele tematów, ale mało co wnosiły. Dlatego mam nadzieję, że tu uda mi się dowiedzieć jak to w końcu jest. Mam więc tablice dwuwymiarową. Potrzebuje wskaźnika, i chcę aby był on argumentem.
Z góry dzięki.
P-154469
karambaHZP
» 2016-12-04 14:29:32
Pokaż co masz.
**
.
Dlaczego nie możesz skorzystać z zapisu tablicowego?
P-154474
Gibas11
» 2016-12-04 14:41:57
Nie lepiej jakiś kontener z STL?
std::array < std::array < int, 5 >, 5 > tablica5x5;
 jeśli masz stały rozmiar albo
std::vector < std::vector < int >> tablica2d;
 jeśli ma być dynamicznie alokowana.
P-154476
latajacaryba
Temat założony przez niniejszego użytkownika
» 2016-12-04 14:42:28
C/C++
wybor[ 10 ][ 10 ];
wybor2[ 10 ][ 10 ];
wybor3[ 10 ][ 10 ];
int main()
{
    ( * wsk )[ 10 ][ 10 ];
    losuj( wsk, wybor1, wybor2, wybor3 );
}


void losuj( char( * wsk )[ 10 ][ 10 ], char wybor1[ 10 ][ 10 ], char wybor2[ 10 ][ 10 ], char wybor3[ 10 ][ 10 ] )
{
    int los =( rand() % 3 ) + 0;
    switch( los )
    {
    case 0:
        wsk = & wybor1;
        break;
    case 1:
        wsk = & wybor2;
        break;
    case 2:
        wsk = & wybor3;
        break;
    }
}

W ten sposób chciałbym to zrobić. Nawet nie próbuj kompilować kodu, bo wywala następujący błąd dla wszystkich case'ów w funkcji:
cannot convert 'char (**)[10]' to 'char (*)[10][10]' in assignment
Dziwne jest to, ze w main mam dokładnie taką instrukcję jak w funkcji (
char( * wsk )[ 10 ][ 10 ] = & wybor1;
) i działa
P-154477
latajacaryba
Temat założony przez niniejszego użytkownika
» 2016-12-04 14:43:40
@Gibas11
Wolałbym bez, jeszcze ich nie znam, a tą funkcję będę potem używał/modyfikował na wiele sposobów :/
P-154478
latajacaryba
Temat założony przez niniejszego użytkownika
» 2016-12-05 10:41:20
To musi być wskaźnik niestały, czyli przesyłanie nazwy tablicy odpada.
P-154526
Monika90
» 2016-12-05 14:45:34
Po pierwsze, musisz zrozumieć że wskaźnik do tablicy, a wskaźnik do elementu tej tablicy to nie jest to samo.

Po drugie, tablica dwuwymiarowa to tak naprawdę tablica tablic. To znaczy tablica której elementy to też są tablice.

Po trzecie, nazwa tablicy jest nazwą tablicy i niczym innym. Nie jest, nigdy nie była i nigdy nie będzie wskaźnikiem do pierwszego elementu tablicy. Ale wartość typu tablicowego będzie w pewnych sytuacjach automatycznie konwertowana na wskaźnik do pierwszego elementu tej tablicy.

Mamy więc kilka opcji:

1. Tradycyjnie przekazujemy wskaźnik do pierwszego elementu tablicy i jej rozmiar
C/C++
void f( int( * p )[ 10 ], int size )
{
    std::cout << "t[0][0] == " << p[ 0 ][ 0 ] << std::endl;
}

int main()
{
    int t[ 10 ][ 10 ] = { };
    f( t, 10 ); //to samo co f(&t[0], 10); dzięki automatycznej konwersji: tablica -> wskaźnik
}

2. Można też tak jak chciałeś, wskaźnik do całej tablicy. Rozmiaru nie przekazujemy, bo zawsze musi być 10 na 10. Tutaj trzeba dokonać dereferencji wskaźnika, zanim będzie się indeksować.
C/C++
void f( int( * p )[ 10 ][ 10 ] )
{
    std::cout << "t[0][0] == " <<( * p )[ 0 ][ 0 ] << std::endl;
}

int main()
{
    int t[ 10 ][ 10 ] = { };
    f( & t ); //adres całej tablicy
}

3. Można to uprościć przekazując tablicę przez referencję
C/C++
void f( int( & p )[ 10 ][ 10 ] )
{
    std::cout << "t[0][0] == " << p[ 0 ][ 0 ] << std::endl;
}

int main()
{
    int t[ 10 ][ 10 ] = { };
    f( t );
}
P-154532
latajacaryba
Temat założony przez niniejszego użytkownika
» 2016-12-06 12:50:45
No dobrze, ale czym właściwie jest wskaźnik do tablicy. Ja uczyłem się, że wskaźnik do tablicy to po prostu wskaźnik na któryś z jej elementów. Czym to się różni? Poza tym po co przekazujemy
tablice przez referencję, skoro i tak zawsze pracujemy na oryginale, a nie kopii? I ostatnie (tu pytam z czystej ciekawości) dlaczego J. Grębosz dobitnie stwierdzał, że: "nazwa tablicy to wskaźnik do jej pierwszego elementu" skoro tak nie jest? Chciał to łatwiej wytłumaczyć, bez zagłębiania się w szczegóły?
P-154580
« 1 » 2
  Strona 1 z 2 Następna strona