Wskaźniki, co i jak

0

Witam. Postanowiłem napisać tutaj bo byś może dostanę jakąś konkretną odpowiedź która rozjaśni mi umysł. Przygotowałem sobie taki program poglądowy by ułożyć sobie zasadę działania wskaźników.

 int main() {
	static int** tablica2d = stworz_tablice(n, m);
	tablica2d[0][0]=1;
	tablica2d[0][1]=2;
	cout << tablica2d << endl;
	cout << *tablica2d << endl;
	cout << *tablica2d[0] << endl;
	cout << **tablica2d << endl;
	cout << tablica2d[0][0] << endl;
	cout << **tablica2d+1 << endl;
}



int** stworz_tablice(int n, int m) {
	int **tablica = new int *[n];
		for (int i = 0; i < n; ++i)
  			tablica[i] = new int [m];
  		return tablica;
}

Niejasne jest dla mnie dlaczego do wskaźnika można odnosić się też poprzez nawiasy kwadratowe, czyli *tablica2d[0]==**tablica2d==tablica2d[0][0] (bo te wartości są równe). Czy można powiedzieć, że nawias kwadratowy jest czymś w postaci wyłuskania? *tablica2d[0] - wydawało mi się że przez taki zapis uzyskam adres zerowej (pierwszej) komórki tablicy. Nie wiem jak się w tym wszystkim odnaleźć.

2

Nawiasy kwadratowe to to samo co dodanie do wskaźnika indeksu i wyłuskanie.
Czyli:

 tablica2d[0][0] == *( (*(tablica2d + 0)) + 0)

Poprawiony kod:

#include <iostream>
using namespace std;

int** stworz_tablice(int n, int m) 
{
    int **tablica = new int*[n];
    
    for (int i = 0; i < n; ++i)
        tablica[i] = new int [m];
              
    return tablica;
}

int main() 
{
    int m=5, n=5;
    static int** tablica2d = stworz_tablice(n, m);
    
    tablica2d[0][0]=1;
    tablica2d[0][1]=2;
    
    cout << tablica2d << endl;
    cout << *tablica2d << endl;
    cout << *tablica2d[0] << endl;
    cout << **tablica2d << endl;
    cout << tablica2d[0][0] << endl;
    cout << **tablica2d+1 << endl;
    
    cout << "Sposób @bajos: " << *( (*(tablica2d + 0)) + 0) << endl;
    
    for(int it=0; it<n; ++it) delete [] tablica2d[it]; 
    delete [] tablica2d;

    return 0;
}

http://ideone.com/BQNshN

5

Każda zmienna w C/C++ musi być zadeklarowana przed pierwszym użyciem, w main() próbujesz użyć niezadeklarowanych: n, m

Co do samego pytanie, następujące wyrażenia:

  • tab[i]
  • *(tab+i)
  • *(i+tab)
  • i[tab]
    są jednym i tym samym
1
bajos napisał(a):

Nawiasy kwadratowe to to samo co dodanie do wskaźnika indeksu i wyłuskanie.
Czyli:

 tablica2d[0][0] == *( (*(tablica2d + 0)) + 0)

Aha, dziękuje :) Mam jeszcze jedno pytanie odnoście dynamicznej alokacji pamięci, chcę wiedzieć, czy wszystko dobrze rozumuje. Tworze tutaj wskaźnik na wskaźnika na inta i do niego tworzę "n" obiektów typu wskaźnik do inta. I do każdego z tych obiektów przypisuję "m" obiektów typu int?

0
_13th_Dragon napisał(a):

Każda zmienna w C/C++ musi być zadeklarowana przed pierwszym użyciem, w main() próbujesz użyć niezadeklarowanych: n, m

Co do samego pytanie, następujące wyrażenia:

  • tab[i]
  • *(tab+i)
  • *(i+tab)
  • i[tab]
    są jednym i tym samym

Dziękuje za odpowiedź. Tak wiem, zmienne są normalnie zadeklarowane, lecz nie dawałem całego kodu.

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