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

Wskaźniki z dwoma gwiazdkami

Ostatnio zmodyfikowano 2014-03-12 11:27
Autor Wiadomość
mateuszq
Temat założony przez niniejszego użytkownika
Wskaźniki z dwoma gwiazdkami
» 2014-03-10 18:18:50
Witam, Poniżej wrzucam program na dodawanie macierzy. Mam problem z jego zrozumieniem a mianowicie chodzi mi o deklaracje zmiennych **A **B i **C rozumiem, że są to wskaźniki (gdzies znalazlem ze wskaźnik do wskaźnika) ale o co chodzi z tym chodzi w czym to nam pomaga? Szukałem sporo w internecie ale nic satysfakcjonującego nie znalazłem w książkach również za dużo na ten temat nie ma.

Proszę o jakies jasne wytlumaczenie tego problemu.

C/C++
#include <iostream>
#include <iomanip>
#include <cstdlib>
#include <time.h>

using namespace std;

int main()
{
    int ** A, ** B, ** C, n, m, iw, ik;
   
    srand(( unsigned ) time( NULL ) );
   
    // losujemy wymiary macierzy
   
    m = rand() % 5 + 2;
    n = rand() % 5 + 2;
   
    // tworzymy tablicę wskaźników
   
    A = new int *[ m ];
    B = new int *[ m ];
    C = new int *[ m ];
   
    // tworzymy tablice wierszy
   
    for( iw = 0; iw < m; iw++ )
    {
        A[ iw ] = new int[ n ];
        B[ iw ] = new int[ n ];
        C[ iw ] = new int[ n ];
    }
   
    // wypełniamy macierze A i B losowymi liczbami
   
    for( iw = 0; iw < m; iw++ )
    for( ik = 0; ik < n; ik++ )
    {
        A[ iw ][ ik ] = rand() % 100;
        B[ iw ][ ik ] = rand() % 100;
    }
   
    // wyświetlamy macierze A i B
   
    cout << "m = " << m << endl
    << "n = " << n << endl << endl
    << "Matrix A:" << endl;
   
    for( iw = 0; iw < m; iw++ )
    {
        for( ik = 0; ik < n; ik++ )
             cout << setw( 5 ) << A[ iw ][ ik ];
       
        cout << endl;
    }
   
    cout << endl << "Matrix B:" << endl;
   
    for( iw = 0; iw < m; iw++ )
    {
        for( ik = 0; ik < n; ik++ )
             cout << setw( 5 ) << B[ iw ][ ik ];
       
        cout << endl;
    }
   
    // sumujemy macierz A i B w C
   
    for( iw = 0; iw < m; iw++ )
    for( ik = 0; ik < n; ik++ )
         C[ iw ][ ik ] = A[ iw ][ ik ] + B[ iw ][ ik ];
   
    // wyświetlamy macierz wynikową
   
    cout << endl << "Matrix C = A + B:" << endl;
   
    for( iw = 0; iw < m; iw++ )
    {
        for( ik = 0; ik < n; ik++ )
             cout << setw( 5 ) << C[ iw ][ ik ];
       
        cout << endl;
    }
   
    // koniec, zwalniamy pamięć zajętą przez macierze
   
    for( iw = 0; iw < m; iw++ )
    {
        delete[] A[ iw ];
        delete[] B[ iw ];
        delete[] C[ iw ];
    }
    delete[] A;
    delete[] B;
    delete[] C;
   
    return 0;
}
P-106026
pekfos
» 2014-03-10 18:30:09
To wskaźnik na wskaźnik.
P-106028
mateuszq
Temat założony przez niniejszego użytkownika
» 2014-03-10 18:38:46
To juz sam wywnioskowałem o czym napisalem w powyższym poscie. Chodzi mi bardziej to dlaczego został zastosowany w tym programie, co miało na celu użycie podwojnego wskaznika? Domyslam sie że ma to cos wspolnego z dwuelementową tablicą, czy chodzi tu o to, że ze względu na to że nie możemy utworzyc dynamicznej tablicy bez podania wartosci drugiego elementu?
P-106029
pekfos
» 2014-03-10 18:49:00
?

Widać w kodzie, po co to jest użyte. Alokujesz m wskaźników i do każdego n elementów, czyli dynamicznie alokowaną tablicę dwuwymiarową. Co tu niejasnego?
P-106031
mateuszq
Temat założony przez niniejszego użytkownika
» 2014-03-10 19:01:09
jestem jeszcze początkujący więc moze poprostu mam problem ze zrozumieniem tego. Czy analogicznie moge robic z tablicami wielowymiarowymi? dac np ***A? Dziwi mnie to, że w ksiązkach nie ma nic na ten temat.
P-106032
pekfos
» 2014-03-10 19:09:28
Można.
P-106034
mateuszq
Temat założony przez niniejszego użytkownika
» 2014-03-11 11:40:42
Napisalem funkcje która tworzy macierz nxn, w jaki sposob zwrocic ten podwojny wskaznik? zrobilem w ten sposob ale jest to błędne.

C/C++
#include<iostream>
#include<cstdlib>
#include<conio.h>
#include<ctime>

using namespace std;

int ** generuj( int & n ) {
   
    cout << "podaj stopien macierzy: ";
    cin >> n;
    int *( * tab );
    tab = new int *[ n ];
    for( int k = 0; k < n; k++ ) {
        tab[ k ] = new int[ n ];
    }
    for( int i = 0; i < n; i++ ) {
        for( int j = 0; j < n; j++ ) {
            tab[ i ][ j ] = rand() % 100;
        }
    }
   
    return tab;
}

int main() {
    int n = 0;
    int *( * m1 );
   
    ** m1 = generuj( n );
   
   
   
   
    _getch();
    return 0;
}
P-106094
mateuszq
Temat założony przez niniejszego użytkownika
» 2014-03-11 12:36:03
Udało mi sie to zrobić w taki sposób, czy jest to prawidłowe?
C/C++
#include<iostream>
#include<cstdlib>
#include<conio.h>
#include<ctime>

using namespace std;

int ** generuj( int & n ) {
   
    cout << "podaj stopien macierzy: ";
    cin >> n;
    int *( * tab );
    tab = new int *[ n ];
    for( int k = 0; k < n; k++ ) {
        tab[ k ] = new int[ n ];
    }
    for( int i = 0; i < n; i++ ) {
        for( int j = 0; j < n; j++ ) {
            tab[ i ][ j ] = rand() % 100;
        }
    }
   
    return tab;
}

void wypisz( int n, int ** tab ) {
   
    for( int i = 0; i < n; i++ ) {
        cout << endl;
        for( int j = 0; j < n; j++ ) {
            cout << tab[ i ][ j ] << " ";
        }
    }
}

int main() {
    int n = 0;
    int *( * m1 );
   
    m1 = generuj( n );
    wypisz( n, m1 );
   
   
   
   
    _getch();
    return 0;
}
P-106095
« 1 » 2 3
  Strona 1 z 3 Następna strona