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

[C++]Tablice dwuwymiarowe - wskaźniki do elementów tych tablic.

Ostatnio zmodyfikowano 2015-08-28 23:13
Autor Wiadomość
Frish
Temat założony przez niniejszego użytkownika
[C++]Tablice dwuwymiarowe - wskaźniki do elementów tych tablic.
» 2015-08-27 20:58:50
Witam
mam taki krótki kod i chciałbym się dowiedzieć jak mogę korzystać z tablic dwuwymiarowych za pomocą wskaźników. Niestety coś robię nie tak i nie potrafię sobie z tym poradzić. Proszę o pomoc.

C/C++
#include <iostream>

int main()
{
   
    int tab_w[ 3 ][ 5 ] = { { 2, 4, 8, 16, 32 }, { 3, 6, 12, 24, 48 }, { 5, 10, 20, 40, 80 } };
    int * wsk_tab_w = tab_w[ 0 ];
    int ** wsk_wsk_w = & wsk_tab_w;
   
    std::cout << "tab_w: " << tab_w[ 0 ][ 0 ] << std::endl;
    std::cout << "wsk_tab_w: " << *( wsk_tab_w + 6 ) << std::endl;
    std::cout << "wsk_wsk_w: " << *( *( wsk_wsk_w + 1 ) + 1 ) << std::endl << std::endl; //chciałem aby to wywołanie wskazywało na tab_w[1][1]
   
}

...i ostatni wiersz tego programu, czyli
C/C++
std::cout << "wsk_wsk_w: " << *( *( wsk_wsk_w + 1 ) + 1 ) << std::endl << std::endl;
...nie pokazuje na element tab_w[1][1]...nie wiem gdzie popełniam błąd, widocznie nie rozumiem tego. Proszę o wskazanie właściwego toku myślenia.
P-136937
Cansisti
» 2015-08-27 21:24:40
Nazwa tablicy jest już wskaźnikiem. A tablica[n] jest jakby wskaźnikiem na n-ty element.
Słowem jeżeli chcesz żeby funkcja/metoda operowała na orginalnej tablicy (bo po co innego wskaźniki?) wystarczy przekazać jej nazwę.
P-136938
carlosmay
» 2015-08-27 21:32:22
C/C++
int t[ 3 ][ 3 ] = {
    { 1, 2, 3 },
    { 4, 5, 6 },
    { 7, 8, 9 }
};
int * p;
p = & t[ 0 ][ 0 ];
cout << *(( p + 2 ) + 3 ) << endl; // rząd 2 kolumna 3 czyli wartosc 6

Masz taką potrzebę mieć wskaźnik do wskaźnika? Wystarczy tak?
P-136939
Cansisti
» 2015-08-27 21:48:55
@up Chyba nie działa:

C/C++
int tab[ 3 ][ 5 ] = { { 2, 4, 8, 16, 32 }, { 3, 6, 12, 24, 48 }, { 5, 10, 20, 40, 80 } };
int * p;
p = & tab[ 0 ][ 0 ];

cout << *(( p + 2 ) + 5 );

Output: 12.

Bo *(( p + 2 ) + 5 ) wskazuje po prostu na 7 pozycję.
(Specjalnie dałem 5 co powinno wyjść poza zakres tablicy ale jak się okazuje tego nie robi...).

Czyli żeby odwołać się do elementu np [2][3] trzeba napisać *(p + 2*5 + 3 ).
P-136940
carlosmay
» 2015-08-27 22:07:09
cout << *(( p + 1 * 3 ) + 2 ) << endl;
 zapomniałem o mnożeniu przez szerokość tablicy przy przechodzeniu do następnych wierszy.

Przepraszam za wprowadzenie w błąd.
P-136944
Monika90
» 2015-08-27 22:36:09
Bo *(( p + 2 ) + 5 ) wskazuje po prostu na 7 pozycję.
Nie ma siódmej pozycji, tablica ma tylko 5 elementów.
P-136954
Frish
Temat założony przez niniejszego użytkownika
» 2015-08-28 00:25:06
To znaczy może nie mam takiej potrzeby tworzyć wskaźnik do wskaźnika ale chciałbym zrozumieć to jeżeli jest taka możliwość i jeżeli jest możliwe aby w taki sposób posługiwać się tablicami złożonymi to chciałem zobaczyć i zrozumieć jak to funkcjonuje. Dlatego też prosiłem o pomoc.:)
P-136963
Frish
Temat założony przez niniejszego użytkownika
» 2015-08-28 00:46:27
Czyli rozumiem z udzielonej pomocy że dostęp przez wskaźniki do rzeczonego elementu tablicy dwuwymiarowej będzie wyglądał w ten sposób?

C/C++
#include <iostream>

int main( void )
{
   
    int tab_w[ 3 ][ 5 ] = {
        { 2, 4, 8, 16, 32 },
        { 3, 6, 12, 24, 48 },
        { 5, 10, 20, 40, 80 }
    };
    int * wsk_tab_w = tab_w[ 0 ];
    int ** wsk_wsk_w = & wsk_tab_w;
   
    std::cout << "tab_w: " << tab_w[ 0 ][ 0 ] << std::endl;
    std::cout << "wsk_tab_w: " << *( wsk_tab_w + 2 ) << std::endl;
    std::cout << "wsk_wsk_w: " << *(( * wsk_wsk_w + 2 * 5 ) + 1 ) << std::endl << std::endl; //tutaj uzyskuje dostęp do elementu tab_w[3][2]?
   
}

w tym momencie jak opis wskazuje, prawidłowo wyłuskam element tab_w[3][2]?i jest to dopiero teraz właściwe i poprawnie skonstruowane?
P-136965
« 1 » 2
  Strona 1 z 2 Następna strona