• 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

Object Storage Arubacloud
0 głosów
935 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ź 538 wizyt
pytanie zadane 24 września 2017 w C i C++ przez Sic Dyskutant (8,510 p.)
0 głosów
2 odpowiedzi 817 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 329 wizyt
pytanie zadane 8 lipca 2018 w C i C++ przez niezalogowany

92,576 zapytań

141,426 odpowiedzi

319,652 komentarzy

61,961 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.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...