Wskaźniki, co i jak

Wskaźniki, co i jak
AL
  • Rejestracja:około 9 lat
  • Ostatnio:prawie 7 lat
  • Postów:5
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.

Kopiuj
 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źć.

bajos
  • Rejestracja:prawie 12 lat
  • Ostatnio:prawie 2 lata
  • Lokalizacja:UwUdź
  • Postów:267
2

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

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

Poprawiony kod:

Kopiuj
#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


128 postów [25.06.2015r. 21:03]
edytowany 2x, ostatnio: bajos
kaczus
Jak już poprawiasz, to dodaj jeszcze czyszczenie pamięci - memleak jest
bajos
@kaczus, poprawiłem, z telefonu to nie wiem czy dobrze.
_13th_Dragon
  • Rejestracja:ponad 19 lat
  • Ostatnio:3 dni
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

Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.
edytowany 1x, ostatnio: _13th_Dragon
AL
  • Rejestracja:około 9 lat
  • Ostatnio:prawie 7 lat
  • Postów:5
1
bajos napisał(a):

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

Kopiuj
 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?

bajos
Dokładnie tak.
AL
  • Rejestracja:około 9 lat
  • Ostatnio:prawie 7 lat
  • Postów:5
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.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.