Cześć
Przypomnij sobie co to jest wskaźnik, co on takiego przechowuje?
Przechowuje on adres, jakiejś zmiennej na którą wskazuje, np w Twoim przypadku bedzie to char.
Zapisujesz to sobie tak:
char* ptr_c=new char[10]{'M','i','c','r','o','s','o','f','t','\0'};
oznacza że gdzieś w pamięci będzie zaalokowany 10 elementowy blok pamięci, przy czym nie będzie to zorganizowane byle jak, jako że wskażnik ptr_c wskazuje na typ char, każdy element zajmuje w tej pamięci jeden bajt, przy okazji jest to tablica więc elementy powinny być koło siebie (Ty nie musisz o to dbać, zadba o to środowisko na którym uruchamiasz program) .
Zatem po odpaleniu programu w Debugu widzisz coś takiego:
Jak widzisz ptr_c przechowuje adres POCZĄTKU BLOKU PAMIĘCI - czyli tablicy 10 elementowej.
Tereaz twój wybór należy jak wartość która jest pod adresem 0x1574dc0, może to być char, int, itp.
Ważna rzecz - gdy tworzysz wskaźnik, przypisujesz jakiś np. adres char * ptrc= &(jakiś adres);
Z koleji gdy chcesz odczytać wartość która kryje się pod tym adresem korzyszasz znowu z gwiazdki, tak zwana operacja dereferencji, często warto powiedzieć kompilatorowi jak ma być odczytana ta wartość (zinterpretowana) spójrz na Debug jeszcze raz pod *ptr_c kryje sie 77 lub 'M', a dlaczego tak? bo nazwa tablicy jest również wsaźnikiem na jej pierwszy element.
Po tym bloku elementów czyli tablicy możesz się poruszać poprzez skok w pamięci :
//Jak wyswietlic piaty element?
std::cout<<*(ptr_c+5)<<std::endl;
ptr_c+5 oznacza daj mi adres początka bloku elementów i powiększ go o pięć -> czyli bedzie wskazywał na 5 element, teraz żeby otrzymać wartość, która się kryje pod tym adresem musisz skorzystać z dereferencji.
*(adres) - żeby nie gmatwać podczas wykonywania tej operacji std::cout<< następuje przeciązenie operatora i niejawne rzutowanie na typ (char).
Całość Twojego zadania może wyglądać tak:
char* ptr_c=new char[10]{'M','i','c','r','o','s','o','f','t','\0'};
int* ptr_i =new int[3]{1,2,3};
//Jak wyswietlic piaty element?
std::cout<<*(ptr_c+5)<<std::endl;
//Jak wyświetlić calosc
std::cout<<ptr_c<<std::endl;
//Albo po staremu w C
printf("Po staremu : %c\n", *(ptr_c+5));
//Calosc po staremu
printf("Po staremu calosc");
for(unsigned int i=0; i<10; i++){
printf("%c", *(ptr_c+i) );
}
printf("\n");
printf("LUB : %s \n", (const char*) ptr_c );
for(unsigned int i=0;i<3;i++){
std::cout<<ptr_i[i]<<std::endl;
}
na końcu bardzo ważne jest żeby usunąć dane:
delete[] ptr_c, ptr_i;
jako że użyłem w przykładzie new - czyli dynamicznej alokacji pamięci - podczas działania programu został przydzielony blok elementów, to należy zawsze zwolnić pamięć żeby ustrzec się przed "memory leakiem"