Co wypisuje ten program?

0

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?

1

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
3

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.

1

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.

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0