Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[C++] Dynamiczne przydzielanie pamięci podstawy

Ostatnio zmodyfikowano 2014-01-10 18:42
Autor Wiadomość
natoll112
Temat założony przez niniejszego użytkownika
[C++] Dynamiczne przydzielanie pamięci podstawy
» 2014-01-10 17:18:04
Witam, jestem mega początkującym programistą, aktualnie staram się zgłębić wszelakie tajniki wskaźników, mam jednak kilka pytań dotyczących dynamicznego przydzielania pamięci.
 
załóżmy że chcę stworzyć dynamiczną tablicę:

C/C++
int n;
char * wsk;
wsk = new char[ n ];

n = 10;
wsk = "teeeeeekst";

cout << "tablica przechowuje napis: " << wsk << endl;

to się kompiluje i działa tak jak bym tego chciał. Jednak przypisując wartość do wskaźnika powinno się używać przed nim operatora (*), prawda?


Nie rozumiem czemu w tej sytuacji:

C/C++
float * wsk;
wsk = new float;
* wsk = 10.5;

cout << "tablica przechowuje liczbe:" << * wsk << endl;

muszę już uzyć operatora gwiazdki? (*wsk = 10.5, rozumiem ze gdyby tej gwiazdki tam nie było to podawalibyśmy numer komórki pamięci na którą chcemy wstawić wskaźnik, dlaczego jednak w poprzednim przykładzie gdy przypisywaliśmy tekst do wskaznika (wsk = "teeeeeekst") tej gwiazdki tam nie ma?)

To samo tyczy się wyjścia cout, czemu w pierwszym programie nie musiałem pisać gwiazdki a w drugim już tak, żeby kompilator mi to łyknął?
P-101770
Monika90
» 2014-01-10 18:42:38
wsk = "tekst";
To nie kopiuje tekstu do tablicy do której odnosi się wskaźnik wsk
To przypisuje wskaźnikowi adres pierwszego elementu tablicy, w której kompilator umieścił literał napisowy. Ten kod można przetłumaczyć na następujacy:
C/C++
const char globalna_tablica_znana_tylko_kompilatorowi[ 6 ] = { 't', 'e', 'k', 's', 't', '\0' };
wsk = & globalna_tablica_znana_tylko_kompilatorowi[ 0 ];

To samo tyczy się wyjścia cout, czemu w pierwszym programie nie musiałem pisać gwiazdki a w drugim już tak, żeby kompilator mi to łyknął?
Dlatego, że operator << jest przeciążony dla wskaźników
char *
, a nie jest przeciążony dla wskaźników
float *
. Te pierwsze traktowane są jako wskaźniki do pierwszego elementu tablicy znaków zakonczonych zerem - czyli drukowany jest napis zawarty w tablicy.
P-101782
« 1 »
  Strona 1 z 1