• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Wskaźnik do tablicy wskaźników i ich adresy

0 głosów
1,516 wizyt
pytanie zadane 2 listopada 2017 w C i C++ przez Kamil Duljas Użytkownik (990 p.)

Witam, 

Pytanie techniczne:

Mam wskaźnik na tablicę wskaźników i za jego pomocą chcę sprawdzić adresy komórek więc tak:

char **wsk = new char* [10];

cout<<wsk; // tutaj otrzymam adres wskaźnika wsk
cout<<wsk[0]; //tutaj adres zerowego wskaźnika z tablicy wskaźników

cout<<wsk[0][5]; // jak otrzymać adres tego elementu?

Rozumiem że wskaźnik pokazuje na jakieś miejsce w pamięci i inicjalizuje sobie np. wsk[0][5] = 'A';

Jak odczytać adres takiej komórki i czy to jest możliwe?

komentarz 2 listopada 2017 przez Ditrix Mądrala (5,650 p.)
wsk[0][5] to tablica dwuelementowa. Ty zrobiłeś jednoelementową. Jak się mylę, niech ktoś mnie poprawi ^^
komentarz 2 listopada 2017 przez Knayder Nałogowiec (37,640 p.)
Zgaduję że on po prostu nie wstawił całego kodu alokacji :\
komentarz 3 listopada 2017 przez Kamil Duljas Użytkownik (990 p.)
Racja, nie wstawiłem alokacji kolejnej tablicy, weźmy np:

wsk[0] = new char [20];

teraz próba wstawienia do elementu  wsk[0][5] = 'A';

i teraz jak uzyskać adres tego elementu?

1 odpowiedź

0 głosów
odpowiedź 2 listopada 2017 przez Knayder Nałogowiec (37,640 p.)
wybrane 3 listopada 2017 przez Kamil Duljas
 
Najlepsza
wsk[0] + 5;

&(wsk[0][5]);
komentarz 3 listopada 2017 przez Kamil Duljas Użytkownik (990 p.)
#include <iostream>

int main()
{
   char **wsk = new char* [10];

   wsk[0]= new char [20];
   wsk[0][5]= 'A';

   std::cout<<&(wsk[0][5]);
}

Właśnie chodzi mi o to, że program nie wyświetla adresu tylko literę 'A';

Co więcej, uzyskanie adresu w takim kodzie:


#include <iostream>

int main()
{
   char **wsk = new char* [10];

   wsk[0]= new char [20];
   wsk[0][0]= 'A';
   wsk[0][1]= 'L';
   wsk[0][2]= 'E';
   wsk[0][3]= 'R';
   wsk[0][4]= 'T';

   std::cout<<&(wsk[0][0]);

}

Daje cały napis "ALERT".

Natomiast metoda typu wsk[0]+n powoduje to samo co metoda z & - wypisuje całość od n elementu

komentarz 3 listopada 2017 przez Knayder Nałogowiec (37,640 p.)
edycja 3 listopada 2017 przez Knayder
Wynika to ze specyfiki couta.
W c, nie było klasy string, więc każdy tekst, trzymany był w tablicy charów (char* właśnie). Żeby zachować kompatybilność wsteczną, w klasie std::ostream (Czyli klasie obiektu globalnego std::cout), zastosowano przeładowanie dla operatora << i wskaźnika na char.

W skrócie, jeżeli wyślesz wskaźnik typu char do couta, to on wklei cały tekst.

Tutaj masz mały program, pokazujący to zjawisko:
https://repl.it/L6R8/14
Na tej stronie, jak naciśniesz "Run", to program się skompiluje.

Ps. jeżeli w tym swoim kodzie, dasz tablicę intów, zamiast charów, to wszystko będzie działać tak jak to sobie wyobrażasz.
komentarz 3 listopada 2017 przez Knayder Nałogowiec (37,640 p.)

W tych linijkach
 

reinterpret_cast<void*>(wsk[0]+5);
reinterpret_cast<void*>(&(wsk[0][5]));
(void*)(wsk[0]+5);
(void*)(&(wsk[0][5]));

Chodzi o to, żeby zamienić typ adresu, z char*, na jakiś, który nie będzie interpretowany inaczej przez std::cout. Mógłby to być np. int*:
 

std::cout << "C++ style: " << reinterpret_cast<int*>(wsk[0]+5)

Wtedy też by działało.

komentarz 3 listopada 2017 przez Knayder Nałogowiec (37,640 p.)
Oczywiście nigdy nie zapisuj tak tablic charów, bo jak będziesz chciał to wyświetlić, to nie będzie na końcu znaku \0, który w C oznaczał koniec ciągu znaków. Program sam ci go wrzuci, jak zrobisz tak: const char* word = "Hello World!";
komentarz 3 listopada 2017 przez Knayder Nałogowiec (37,640 p.)
Ale jako że pracujemy w C++, to używaj std::string :)
komentarz 3 listopada 2017 przez Kamil Duljas Użytkownik (990 p.)
Używam tablic charów tylko ze względu na trening wskaźników i to było meritum :)

Wszystko jasne :)

Dziękuję :)
komentarz 3 listopada 2017 przez Knayder Nałogowiec (37,640 p.)
To oznacz najlpszą odpowiedź ;)
komentarz 3 listopada 2017 przez Kamil Duljas Użytkownik (990 p.)
Ten jaki karierowicz :D

Podobne pytania

–1 głos
1 odpowiedź 665 wizyt
pytanie zadane 24 września 2017 w C i C++ przez Sic Dyskutant (8,510 p.)
0 głosów
2 odpowiedzi 1,149 wizyt
pytanie zadane 30 października 2018 w C i C++ przez Alan Kruszyński Obywatel (1,410 p.)
0 głosów
0 odpowiedzi 423 wizyt
pytanie zadane 8 lipca 2018 w C i C++ przez niezalogowany

93,691 zapytań

142,610 odpowiedzi

323,216 komentarzy

63,218 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj

Twierdza Linux. Bezpieczeństwo dla dociekliwych

Aby uzyskać rabat -10%, użyjcie kodu pasja-linux, wpisując go w specjalne pole w koszyku.

...