różnice między cout<<&char i cout<<char

0

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?

3

Ponieważ próbujesz wyświetlić char*, czyli ciąg znaków, którego koniec właśnie jest wyznaczony przez bajt zerowy.

2

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

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?

1
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.

0

Czyli to a jest wskaźnikiem, *a tak nazwać nie można?

1

a jest zmienną będącą wskaźnikiem na char, podczas gdy *a to wyłuskana wartość będąca zwykłym charem.

0

Dzięki ;)

0

jak chcesz mieć adres zmiennej typu char to:

std::cout << (void*)&a;
2

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;
0
Azarien napisał(a):

*a jest typu char

niet

[ @Elles`w ] { char *a; cout << is_reference<decltype(*a)>::value; }
[ gcc ] true
0

@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.

0

@Patryk27

[ @Elles`w ] { char *a; cout << is_same<decltype(*a),char>::value; }
[ gcc ] false
0

Ach, teraz widzę - no tak, chcąc być w stu procentach poprawnym, *a to char& - o to Ci chodzi, jak mniemam?

2

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).

1

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

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