Mam pytanie w temacie wskaźników. Mianowicie, dlaczego program
char a='a';
cout<<a
wyświetli tylko 'a'. Natomiast
char a='a';
cout<<&a
wyświetli a i ciąg krzaczków do napotkania bajtu zerowego?
Mam pytanie w temacie wskaźników. Mianowicie, dlaczego program
char a='a';
cout<<a
wyświetli tylko 'a'. Natomiast
char a='a';
cout<<&a
wyświetli a i ciąg krzaczków do napotkania bajtu zerowego?
Ponieważ próbujesz wyświetlić char*
, czyli ciąg znaków, którego koniec właśnie jest wyznaczony przez bajt zerowy.
Bo &a to jest char* a strumień cout przy próbie wypisania char* traktuje to jako C-stringa czyli jako ciąg bajtów zakończonych \0
Dzięki za rozjaśnienie sytuacji. Mam jeszcze jedno pytanie - semantyczne
char *a
Czy można powiedzieć, że a jest adresem *a? I w takim razie czy wskaźnikiem jest *a czy a? Jak w takim razie nazwać to drugie?
char* a;
a wskazuje na znak, pod jakimś-tam adresem. Czyli to a jest wskaźnikiem na wartość, która kryje się pod tym, w tym przykładzie nie określonym, adresem.
Możesz to sobie nazwać wartością, znakiem itp.
Czyli to a jest wskaźnikiem, *a tak nazwać nie można?
a
jest zmienną będącą wskaźnikiem na char
, podczas gdy *a
to wyłuskana wartość będąca zwykłym char
em.
Dzięki ;)
jak chcesz mieć adres zmiennej typu char to:
std::cout << (void*)&a;
Czy można powiedzieć, że a jest adresem *a? I w takim razie czy wskaźnikiem jest *a czy a? Jak w takim razie nazwać to drugie?
char *a
a
jest typu char*
*a
jest typu char
spacje można stawiać w dowolnych miejscach:
char *a; // to podkreśla że *a jest char
char* a; // to podkreśla, że a jest char*
char * a;
char*a;
Azarien napisał(a):
*a
jest typuchar
niet
[ @Elles`w ] { char *a; cout << is_reference<decltype(*a)>::value; }
[ gcc ] true
@gośćabc: *a
to lvalue reference
typu char
.
Zgodnie z dokumentacją dla is_reference
:
If T is a reference type (lvalue reference or rvalue reference), provides the member constant value equal true. For any other type, value is false.
[ @Elles`w ] { char *a; cout << is_same<decltype(*a),char>::value; }
[ gcc ] false
Ach, teraz widzę - no tak, chcąc być w stu procentach poprawnym, *a
to char&
- o to Ci chodzi, jak mniemam?
Ale głupoty opowiadasz @gośćabc. Oczywiście, że dereferencja wskaźnika produkuje l-wartość typu, na jaki pokazuje wskaźnik. Nie ma żadnej referencji. Referencja bierze się z tego, jak działa decltype
: podajesz do decltype
wyrażenie będące l-wartością typu char
więc dostajesz referencję do l-wartości typu char
(C++11: 7.1.6.2.4).
The unary * operator performs indirection : the expression to which it is applied shall be a pointer to an
object type, or a pointer to a function type and the result is an lvalue referring to the object or function
to which the expression points. If the type of the expression is “pointer to T,” the type of the result is “T.”
wychodzi na to, że referring mnie zgubiło
nie będę dyskutował ze standardem *a to char a nie char&, true