Taki kod
#include <iostream>
int main()
{
char *cptr = "abc...";
std::cout<<cptr<<' '<<&cptr<<' '<<(int*)cptr;
}
Najpierw jest wypisywany tekst. A potem adres wskaźnika czy adres tego na co wskazuje wskaźnik?
Najpierw adres zmiennej typu wskażnik na stosie a potem adres gdzie zaczyna się łańcuch znakowy.
Zrob takei cos
#include <iostream>
int main()
{
char *cptr = "abc...";
char *cptr2 = "abc...";
std::cout<<cptr<<' '<<&cptr<<' '<<(int*)cptr << std::endl;
std::cout<<cptr2<<' '<<&cptr2<<' '<<(int*)cptr2 << std::endl;
}
U mnie daje to:
abc... 0x7ffc9a82f3a0 0x400ac4
abc... 0x7ffc9a82f3a8 0x400ac4
Ten kod nie jest poprawnym kodem C++ i się nie kompiluje (ew. nie powinien się kompilować w żadnym kompilatorze zgodnym ze standardem). Literał znakowy możesz użyć do inicjalizacji tablicy znaków lub wskaźnika na const char
.
Kompiluje się (g++ 4.8.4, clang++ 3.4). Ale są warningi. owszem nie jest poprawny ;)
ptr.cpp: In function ‘int main()’:
ptr.cpp:6:18: warning: deprecated conversion from string constant to ‘char*’ [-Wwrite-strings]
char cptr = "abc...";
^
ptr.cpp:7:19: warning: deprecated conversion from string constant to ‘char’ [-Wwrite-strings]
char *cptr2 = "abc..."
Jakby kompilator aż tak się trzymał standardu to 80% codebasu aktualnie by się nie kompilowała.
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.